Linux Docker 容器安装与优化

12次阅读

根本原因是当前用户未加入 docker 用户组;需执行 sudo usermod -ag docker $user 后完全退出重登,再运行 docker run –rm hello-world 验证是否生效。

Linux Docker 容器安装与优化

docker run 启动容器时权限被拒怎么办

根本原因不是 Docker 没装好,而是当前用户没加进 docker 用户组。直接用 sudo docker run 能跑,但长期这么干等于把 root 权限当普通命令使,后续挂载目录、读写宿主机文件、调试网络都会出连锁问题。

  • 执行 sudo usermod -aG docker $USER,然后完全退出终端重登(不是新开个 tab)
  • 验证:运行 docker run --rm hello-world,不报 Permission denied while trying to connect to the Docker daemon socket 就算生效
  • 别在 CI/CD 或生产脚本里硬写 sudo docker —— 容器编排工具(如 Compose)默认也不认 sudo,会直接失败

alpine 镜像里找不到 curl、ping 怎么办

Alpine 用的是 musl libc 而非 glibc,包管理器是 apk,不是 aptyum。硬套 Ubuntu/CentOS 的安装逻辑,结果就是 command not found 一串。

  • 装基础网络工具:apk add --no-cache curl bash bind-toolsbind-tools 包含 dignslookup,比单独装 ping 更实用)
  • 别用 apk search 猜包名 —— Alpine 的包名常带版本号或前缀,比如 curl 就是 curl,但 jqjq,而 python3python3,没后缀反而错
  • 如果只是临时调试,用 docker exec -it <container> sh</container> 进去再装,但上线镜像必须把 apk add 写进 Dockerfile,否则重启就丢

容器启动后立刻退出,日志显示“No such file or directory”

十有八九是 ENTRYPOINTCMD 里写的路径不存在,或者用了绝对路径但镜像里压根没那个二进制。Alpine 和 Debian 镜像的 /bin/sh 路径一致,但某些精简镜像只留 /bin/ash,硬写 /bin/bash 必跪。

  • 先查镜像默认 shell:docker inspect <image> | jq '.[0].Config.Shell'</image>,没 jq 就看 docker image inspect <image> | grep -A 5 Shell</image>
  • 启动时加 -it--entrypoint sh 手动进去,用 ls -l /bin 确认可用 shell
  • Dockerfile 时,CMD ["app"] 是 exec 模式,要求 app$PATH;如果写成 CMD ["sh", "-c", "app"],就绕过 PATH 查找,但得确保 sh 存在

docker build 缓存失效太频繁,怎么稳住

缓存不是按行失效,而是从 FROM 开始,只要某一层的指令结果变了(哪怕只是 apt update 时间戳不同),它和它之后所有层全重算。最常见陷阱是把 COPY . . 放太前,导致改一行代码就清空整个依赖层。

  • 依赖优先:Node.js 项目先 COPY package*.json .,再 RUN npm ci;Python 先 COPY requirements.txt .,再 pip install
  • 避免 RUN apt update && apt install 连写 —— apt update 每次都变,缓存必然断。改成 RUN apt-get update && apt-get install -y xxx && rm -rf /var/lib/apt/lists/* 一行搞定
  • 本地构建时加 --cache-from 拉远端镜像当缓存源,CI 里记得开 cache_fromcache_to(BuildKit 模式下)

缓存策略看着琐碎,但一旦跑顺,构建时间能从 5 分钟压到 20 秒。真正卡住人的,往往不是语法,而是哪一行悄悄触发了整条链重算。

text=ZqhQzanResources