Ubuntu 安装 Docker:官方源安装 + 国内加速 + 免 sudo 全流程

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 连通性检测

还有 65 个免费在线工具

纯前端实现,不用注册,数据不上传服务器。

浏览全部工具