Deepin 25 上安装 Docker CE 实战记录
适用环境 :Deepin 25(crimson,基于 Debian 12 bookworm)、原生 Linux、内核 6.18+、
国内网络(直连
registry-1.docker.io超时)本教程包含 :环境检测 → apt 源说明 → 官方仓库安装 → containerd-snapshotter 修复 →
镜像加速器 → 用户组配置 → 验证 → 与两份 Ubuntu 教程的差异说明
为什么需要新文档 :
docs/中已有的两份教程(在Ubuntu26.04上安装Docker教程.md、
Docker安装教程-Ubuntu26.04.md)都是 Ubuntu 26.04 + WSL2/原生 Linux 的流程,不能直接套用在Deepin 25。本文档是 当前真实机器 (
lihaozhe、Deepin 25、native kernel)上跑通过的版本。
目录
- 环境检测
- 可行性检查
- [Docker CE 安装](#Docker CE 安装)
- 用户组配置
- [镜像加速器与 snapshotter 修复](#镜像加速器与 snapshotter 修复)
- 验证
- 常见问题排查
- 常用命令速查
- [与两份 Ubuntu 教程的差异对照](#与两份 Ubuntu 教程的差异对照)
1. 环境检测
bash
uname -a
cat /etc/os-release
本机实测:
Linux lihaozhe 6.18.38-amd64-desktop-rolling #25.01.01.28 SMP PREEMPT_DYNAMIC ... x86_64 GNU/Linux
PRETTY_NAME="Deepin 25"
NAME="Deepin"
VERSION_CODENAME=crimson
ID=deepin
VERSION_ID="25"
关键依赖:
bash
ps -p 1 -o comm= # 必须 = systemd(Deepin 用 systemd,非 SysV)
stat -fc %T /sys/fs/cgroup/ # 必须 = cgroup2fs
which iptables || which nft # 至少有一个(Docker 网络依赖)
curl --version | head -1 # 添加 GPG 源时需要
id # 当前用户在 sudo 组
df -h / # 至少 5 GB 可用
free -h # 至少 1 GB 可用
本机实测:
systemd
cgroup2fs
/usr/sbin/iptables
uid=1000(lhz) gid=1000(lhz) 组=1000(lhz),27(sudo),989(docker)
✅ Deepin 25 默认就是 systemd + cgroup v2 + 已装 iptables,不需要任何内核补丁或额外依赖。
2. 可行性检查
2.1 apt 是否可用
bash
sudo apt-get update
实测要点:
- 主源
community-packages.deepin.com/beige/ crimson main commercial community - 其他源(Chrome、driver、appstore)正常命中
- Docker 仓库(
download.docker.com/linux/debian bookworm,详见下文)可被识别但未必已经存在 → 走 §3 配置
2.2 Docker 仓库选择
Deepin 25 的 VERSION_CODENAME=crimson 不是 Debian codename ,Docker 官方源只接受
Debian codename(bookworm/bullseye/...)。本机实测两者可用:
| 仓库 | URL | 状态 |
|---|---|---|
| Docker 官方 | https://download.docker.com/linux/debian bookworm stable |
✅ 200 |
| 阿里云镜像 | https://mirrors.aliyun.com/docker-ce/linux/debian bookworm |
✅ 200 |
✅ 本教程选用 Docker 官方
bookworm源 (无需 GPG 代理,国内直连download.docker.com可达),不走阿里云,避免国内源偶发的
404(参见 Ubuntu 教程 §Q5)。
实测确认:
bash
curl -s -o /dev/null -w "%{http_code}\n" \
https://download.docker.com/linux/debian/dists/bookworm/Release
# 200
3. Docker CE 安装
3.0 仓库与 GPG 已就绪(首次安装场景)
本机先前已经创建了 /etc/apt/sources.list.d/docker.list 和 /etc/apt/keyrings/docker.gpg,
内容如下(完整流程亦列在 3.1~3.3):
/etc/apt/sources.list.d/docker.list:
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable
/etc/apt/keyrings/docker.gpg:Docker 官方公钥(5:29.x 系列)。
3.1 完整一次性脚本(推荐)
bash
# 1) 预装依赖(iptables 通常已自带,重复装无副作用)
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg iptables
# 2) 添加官方 GPG(modern keyring 方式,已不再用已废弃的 apt-key)
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg \
| sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 3) 写仓库源(Deepin 25 是基于 Debian 12 bookworm,所以用 bookworm 而非 crimson)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 4) 装全家桶(容器运行时 + buildx + compose v2 插件)
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
# 5) 启动 + 开机自启
sudo systemctl enable --now docker
sudo systemctl enable --now containerd
3.2 验证版本
bash
docker --version
docker compose version
containerd --version
sudo systemctl is-active docker
本机实测:
Docker version 29.7.2, build a7dcaa6
Docker Compose version v5.5.0
containerd containerd v2.3.4 db8809540e1a7a9da5d518876894933ff55692ab
active
3.3 已安装软件包清单
docker-ce 5:29.7.2-1~debian.12~bookworm amd64
docker-ce-cli 5:29.7.2-1~debian.12~bookworm amd64
containerd.io 2.3.4-1~debian.12~bookworm amd64
docker-buildx-plugin 0.36.1-1~debian.12~bookworm amd64
docker-compose-plugin 5.5.0-1~debian.12~bookworm amd64
4. 用户组配置
bash
sudo usermod -aG docker $USER
id $USER | tr ',' '\n' | grep docker # 应出现 (docker) 或 989(docker)
本机实测:
uid=1000(lhz) gid=1000(lhz) 组=1000(lhz),27(sudo),989(docker)
⚠️ 组成员关系在 新登录会话 才生效。当前 shell 立即生效有两种方法:
bash
# 方法 A:在当前 shell 内 newgrp(fork 子 shell,会话结束就消失)
newgrp docker
# 方法 B:登出再登入(Deepin UI 注销或 Ctrl+Alt+F1 重登录)
exit # 然后重新进入桌面会话
5. 镜像加速器与 snapshotter 修复
5.1 必踩的坑:containerd-snapshotter
Docker 29.x 默认启用 containerd snapshotter,会让:
daemon.json的registry-mirrors失效docker pull直接回落registry-1.docker.io然后超时docker info显示Storage Driver: overlayfs+driver-type: io.containerd.snapshotter.v1
本机首次 pull hello-world 实测:
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/...": dial tcp 69.171.224.40:443: i/o timeout
解决:显式关闭 snapshotter,回经典 overlay2。
5.2 写入 daemon.json
先写到 /tmp/daemon.json(避免 <<EOF heredoc 与 sudo -S 抢 stdin),再 mv 过去:
bash
cat > /tmp/daemon.json <<'EOF'
{
"features": {
"containerd-snapshotter": false
},
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
EOF
sudo mv /tmp/daemon.json /etc/docker/daemon.json
sudo chmod 644 /etc/docker/daemon.json
sudo cat /etc/docker/daemon.json # 验证
💡 三个镜像加速器 都是国内可用的公益源,按响应速度从快到慢排序(2026-09-02 实测):
排序 镜像 平均 TTFB 1️⃣ https://docker.m.daocloud.io~132 ms(阿里云,国内链路最短) 2️⃣ https://docker.1ms.run~185 ms 3️⃣ https://docker.xuanyuan.me~798 ms(Cloudflare,TLS 握手较慢) Docker 会按列表顺序轮询镜像,第一个不可用时降级到下一个。把最快的放前面,能减少首次 pull 的等待时间。
5.3 强制重启
systemctl restart docker 在某些场景不会真正杀掉 dockerd,必须 kill -9:
bash
sudo systemctl stop docker containerd
sudo killall -9 dockerd containerd 2>/dev/null
sleep 3
sudo systemctl start containerd
sudo systemctl start docker
sleep 4
5.4 验证生效
bash
sudo docker info | grep -A 2 "Storage Driver"
sudo docker info | grep -A 4 "Registry Mirrors:"
本机实测:
Storage Driver: overlay2
Registry Mirrors:
https://docker.m.daocloud.io/
https://docker.1ms.run/
https://docker.xuanyuan.me/
✅
Storage Driver: overlay2(不再是overlayfs+ containerd snapshotter)。
6. 验证
6.1 hello-world 端到端
bash
sudo docker pull hello-world
sudo docker run --rm hello-world
预期结尾输出:
Hello from Docker!
This message shows that your installation appears to be working correctly.
本机实测:Status: Downloaded newer image for hello-world:latest + Hello from Docker! ...。
6.2 免 sudo 验证(已加 docker 组后)
bash
newgrp docker -c 'docker ps && docker compose version && docker info | grep "Storage Driver"'
本机实测:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Docker Compose version v5.5.0
Storage Driver: overlay2
✅ 全部走普通用户身份完成,未使用
sudo。
6.3 compose 插件烟雾测试
bash
mkdir -p /tmp/test-compose && cd /tmp/test-compose
cat > docker-compose.yml <<'EOF'
services:
hello:
image: hello-world
EOF
docker compose up
预期:容器启动并打印 Hello from Docker!,退出码 0。
7. 常见问题排查
Q1:pull 镜像一直超时,但 ping 8.8.8.8 正常
症状:
failed to do request: Head "https://registry-1.docker.io/v2/...": dial tcp ...:443: i/o timeout
warning msg="Host doesn't match" cfgHost=registry-1.docker.io host=<mirror>
原因 :Docker 29 默认 containerd snapshotter 模式使 registry-mirrors 失效。
解决 :参见 §5.2 关闭 snapshotter 并强制重启。
Q2:sudo systemctl restart docker 后配置未生效
原因 :systemd 的 Restart= 配置有时不会真正杀掉 dockerd 进程。
解决 :sudo killall -9 dockerd containerd 后再 systemctl start。
Q3:docker compose 报 command not found
原因 :未安装 docker-compose-plugin(注意是 plugin 不是 docker-compose 单独二进制)。
解决 :sudo apt-get install docker-compose-plugin。新命令格式是 docker compose(带空格)。
Q4:用户加入 docker 组后仍需 sudo
原因 :组成员关系只在 新登录会话 生效。
解决:
- 当前 shell:
newgrp docker - 完全退出再登录:注销 Deepin 桌面会话后重新进入
Q5:sudo apt-get update 报 Release 404(典型:源地址错误)
症状 :404 Not Found [IP: ...]。
原因 :Deepin VERSION_CODENAME=crimson 不是 Debian codename,Docker 源必须写 bookworm
(Deepin 25 基于 Debian 12)。
解决 :/etc/apt/sources.list.d/docker.list 必须写 bookworm:
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable
Q6:能否让多个用户共享 docker?
bash
sudo usermod -aG docker user1
sudo usermod -aG docker user2
# 这些用户重新登录后均可免 sudo 使用 docker
Q7:能否保留对单台机器的 sudo docker 习惯(不加入 docker 组)?
可以,不做任何用户组配置也能正常用 sudo docker ...。
只是每次都要 sudo。本教程加入 docker 组是为了日常开发更顺手。
8. 常用命令速查
8.1 服务管理
bash
sudo systemctl status docker # 查看状态
sudo systemctl start docker # 启动
sudo systemctl stop docker # 停止
sudo systemctl restart docker # 重启(不可靠,用 killall)
sudo killall -9 dockerd containerd # 强制结束
sudo journalctl -u docker -f # 实时日志
sudo journalctl -u docker --since "1h ago" # 最近 1h 日志
8.2 镜像操作
bash
docker images # 列出本地镜像
docker search nginx # 搜索(需镜像源支持 search)
docker pull nginx:1.27 # 拉取
docker rmi nginx:1.27 # 删除
docker image prune -a # 清理未使用镜像
docker tag nginx:1.27 mynginx:v1 # 打标签
docker save mynginx:v1 -o mynginx.tar # 导出
docker load -i mynginx.tar # 导入
8.3 容器操作
bash
docker ps -a # 列出所有容器(含停止)
docker run -d --name web -p 80:80 nginx:1.27 # 后台启动
docker logs -f --tail 100 web # 实时日志
docker exec -it web bash # 进入容器
docker stop web # 停止
docker start web # 启动
docker restart web # 重启
docker rm -f web # 强制删除
docker top web # 查看容器内进程
docker stats web # 实时资源占用
docker inspect web # 元数据 JSON
8.4 docker compose(v2 插件)
bash
docker compose up -d # 后台启动
docker compose down # 停止并删容器
docker compose ps # 查看状态
docker compose logs -f # 实时日志
docker compose pull # 拉所有镜像
docker compose exec web bash # 进入服务
docker compose config # 校验 compose.yml
docker compose build # 构建镜像
8.5 网络与卷
bash
docker network ls # 网络列表
docker network create mynet # 自定义网络
docker network inspect bridge # 详情
docker volume ls # 卷列表
docker volume create mydata # 创建卷
docker system df # 磁盘占用
docker system prune -a # 清理所有未用资源
8.6 上下文与 Buildx
bash
docker context ls # 列出当前可用的 docker daemon(本地/远程)
docker buildx ls # 列出 builder 实例
docker buildx build -t myapp:latest . # buildx 构建(多平台能力更强)
9. 与两份 Ubuntu 教程的差异对照
| 项目 | 在Ubuntu26.04上安装Docker教程.md |
Docker安装教程-Ubuntu26.04.md |
本文(Deepin 25) |
|---|---|---|---|
| 目标 OS | Ubuntu 26.04 LTS (resolute) + WSL2 | Ubuntu 26.04 LTS (resolute) 原生 Linux | Deepin 25 (crimson) 原生 Linux |
VERSION_CODENAME 用法 |
直接套 Ubuntu 的 resolute |
直接套 Ubuntu 的 resolute |
写 bookworm(Deepin 是 Debian 12 衍生) |
| 源 URL 路径 | /linux/ubuntu |
/linux/ubuntu |
/linux/debian |
<<EOF + sudo -S 能否写入 daemon.json |
✅(PTY 中能用) | ✅(PTY 中能用) | ⚠️ 会冲突导致密码错 ,改用 /tmp 中转 |
| systemd 检查 | 包含 WSL2 特定检查 | 简化为 PS PID 1 | Deepin 默认就是 systemd,无需检测 |
| AppArmor | 默认未启 | 默认未启 | Deepin 安装包会自动启用 apparmor service |
| 防火墙后端 | nftables(Ubuntu 26 默认) | nftables | iptables(Docker info 显示) |
| containerd-snapshotter 修复 | ✓ | ✓ | ✓ |
| 镜像加速器三个源 | 相同 | 相同 | 相同 |
| 用户免 sudo | ✓ | ✓ | ✓ |
附录 A:本机实测环境快照
text
OS: Deepin 25 (crimson)
Base on: Debian 12 (bookworm)
Kernel: 6.18.38-amd64-desktop-rolling (native)
CPU: 本机 lihaozhe 自用机
systemd: PID 1 = systemd ✓
cgroup: v2 (cgroup2fs) ✓
iptables: /usr/sbin/iptables ✓
Docker: 29.7.2 (build a7dcaa6)
Compose: v5.5.0
containerd: 2.3.4
runc: (随 docker-ce 一起)
Storage: overlay2(containerd-snapshotter=false)✓
Registry Mirrors: docker.m.daocloud.io, docker.1ms.run, docker.xuanyuan.me(按速度排序)✓
User: lhz (uid=1000, groups: lhz+sudo+docker) ✓
附录 B:最终配置文件
/etc/apt/sources.list.d/docker.list
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable
/etc/docker/daemon.json
json
{
"features": {
"containerd-snapshotter": false
},
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
实测时间 :2026-09-02
作者 :基于本机实测整理(Deepin 25 实战)
License:自由使用与转载