Ubuntu 自带的 docker.io 包版本老、更新慢,生产环境一律建议走 Docker 官方 apt 源。这篇按「卸旧 → 装官方源 → 配加速 → 免 sudo → 验证」的顺序走完,最后附上最常见的几个报错。
一、先卸掉旧版本(新机器跳过)
for p in docker.io docker-doc docker-compose podman-docker containerd runc; do
sudo apt-get remove -y $p 2>/dev/null
done
旧的 docker-compose(带横线的 v1)也顺手删掉,后面统一用 v2 插件。
二、添加官方 apt 源并安装
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
国内服务器连 download.docker.com 超时的话,把源里的域名换成 mirrors.aliyun.com/docker-ce,其余步骤完全一致(GPG 地址同样换)。
装完确认服务在跑:
sudo systemctl enable --now docker
sudo systemctl status docker --no-pager | head -5
三、配置镜像加速器(国内必做)
不配加速,docker pull 大概率卡在 Pulling fs layer 不动。编辑 /etc/docker/daemon.json:
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.net"
],
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}
两个细节值得说:
log-opts一定在拉第一个镜像之前配。容器日志默认不限大小,跑几个月把磁盘写满是新手服务器最常见的死法之一;这个参数只对之后新建的容器生效。- 加速器地址时效性强,失效了就换,改完
sudo systemctl restart docker生效。docker info | grep -A 5 "Registry Mirrors"可以验证。
四、免 sudo 使用
sudo usermod -aG docker $USER
退出重新登录(或 newgrp docker)后,docker ps 不带 sudo 直接跑就成功了。别图省事给 /var/run/docker.sock 做 chmod 666——那等于把 root 权限开放给所有用户。
五、验证
docker run --rm hello-world
docker compose version # v2 插件,不再需要横线
docker version --format '{{.Server.Version}}'
六、高频报错对照
| 报错 | 原因 | 解法 |
|---|---|---|
GPG error: NO_PUBKEY |
keyrings 里的 gpg 没生成或没权限 | 重跑第二步的 gpg 两行,确认 chmod a+r |
Unable to locate package docker-ce |
源里的 $VERSION_CODENAME 为空 |
手动把 codename 写死,如 jammy / noble |
permission denied ... docker.sock |
用户不在 docker 组 | 第四节的 usermod,重登生效 |
iptables: No chain/target/match |
自定义防火墙和 Docker 冲突 | update-alternatives --set iptables /usr/sbin/iptables-legacy 后重启 |
pull 卡住最后 timeout |
没配加速或加速器失效 | 第三节,换可用的镜像地址 |
七、和裸机装比,什么该进容器
容器里适合:MySQL、Redis、ES 这类标准服务(见本站 Docker 安装 MySQL / Redis / ES 三篇);不适合:需要改内核参数的东西、和系统深度耦合的服务。装完 Docker 之后,docker compose 一份 YAML 把整套环境描述清楚,换机器就是复制文件 + up -d,这是比装法本身更值钱的习惯。
相关工具:Docker 命令速查 · Linux 命令速查 · SSH 连通性检测