不推荐 apt install docker.io 是因系统源版本过旧(如 ubuntu 22.04 为 20.10),存在安全漏洞、缺失新特性且兼容性差;官方明确要求使用其 apt 仓库。

Ubuntu/Debian 上装 Docker 为什么 apt install docker.io 不推荐
因为系统源里的 docker.io 版本太旧(比如 Ubuntu 22.04 自带的是 20.10),缺新特性、有已知安全漏洞,且和官方文档、镜像仓库的兼容性差。Docker 官方明确要求用他们自己的 APT 仓库。
- 必须先卸载旧包:
sudo apt remove docker docker-engine docker.io containerd runc - 添加 GPG 密钥时别漏
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg -
docker-ce是社区版主包,docker-ce-cli和containerd.io必须同版本安装,否则systemctl start docker会失败并报failed to start daemon: failed to dial ... connection refused - 验证是否真跑起来了:
sudo docker run --rm hello-world—— 注意必须加sudo,普通用户默认没权限
怎么让普通用户不用 sudo 就能跑 docker
本质是把用户加进 docker 用户组,但直接 sudo usermod -aG docker $USER 后不生效,是因为组权限不会自动刷新到当前 shell。
- 执行完
usermod后必须完全退出终端重登,或运行newgrp docker(仅对当前 shell 临时生效) - 如果仍提示
Permission denied while trying to connect to the Docker daemon socket,检查/var/run/docker.sock权限是否为srw-rw---- 1 root docker - 不要手动改
/var/run/docker.sock的 owner 或 chmod,那会破坏 systemd socket 激活机制 - 重启
docker服务不是必须操作,但加组后首次使用前建议执行一次sudo systemctl restart docker
CentOS/RHEL 8+ 装 Docker 为什么不能用 yum install docker
因为 RHEL 8+ 默认禁用了 legacy docker 包,系统自带的是 podman,而 docker 命令只是个兼容层 alias。真要 Docker CE,必须换源。
- 先关掉内置容器工具:
sudo dnf module reset container-tools,再禁用:sudo dnf module enable container-tools:stream-4.0(具体 stream 号查dnf module list container-tools) - 用官方 repo 替代:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo - 安装时指定版本避免冲突:
sudo dnf install docker-ce-24.0.7 docker-ce-cli-24.0.7 containerd.io(版本号务必一致) - 启动后检查
sudo systemctl status docker,常见错误是cgroup driver mismatch—— 这时要手动改/etc/docker/daemon.json加"exec-opts": ["native.cgroupdriver=systemd"]
docker run 启动就退出?90% 是因为没理解前台进程机制
Docker 容器生命周期绑定主进程(PID 1)。如果启动命令执行完就退出(比如 sh -c "echo hello"),容器立刻停。这不是 bug,是设计。
- 调试时想保持容器运行,用
sleep infinity或tail -f /dev/null占位,但仅限开发环境 - 正式镜像该用什么:Web 服务用
nginx -g "daemon off;",Python 用gunicorn --bind 0.0.0.0:8000 app:app,确保主进程不 daemonize - 别在
Dockerfile里写CMD service nginx start—— 这会 fork 出后台进程,主进程退出,容器死 - 查容器为啥退了:
docker logs <container-id></container-id>看输出,docker ps -a看 STATUS 列是不是Exited (0)或Exited (137)(OOM 被杀)
Docker 的核心约束很硬:socket 权限、cgroup 驱动、前台进程模型,绕不开也藏不住。配错一个点,表现可能完全不同,但原因其实就那几个。










