Ubuntu 22.04 LTS 安装 Docker CE 实战教程(2026 最新版)

Ubuntu 22.04 LTS 安装 Docker CE 实战教程(2026 最新版)

摘要:在 Ubuntu 22.04 LTS(Jammy Jellyfish)上装 Docker CE 看似一行命令搞定,实操中会遇到容器 DNS 解析失败、镜像拉取慢、cgroups v2 与 docker-compose 不兼容等典型坑点。本文从卸载旧版、添加官方源(避开 Ubuntu 仓库的 docker.io 老版本)、配置国内镜像加速,到 daemon.json 调优、Docker Compose V2 安装、镜像与网络验证,每一步都给出实测可过的命令踩坑记录

适用版本:Ubuntu 22.04 LTS(兼容 24.04、20.04) 目标 Docker:Docker CE 27.x(最新 stable,含 Compose V2 plugin)


一、为什么不用 Ubuntu 自带的 docker.io

新手最容易犯的错:

apt install -y docker.io   # ❌ 这是 Ubuntu 自带的、停更的版本

docker.io 是 Ubuntu/Debian 仓库里 Docker 的"残血版":

  • 版本老(22.04 上是 20.10.x,2022 年的)
  • 缺 Compose V2 plugin
  • 缺 BuildKit 默认支持
  • 与 Docker 官方仓库版本不同步,安全更新滞后

正确做法:用 Docker 官方源(download.docker.com)安装 Docker CE。

二、安装前准备

2.1 系统要求

项目要求
Ubuntu22.04 LTS(kernel ≥ 5.15)
架构x86_64 / arm64 / s390x
内存≥ 1 GB(生产 ≥ 4 GB)
磁盘/var/lib/docker 至少 10 GB

2.2 卸载旧版

如果是新装机器可以跳过;如果之前装过 docker.iodocker-ce 的旧版本,先卸干净

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
    sudo apt-get remove -y $pkg 2>/dev/null
done

注意:不要用 apt purge,那会删掉 /var/lib/docker 里所有镜像和卷。上面用 remove 只删包,保留数据

2.3 添加 Docker 官方 GPG 密钥

# 22.04 默认是 /etc/apt/keyrings,没有就建
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings

# 下载 GPG key(官方推荐方式)
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

三、添加 Docker 官方 APT 源

# 自动识别架构与代号
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

坑点 1$(. /etc/os-release && echo "$VERSION_CODENAME") 在 shell 里执行后输出 jammy(22.04 代号),但如果你 shell 是 sh(不是 bash),. 命令可能不工作。先 echo $VERSION_CODENAME 验证下输出是 jammy 而不是空。

四、安装 Docker CE 与 Compose V2

4.1 安装核心包

sudo apt-get install -y docker-ce docker-ce-cli containerd.io \
                        docker-buildx-plugin docker-compose-plugin

四个包的作用:

作用
docker-ceDocker 守护进程
docker-ce-clidocker 命令行工具
containerd.iocontainerd 运行时
docker-buildx-plugin增强构建工具(多架构、缓存)
docker-compose-plugindocker compose 子命令(V2)

4.2 验证安装

# 查版本
docker --version
# Docker version 27.x.x, build xxxxx

docker compose version
# Docker Compose version v2.x.x

# 跑 hello-world(验证整个链路)
sudo docker run --rm hello-world

坑点 2:跑 hello-world 失败的最常见原因是 DNS 解析失败——容器内默认 DNS 来自宿主机,如果宿主机的 /etc/resolv.conf 有问题(特别是用了 127.0.0.53 systemd-resolved),容器就会卡在拉镜像或运行阶段。先看下面的"daemon 调优"。

五、关键配置:daemon.json

5.1 配置国内镜像加速(不配置 = 拉镜像 1MB/s)

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json << 'EOF'
{
    "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn"
    ],
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "100m",
        "max-file": "3"
    },
    "storage-driver": "overlay2",
    "live-restore": true,
    "userland-proxy": false,
    "no-new-privileges": true
}
EOF

各字段说明:

字段作用
registry-mirrors国内必须,否则 docker pull
log-opts.max-size单个日志文件最大 100MB,防爆盘
log-opts.max-file最多保留 3 个滚动日志
storage-driver强制用 overlay2(22.04 默认)
live-restoreDocker daemon 重启不影响运行中容器
userland-proxy关闭用户态代理(性能更好)
no-new-privileges默认禁止容器内提权(安全)

5.2 应用配置

sudo systemctl restart docker
sudo systemctl status docker

# 验证 mirror 是否生效
docker info | grep -A 5 "Registry Mirrors"

六、免 sudo 使用 Docker

6.1 创建 docker 用户组(apt 安装时已自动创建)

# 查看是否已存在
getent group docker

# 把当前用户加进 docker 组(**免 sudo**)
sudo usermod -aG docker $USER

# 重新登录生效(或手动刷新组)
newgrp docker

# 验证
docker ps   # 不加 sudo 也能跑

6.2 验证非 root 运行

docker run --rm hello-world

坑点 3:加完组后必须重新登录newgrp docker,否则还是以原组身份跑,权限不够。SSH 客户端的常见做法是退出重连。

七、Docker Compose V2 使用

V1(docker-compose)已停更,V2(docker compose)是 Go 重写的单文件:

7.1 基本命令对比

V1 (Python)V2 (Go plugin)
docker-compose up -ddocker compose up -d
docker-compose psdocker compose ps
docker-compose logs -fdocker compose logs -f
docker-compose downdocker compose down

7.2 示例:跑个 WordPress

mkdir -p ~/wp && cd ~/wp
cat > compose.yaml << 'EOF'
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp
      MYSQL_PASSWORD: wppass
    volumes:
      - db_data:/var/lib/mysql

  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    depends_on:
      - db
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wp
      WORDPRESS_DB_PASSWORD: wppass

volumes:
  db_data:
EOF

docker compose up -d
docker compose ps
# 浏览器打开 http://localhost:8080

八、systemd 与 cgroups v2

Ubuntu 22.04 默认是 systemd + cgroups v2,对 Docker 完全兼容。但有几个容易栽的点:

8.1 cgroups v2 验证

stat -fc %T /sys/fs/cgroup/
# cgroup2fs  ← 这是 v2

# 老版本 kernel(< 5.8)才需要手动启用 v2

8.2 systemd 集成(可选)

容器内跑 systemd(如 centos:latest / ubuntu:latest)需要特权模式:

docker run -d --name systemd-test \
    --privileged \
    --tmpfs /run \
    --tmpfs /run/lock \
    --tmpfs /tmp \
    -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
    centos:7 /sbin/init

docker exec -it systemd-test bash -c "systemctl status"

坑点 4:容器内 systemd 启动失败 90% 是因为没挂载 cgroup 卷。22.04 上 /sys/fs/cgroup 是 v2 格式,需要 :ro 模式挂。

九、镜像与网络验证清单

9.1 基础检查

# 1. 守护进程健康
docker info | head -10

# 2. 容器运行验证
docker run --rm -it alpine:latest sh -c "uname -a && cat /etc/os-release"

# 3. 网络出站(最容易栽的环节)
docker run --rm alpine:latest wget -qO- ifconfig.me
# 或
docker run --rm curlimages/curl curl -s https://api.ipify.org

# 4. DNS 解析
docker run --rm alpine:latest nslookup docker.io 8.8.8.8

# 5. 镜像列表
docker images

9.2 容器内 DNS 故障排查

如果 nslookup 在容器内失败:

# 看宿主机 DNS
cat /etc/resolv.conf
# 22.04 默认:
# nameserver 127.0.0.53
# options edns0 trust-ad

# 容器内看到的 DNS 不对,需要在 daemon.json 显式指定
sudo tee -a /etc/docker/daemon.json > /dev/null << 'EOF'
{
    "dns": ["8.8.8.8", "1.1.1.1"]
}
EOF

sudo systemctl restart docker

十、卸载与清理

# 1. 卸包
sudo apt-get purge -y docker-ce docker-ce-cli containerd.io \
                     docker-buildx-plugin docker-compose-plugin

# 2. 删数据(镜像、卷、网络)
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

# 3. 删 GPG key 和源
sudo rm /etc/apt/sources.list.d/docker.list
sudo rm /etc/apt/keyrings/docker.gpg

# 4. 移除 docker 用户组(可选)
sudo groupdel docker

坑点 5apt purge 不会删 /var/lib/docker,要手动 rm -rf。卸载前确认重要数据已备份

十一、升级路径

Docker CE 装好后会自动跟着官方源升级:

sudo apt-get update
sudo apt-get upgrade -y docker-ce docker-ce-cli containerd.io

重大版本升级前先看 release notes:

  • 22.04 LTS 支持到 2027 年,5 年内主流 Docker 都兼容
  • 大版本升级(如 24 → 27)建议先在测试环境验证
  • 不要用 dist-upgrade 升级 Ubuntu,会同时升级 kernel,可能导致 Docker 不可用

十二、写在最后

Ubuntu 22.04 + Docker CE 是当前最稳的开发/生产组合之一。装好后建议立刻做这几件事:

  1. ✅ 配置 registry-mirrors(国内必须)
  2. ✅ 加用户到 docker 组(免 sudo)
  3. ✅ 配置日志轮转(防磁盘满)
  4. ✅ 启用 live-restore(daemon 重启不杀容器)
  5. ✅ 把 compose V2 用起来(V1 已停更)

把这套做完,整个 Docker 环境就稳了,可以放心部署 k3s / k8s / 各种应用。


参考资源

遇到容器 DNS 解析问题? 评论区贴 docker run --rm alpine nslookup 输出 + cat /etc/resolv.conf,我帮你分析。

Docker #Ubuntu #运维 #容器 #Linux

发表回复

后才能评论