Ubuntu安装Docker(2026版)
前言:今天学习Docker的时候,想在Ubuntu里下载Docker,网上很多教程要么太老了,要么不能用,比如
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
这是官方的一键安装脚本 但是运行后却不能使用(下面有讲解,访问Docker官方需要挂梯子,或者访问镜像源) ,之后尝试了很久,报了各种各样的错误,于是决定写下这篇博客记录我在安装Docker中遇到的问题,并附上可用的Docker安装教程,希望对读者有用
Ubuntu 26.04 安装 Docker 实录:官方文档全部失效之后,这套方案跑通了
环境:Ubuntu 26.04 LTS(代号 resolute)、VMware 虚拟机、国内家庭宽带
结果:Docker 29.1.3 + Docker Compose v2,docker run hello-world正常输出
结论:在国内网络下,Docker 官方文档的三条路(官方 apt 源、get.docker.com脚本、直连 Docker Hub)全部走不通,必须换源 + 配镜像加速
TL;DR
如果只想复制粘贴,核心就三件事:用 Ubuntu 自己的源装docker.io、给 dockerd 配registry-mirrors、把自己加进docker组。三条命令:
sudoaptupdate&&sudoaptinstall-ydocker.io docker-compose-v2echo'{"registry-mirrors":["https://docker.m.daocloud.io","https://docker.1ms.run","https://docker.1panel.live"]}'|sudotee/etc/docker/daemon.jsonsudosystemctl restartdockersudodockerrun--rmhello-worldsudousermod-aGdocker$USER&&newgrpdocker下面是完整的踩坑过程和原因分析。
一、先说结论:官方安装方式为什么会失败
Docker 官方文档给的三条路,在国内网络下会遇到三个不同的问题,而且症状各不相同,很容易让人误判成"包名写错了"。
1.1 官方 apt 源:TLS 握手被重置
按官方文档添加download.docker.com源之后,sudo apt update报:
Err:1 https://download.docker.com/linux/ubuntu resolute InRelease SSL connection failed: error:0A000126:SSL routines::unexpected eof while reading Connection reset by peer [IP: 18.65.14.67 443] Warning: Failed to fetch https://download.docker.com/linux/ubuntu/dists/resolute/InRelease SSL connection failed: error:0A000126:SSL routines::unexpected eof while reading Connection reset by peer [IP: 18.65.14.67 443]18.65.14.67是 CloudFront 的边缘节点,说明连接在 TLS 阶段就被中断了。接着安装就变成:
Package docker-ce is not available, but is referred to by another package. Package docker-ce-cli is not available, but is referred to by another package. E: Package 'docker-ce' has no installation candidate E: Unable to locate package containerd.io E: Unable to locate package docker-compose-plugin关键理解:no installation candidate不是包名拼错,而是 apt 根本没拿到这个源的索引文件(InRelease)。源列表里有这一行,但索引是空的,所以所有属于该源的包都不存在候选版本。看到这个错误,先怀疑源,不要怀疑包名。
1.2get.docker.com一键脚本:同一个域名,同样打不通
很多人第一反应是换用官方一键脚本:
curl-fsSLhttps://get.docker.com-oget-docker.sh结果:
curl: (35) Recv failure: Connection reset by peer即使通过加速器把这个脚本下载下来,脚本内部依然会去访问download.docker.com装包,换汤不换药。这个脚本只适合网络通畅(挂梯子)的环境。
1.3 装好之后拉镜像:DNS 污染
用 Ubuntu 自带源装上docker.io之后,Docker 本体是能跑的(docker --version有输出),但拉镜像是另一条链路:
docker: Error response from daemon: failed to resolve reference "docker.io/library/hello-world:latest": failed to do request: Head "https://registry-1.docker.io/v2/library/hello-world/manifests/latest": dial tcp 199.16.156.103:443: connect: connection refused199.16.156.103是 Twitter 的 IP 段,registry-1.docker.io被解析到了这个错误地址。所以这不是"网速慢",而是请求根本没到 Docker Hub。改/etc/resolv.conf换 DNS 也没用,因为污染针对的是域名本身,正确解法是走 registry mirror。
1.4 还有一个坑:docker compose不存在
$ docker compose version docker: unknown command: docker composedocker.io这个包不包含compose 插件,需要单独装docker-compose-v2。这也是为什么有人装完发现docker能用但docker compose不能用。
二、可行方案:Ubuntu 源 + 镜像加速
2.1 先彻底清理残留
如果之前反复试过(装了一半又卸载),dpkg -l里会看到rc状态的包:
$ dpkg -l | grep -Ei 'docker|containerd' rc containerd 2.2.2-0ubuntu1.1 rc docker.io 29.1.3-0ubuntu4.1rc表示已卸载但配置文件残留。清理干净:
sudoaptpurge-ydocker.io containerdsudoaptautoremove-y# 删掉打不通的官方源和它的 GPG keysudorm-f/etc/apt/sources.list.d/docker.list /etc/apt/keyrings/docker.gpg这一步很重要:如果docker.list留着,每次apt update都会卡在超时上并打印 Warning,还会拖慢其他源的更新。
2.2 装 Docker 和 compose 插件
sudoaptupdatesudoaptinstall-ydocker.io docker-compose-v2这条命令的成功前提是:你的 Ubuntu 主源是通的(国内一般已经换成阿里云/清华镜像,apt update能看到"xxx packages can be upgraded"就说明通了)。装出来的是 Ubuntu 维护的版本,实测:
$docker--versionDocker version29.1.3, build29.1.3-0ubuntu4.1版本完全够用,且不需要碰download.docker.com和 GPG key。
如果docker-compose-v2提示找不到包,先确认包名:
aptsearchdocker-compose|grep-icomposeUbuntu 里通常叫docker-compose-v2;实在没有就装docker-compose(v1 独立命令),用法是docker-compose而不是docker compose。
2.3 验证安装(不需要联网)
docker--versiondockercompose versionsudosystemctl is-activedocker三条都要有正常输出。此时 Docker 已经可用,只是还拉不到镜像。
三、配置镜像加速(唯一需要外网的一步)
3.1 先探测哪个加速器活着
公共加速器失效非常频繁,网上抄来的地址大概率已经挂了。先批量探测,返回200或401的才可用:
formindocker.m.daocloud.io docker.1ms.run hub.rat.dev docker.xuanyuan.me docker.1panel.live;doecho"---$m"curl-sS-m8-o/dev/null-w"http=%{http_code}\n""https://$m/v2/"done本次实测结果:
| 地址 | 返回码 | 判断 |
|---|---|---|
docker.m.daocloud.io | 401 | 可用 |
docker.1ms.run | 401 | 可用 |
docker.1panel.live | 200 | 可用 |
docker.xuanyuan.me | 401 | 可用 |
hub.rat.dev | 302 | 有跳转,未采用 |
注意:401不是错误。它表示"该仓库需要认证",是 Docker Registry API 的正常响应,Docker 客户端会自己处理 token。
3.2 写入 daemon.json
建议用单行echo而不是 heredoc,避免复制粘贴时丢内容:
sudomkdir-p/etc/dockerecho'{"registry-mirrors":["https://docker.m.daocloud.io","https://docker.1ms.run","https://docker.1panel.live"]}'|sudotee/etc/docker/daemon.jsonsudosystemctl restartdocker确认配置真的被读进去了:
sudodockerinfo2>&1|grep-A4-imirror预期输出:
Registry Mirrors: https://docker.m.daocloud.io/ https://docker.1ms.run/ https://docker.1panel.live/只重启不看docker info是常见的坑:JSON 写错(少逗号、全角引号)会导致 dockerd 直接启动失败,这时docker info会报Cannot connect to the Docker daemon,用sudo journalctl -u docker -n 20能看到具体原因。
3.3 拉镜像并验证
sudotimeout120dockerpull hello-worldsudodockerrun--rmhello-world看到Hello from Docker!就说明镜像这条链路也通了。
四、免 sudo:newgrp也不一定在
sudousermod-aGdocker$USERnewgrpdocker在较新的 Ubuntu 上,newgrp被拆到了单独的包里:
Command 'newgrp' not found, but can be installed with: sudo apt install util-linux-extra三种解法:
方案 A:装包
sudoaptinstall-yutil-linux-extra newgrpdocker方案 B:开一个登录 shell(不装包)
sudosu- zeno# 换成你的用户名id-nG|grepdocker# 确认列表里有 docker方案 C:重启
sudoreboot原理:usermod修改的是/etc/group,只对新登录的会话生效。当前终端持的还是旧的身份,所以docker依然报:
permission denied while trying to connect to the docker API at unix:///var/run/docker.sock五、完整脚本(供参考)
# 1. 清理sudoaptpurge-ydocker.io containerdsudoaptautoremove-ysudorm-f/etc/apt/sources.list.d/docker.list /etc/apt/keyrings/docker.gpg# 2. 安装sudoaptupdatesudoaptinstall-ydocker.io docker-compose-v2# 3. 镜像加速sudomkdir-p/etc/dockerecho'{"registry-mirrors":["https://docker.m.daocloud.io","https://docker.1ms.run","https://docker.1panel.live"]}'|sudotee/etc/docker/daemon.jsonsudosystemctl restartdocker# 4. 验证sudodockerinfo|grep-A4-imirrorsudodockerrun--rmhello-world# 5. 免 sudosudousermod-aGdocker$USERsudoaptinstall-yutil-linux-extra&&newgrpdocker六、踩坑速查表
| 症状 | 真实原因 | 解法 |
|---|---|---|
Package 'docker-ce' has no installation candidate | 官方源InRelease没拉下来,索引为空 | 改用 Ubuntu 源装docker.io |
Connection reset by peer [IP: 18.65.14.67 443] | download.docker.com的 TLS 被中断 | 换源,或走代理 |
curl: (35) Recv failure | 同上,get.docker.com也是同一域名 | 放弃一键脚本 |
dial tcp 199.16.156.103:443: connect: connection refused | Docker Hub 域名被污染到错误 IP | 配registry-mirrors |
docker: unknown command: docker compose | docker.io不含 compose 插件 | 装docker-compose-v2 |
permission denied ... /var/run/docker.sock | 当前 shell 没刷新用户组 | newgrp/su -/ 重启 |
newgrp: command not found | 新版 Ubuntu 把它拆出去了 | apt install util-linux-extra |
改了daemon.json不生效 | 没重启 dockerd | sudo systemctl restart docker |
七、附:仍然想用官方docker-ce的话
如果你需要官方包(比如要特定小版本),可以换成国内镜像源,而不是放弃官方源。注意两个细节:GPG key 也要从镜像站取,以及新版本 Ubuntu 的代号(如 26.04 的resolute)在镜像里可能还没同步,此时把代号降一个 LTS 用(如noble):
sudoinstall-m0755-d/etc/apt/keyringscurl-fsSLhttps://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg\|sudogpg--dearmor-o/etc/apt/keyrings/docker.gpgsudochmoda+r /etc/apt/keyrings/docker.gpgecho"deb [arch=$(dpkg --print-architecture)signed-by=/etc/apt/keyrings/docker.gpg] \ https://mirrors.aliyun.com/docker-ce/linux/ubuntu noble stable"\|sudotee/etc/apt/sources.list.d/docker.listsudoaptupdatesudoaptinstall-ydocker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin可用的 docker-ce 镜像:阿里云、清华 TUNA、中科大 USTC、华为云、腾讯云,路径都是/docker-ce/linux/ubuntu。
如果连这些镜像也不通,说明是公司网络的 TLS 中间人,需要导入企业根证书;或者直接给 dockerd 配系统代理:
sudomkdir-p/etc/systemd/system/docker.service.dsudotee/etc/systemd/system/docker.service.d/proxy.conf<<'EOF' [Service] Environment="HTTP_PROXY=http://127.0.0.1:7890" Environment="HTTPS_PROXY=http://127.0.0.1:7890" Environment="NO_PROXY=localhost,127.0.0.1" EOFsudosystemctl daemon-reloadsudosystemctl restartdocker八、最后的验收清单
docker--version# 有版本号dockercompose version# 有版本号,不是 unknown commandsystemctl is-activedocker# activedockerinfo|grep-A4-imirror# 列出配置的加速器dockerrun--rmhello-world# Hello from Docker!,且不需要 sudo五条全过,环境就算彻底就绪。
一点经验:在国内装 Docker,真正的难点从来不是 Docker 本身,而是三个域名——download.docker.com(装包)、registry-1.docker.io(拉镜像)、get.docker.com(脚本)。把这三条链路的替代方案想清楚,剩下的都是apt的常规操作。