Featured image of post Docker 安装与基础:从 docker-ce/ee 拆分到多场景落地的完整路径

Docker 安装与基础:从 docker-ce/ee 拆分到多场景落地的完整路径

docker-ce/ee 拆分、buildx 插件、cri-dockerd shim、Mirantis 接手企业版——一次把多发行版安装、离线部署、关键配置、清理卸载的完整路径梳理清楚

容器化已经是后端服务的标配,而 Docker 几乎是入门的"必经之地"。从 2013 年 Docker 公开,到 2017 年 Docker 公司宣布拆分社区版(docker-ce)和企业版(docker-ee),再到 2019 年底 Mirantis 接手 Docker Enterprise 业务、2020 年 Docker 把 buildx 收为官方 CLI 插件、2022 年 Kubernetes 1.24 移除 dockershim 引入 cri-dockerd——九年间,Docker 生态的"安装"二字已经远不止 apt install docker.io 那么简单。

这篇文章把零散的安装笔记、版本对比、配置细节整理成一条"从选型到可用"的完整路径,适合刚接触 Docker、或在新机器上做标准化的同学。

阅读对象:需要在 Linux 服务器上从零部署 Docker 的开发者、运维同学
覆盖范围:docker-ce / docker-ee / docker.io 三种发行版差异 + Debian/Ubuntu/Kali/CentOS 主流安装方式 + 离线部署(含 cri-dockerd、buildx、docker-compose v2)+ daemon.json 关键配置 + 清理卸载 + 常见排障

一、为什么需要 Docker

容器不是"更轻的虚拟机"那么简单。在引入 Docker 之前,团队通常被这些痛点反复折磨:

  • 环境漂移:开发用 macOS、测试用 CentOS、生产用 Ubuntu,works on my machine 反复出现
  • 资源浪费:一台物理机只跑两三个 Java 应用,资源利用率不足 20%
  • 交付链条长:应用 + 运行时 + 依赖 + 配置,要运维一台台机器"对版本"
  • 扩缩容难:业务流量上来后,手动扩容几台机器要写一堆脚本
  • 与 K8s 集成难:容器运行时直接对接 kubelet 的 dockershim 接口一改,整个集群要重新适配

Docker 把应用 + 运行时 + 依赖打包成"镜像",在装有 Docker 引擎的任意机器上一键运行,保证开发、测试、生产环境的一致性。这正是它被广泛接受的根本原因。

When to use:单体应用拆成多服务时、新人 onboard 需要快速搭建环境时、CI/CD 需要稳定可复现的构建产物时,Docker 几乎是首选解。从 LXC 时代走过来,Docker 通过标准化的镜像格式(OCI 规范)、BuildKit 构建系统和 Compose 编排,把"环境一致性"变成了开箱即用的能力。

二、版本选型:docker-ce / docker-ee / docker.io 的真实差异

2017 年 3 月 Docker 公司宣布将 Docker 拆分为两条产品线:开源的 Docker Community Edition(CE) 和商业的 Docker Enterprise Edition(EE)。这次拆分不是营销行为,而是把"包结构"和"维护承诺"做了明确切割——CE 由 Docker Inc. 维护源码、每月发布一次社区版;EE 在 CE 基础上叠加企业级功能,按"基本/标准/高级"三级订阅。

发行版来源特点适用场景
docker.ioDebian / Ubuntu / Kali 官方仓库由发行版包管理器接管依赖,升级时主程序与系统库同步更新;有时版本比 docker-ce 还新服务器首选 Debian / Ubuntu 系列,追求"系统包管一切"
docker-cedownload.docker.com 官方源Docker Inc. 维护源码,用 Go 把依赖尽量静态封装在一个包里,跨发行版一致CentOS / RHEL / 任何需要"同一版本跑所有机器"的场景
docker-eeMirantis 客户专用仓库在 CE 之上叠加 LDAP/AD 集成、RBAC、镜像安全扫描、连续漏洞监控等企业级能力大型企业、需要 Docker Inc. / Mirantis 商业支持的客户

历史注脚:2019 年 11 月,Mirantis 收购了 Docker 的企业业务(包括 docker-ee 品牌)。所以现在严格意义上"docker-ee"是 Mirantis 商业产品线,而非 Docker Inc. 的产品。如果用 docker-ee 走商业支持,签合同的对象是 Mirantis。

docker-ce 的"致命缺陷"——依赖管理

docker-ce 把 Docker 引擎依赖的成百上千个第三方库(glibc、openssl、libseccomp、containerd、runc 等)尽量静态或动态链接到自己的包里。这意味着理论上只要其中一个依赖出 CVE,整套 docker-ce 都得重新打补丁、重建二进制、再分发。反观 docker.io,依赖托管给系统包管理器,只需要升级 docker 主程序、系统的 libseccomp 等库跟随 Debian Security Advisory / USN 自动推补丁。

结论

  • Debian / Ubuntu / Kali 服务器:直接 apt install docker.io,让系统接管一切
  • 其他发行版(CentOS / RHEL / Amazon Linux / SUSE):走 docker-ce 官方源或 get-docker.sh 脚本
  • 商业场景:评估 docker-ee / Mirantis Container Cloud 的 SLA 与支持响应

三、Debian / Ubuntu / Kali 系安装

3.1 路线 A:apt 安装 docker.io(推荐)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 推荐安装
apt install -y docker.io

# 更新
apt update
apt upgrade -y docker.io

# 验证
docker --version
docker run --rm hello-world

docker.io 包是 Debian / Ubuntu 官方基于 Docker 社区源码封装的版本,特点是把 Docker 的依赖直接转接到主系统。换句话说,系统的 glibc / openssl / libseccomp 升级时,docker.io 自动跟随,不需要 Docker Inc. 单独发版。

3.2 路线 B:apt 安装 docker-ce

如果团队要求"全机器统一 Docker 版本"(比如某条线 CI 必须用 20.10.x),或者 Debian stable 仓库里的 docker.io 太老,就走 docker-ce 源:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1. 卸载旧版本(如果存在)
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do
  apt-get remove -y $pkg
done

# 2. 加 Docker 官方 GPG key
apt-get update
apt-get install -y ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release && echo "$ID")/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

# 3. 加 docker-ce 源
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/$(. /etc/os-release && echo "$ID") \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null

apt-get update

# 4. 装最新 docker-ce
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

注意:从 20.10 起,官方推荐把 buildxdocker-compose 作为插件(plugin)安装,文件落在 /usr/libexec/docker/cli-plugins/。这是为了和 Docker CLI 解耦,buildx 可以独立升级。

3.3 卸载 Debian/Ubuntu 系

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 1. 删主程序(含 docker-ce / docker-ee / docker.io / containerd / runc)
apt-get autoremove docker docker-ce docker-ee docker.io containerd runc

# 2. 查残留
dpkg -l | grep docker

# 3. 清理无用的相关配置文件(^rc 表示已删但留配置)
dpkg -l | grep ^rc | awk '{print $2}' | sudo xargs dpkg -P

# 4. 删 docker-ce-* 子包
apt-get autoremove docker-ce-*

# 5. 删残留目录(关键!apt remove 不会动这些)
rm -rf /etc/systemd/system/docker.service.d
rm -rf /var/lib/docker          # 镜像、卷、网络元数据全在这
rm -rf /etc/docker              # daemon.json 在这
rm -rf /var/run/docker.sock

# 6. 删 docker 用户组
groupdel docker

# 7. 验证
docker --version    # 应该报 command not found

Why 这样卸载:apt remove 只会删主程序二进制,/var/lib/docker 下的镜像、卷、网络、自定义配置都还在;不删干净的话,新装 docker 时旧配置会"莫名生效",排查很痛苦。

四、CentOS / RHEL 系安装

4.1 加 docker-ce 源

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 安装 yum-utils
sudo yum install -y yum-utils

# Docker 官方源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 国内源(阿里云)
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 或者直接 wget
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo \
  -O /etc/yum.repos.d/docker-ce.repo

# 查看可装版本
yum list docker-ce --showduplicates | sort -r
# 输出类似:
# docker-ce.x86_64    20.10.21-3.el8    docker-ce-stable
# docker-ce.x86_64    18.03.1.ce-1.el7.centos    docker-ce-stable

4.2 安装

1
2
3
4
5
6
# 推荐:装 docker-ce + CLI + containerd + buildx + compose 插件
sudo yum install -y docker-ce docker-ce-cli containerd.io \
                    docker-buildx-plugin docker-compose-plugin

# 装指定版本
yum -y install docker-ce-20.10.21-3.el8

4.3 卸载 CentOS/RHEL

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 查看已装包
rpm -qa | grep docker

# 典型输出(旧版本可能含 python36-docker-*):
# python36-docker-2.6.1-3.el7.noarch
# docker-client-1.13.1-209.git7d71120.el7.centos.x86_64
# docker-1.13.1-209.git7d71120.el7.centos.x86_64
# docker-compose-1.18.0-4.el7.noarch
# docker-common-1.13.1-209.git7d71120.el7.centos.x86_64

# 一次性卸载
yum remove -y python36-docker-* docker-client-* docker-* \
              docker-compose-* docker-common-*

# 残留目录处理同 Debian
rm -rf /var/lib/docker /etc/docker /var/run/docker.sock

五、官方脚本通用安装

适合任何 Linux 发行版(CentOS、Ubuntu、Debian、Amazon Linux 等),是 Docker 官方最推荐的安装方式之一。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 方式 1:直接管道执行
curl -fLsS https://get.docker.com/ | sh

# 方式 2:下载脚本本地执行(推荐,便于审计)
curl -fsSL https://get.docker.com -o get-docker.sh
DRY_RUN=1 sh ./get-docker.sh    # 可选:dry-run 看看会装什么
sudo sh get-docker.sh

# 方式 3:阿里云镜像
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

# 方式 4:DaoCloud 镜像
curl -sSL https://get.daocloud.io/docker | sh

get-docker.sh 会自动检测发行版、加源、装最新稳定版 docker-ce。CentOS 7 系列会自动停用旧版 docker 包,升级到 docker-ce。

六、离线安装

内网 / 无外网环境的标准做法。原理就是先在外网打包好 Docker 的静态二进制 + 依赖 + 配套工具(buildx / docker-compose / cri-dockerd),再传到内网机器解包、注册 systemd unit。

6.1 下载离线包

以 Docker 24.0.7 为例,下载后是一组独立二进制:dockerdocker-initdockerdruncctrcontainerd-shim-runc-v2containerddocker-proxy

6.2 解包并安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 解压
tar xvf docker-24.0.7.tgz

# 拷贝二进制到 PATH 目录
cp docker/* /usr/bin

# 准备 containerd 配置(containerd.io 默认配置)
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml

# 创建 / 启用 docker systemd unit
systemctl daemon-reload
systemctl enable --now containerd.service
systemctl enable --now docker.service
systemctl enable --now docker.socket

# 验证
docker info
docker run --rm hello-world

2018 时代差异:早期 Docker 还是用 vim /etc/init.d/docker + service docker start + chkconfig docker on 三件套。现在统一走 systemd:写 /etc/systemd/system/docker.service.d/*.conf 覆盖、systemctl daemon-reloadsystemctl restart docker

6.3 配套组件:cri-dockerd(K8s 1.24+ 必装)

Kubernetes 1.24(2022 年 5 月 GA)移除了内置的 dockershim,CRI 改由 containerd / CRI-O 直接对接。如果还想用 Docker 作为 K8s 容器运行时,必须装 cri-dockerd——它把 Docker Engine 重新"翻译"成 CRI 接口给 kubelet 用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 下载 cri-dockerd(与 docker 版本匹配)
curl -fL https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.9/cri-dockerd-0.3.9.amd64.tgz \
  -o /tools/cri-dockerd-0.3.9.amd64.tgz

# 解压
tar xf /tools/cri-dockerd-*.amd64.tgz -C /tools
cp /tools/cri-dockerd/cri-dockerd /usr/local/bin

# 注册 systemd unit
systemctl daemon-reload
systemctl enable --now cri-docker.socket
systemctl enable --now cri-docker.service

# 在 kubeadm init 时指定:
# kubeadm init --cri-socket=unix:///var/run/cri-dockerd.sock

Mirantis 出品:cri-dockerd 是 Mirantis(2019 年接手 Docker Enterprise 的公司)维护的开源项目,所以 Mirantis/cri-dockerd 这个 GitHub 路径是规范来源。

6.4 配套组件:buildx(多架构构建)

buildx 是 Docker 公司在 2020 年 9 月推出的 BuildKit CLI 插件,用来取代老的 docker build。它支持:

  • 多架构构建:一条命令同时打 linux/amd64linux/arm64 镜像
  • 缓存导出:把构建缓存 push 到 registry,下次 docker build 直接命中
  • BuildKit 高级特性:并发构建、secrets 挂载、SSH 转发
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 安装(在 docker-ce 20.10+ 已经是默认插件)
apt install -y docker-buildx-plugin     # Debian/Ubuntu
yum install -y docker-buildx-plugin    # CentOS

# 或者从 release 二进制
mkdir -p ~/.docker/cli-plugins
curl -fsSL https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-amd64 \
  -o ~/.docker/cli-plugins/docker-buildx
chmod +x ~/.docker/cli-plugins/docker-buildx

# 创建多架构 builder
docker buildx create --name multiarch --driver docker-container --use
docker buildx inspect --bootstrap

# 跨架构构建示例
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  --tag your-registry.com/your-app:v1.0 \
  --push .

6.5 配套组件:docker-compose v1 / v2 选择

版本发布时间形态现状
Compose v12014-07独立二进制 docker-compose(Python 写)已弃用,2023 年起 Docker Desktop 不再预装
Compose v22020-08Docker CLI 插件 docker compose(空格,无连字符)当前推荐,统一走 Go 重写

离线安装 Compose v1(如果有遗留项目依赖 v1):

1
2
3
cp /tools/docker_compose /usr/local/bin
chmod +x /usr/local/bin/docker-compose
docker-compose --version

离线安装 Compose v2(推荐):

1
2
3
4
5
mkdir -p /usr/local/lib/docker/cli-plugins
curl -fsSL https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-linux-x86_64 \
  -o /usr/local/lib/docker/cli-plugins/docker-compose
chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
docker compose version    # 注意:v2 是空格

七、验证安装

任何安装方式,最后都要做这几步验证:

1
2
3
4
5
6
systemctl status docker          # 状态是否 active
systemctl start docker            # 没起就启动
systemctl enable docker           # 开机自启
docker info                       # 引擎详细信息(看 Storage Driver / Cgroup Driver / Registry Mirrors)
docker version                    # 客户端/服务端版本
docker run --rm hello-world       # 跑一个最小测试容器

hello-world 能正常打印 “Hello from Docker!” 就算通了。

八、关键配置:daemon.json

/etc/docker/daemon.json 是 Docker Daemon 的主配置文件。90% 的日常配置都在这里

8.1 推荐模板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": { "max-size": "50m", "max-file": "3" },
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn"
  ],
  "insecure-registries": [],
  "live-restore": true,
  "storage-driver": "overlay2"
}

8.2 关键字段说明

字段作用建议值
exec-opts.cgroupdrivercgroup 驱动K8s 节点推荐 systemd(与 kubelet 保持一致)
log-driver日志驱动生产环境 json-filejournald
log-opts.max-size单个日志文件大小50m 避免撑爆磁盘
log-opts.max-file保留日志文件数3~5,轮转策略
registry-mirrors镜像加速器国内服务器必加,否则 docker pull 慢到怀疑人生
insecure-registries信任的 HTTP 私有仓库内网 registry 才需要,格式 IP:PORT
live-restoreDaemon 重启时容器不中断K8s 节点必须开,否则 kubelet 升级 Docker 就会重启所有 Pod
storage-driver镜像 / 容器分层存储overlay2(CentOS 7.4+ / Ubuntu 18.04+ / Debian 10+ 默认)

8.3 应用配置

1
2
3
4
5
6
7
8
systemctl daemon-reload
systemctl restart docker

# 验证镜像加速生效
docker info | grep -A 10 "Registry Mirrors"

# 验证 live-restore
docker info | grep -i live

进一步可以用 time docker pull nginx:latest 测速,能从几十秒压到几秒就算 mirror 生效。

九、live-restore:K8s 节点的隐藏必修项

Live Restore 是 Docker Daemon 的一项"升级 / 重启不打断容器"的特性。对 K8s 节点来说这是必修项——kubelet 升级、操作系统补丁、daemon 自身重启时,节点上的 Pod 不能因此被重启。

开启方式:

1
2
3
4
// /etc/docker/daemon.json
{
  "live-restore": true
}
1
2
3
4
5
6
systemctl daemon-reload
sudo systemctl reload docker.service   # 注意是 reload,不是 restart

# 验证
docker info | grep -i live
# 应输出:Live Restore Enabled: true

集群环境下,daemon.json 改完用 scp + ssh 推送到所有 master / worker 节点:

1
2
3
4
5
for NODE in master2 master3 worker1 worker3 worker4; do
  echo $NODE
  scp /etc/docker/daemon.json $NODE:/etc/docker/
  ssh root@$NODE "systemctl daemon-reload && systemctl reload docker"
done

十、存储卷(Volume)基础

容器文件系统是分层的、临时的,docker rm 之后容器内的数据就没了。生产数据(数据库、用户上传、配置)必须挂到 volume 上。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 创建
docker volume create my-data

# 查看
docker volume ls

# 查看详细信息(包含 mount point)
docker volume inspect my-data

# 删除单个
docker volume rm my-data

# 删除所有未被引用的卷
docker volume prune

-v 挂载用法:

1
2
3
4
docker run -d --name mysql \
  -v mysql_data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=xxx \
  mysql:8.0

关键警告docker volume prune永久删除未被任何容器引用的卷,里面如果有数据库 / 业务数据,删了就没了——生产环境慎用。删之前先 docker volume ls + docker volume inspect 逐个确认。

十一、网络模式与网桥清理

11.1 docker0 网桥

Docker 进程启动时,会在主机上创建一个名为 docker0 的虚拟网桥,默认地址 172.17.0.0/16。所有以 Bridge 模式启动的容器都"插"到这个虚拟交换机上,通过 docker0 ↔ 物理网卡 eth0 ↔ 外部网络。

如果想彻底关掉默认网桥(自定义网络场景):

1
2
3
4
5
// /etc/docker/daemon.json
{
  "iptables": false,
  "bridge": ""
}
1
2
systemctl daemon-reload
systemctl restart docker

注意:删 docker0 是一次性的——下次 daemon 启动没指定 -b 参数又会自动重建。一般用 daemon.json 里的 bridge: "" 永久关闭更稳妥。

11.2 容器从网桥上摘除

1
2
# 把某个容器从默认 bridge 网络上摘除
docker network disconnect -f bridge container-name

十二、基础清理

跑完一轮测试容器之后,会留下不少"垃圾"。下面是分级清理命令:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 删除所有未使用的对象(停掉的容器、dangling 镜像、未用网络)
docker system prune -f

# 包括未使用的卷(危险:会丢数据)
docker system prune -f --volumes

# 只删未使用的网络
docker network prune -f

# 只删 12 小时前创建的网络
docker network prune -a --filter "until=12h"

# 只删 24 小时前没用的镜像
docker image prune -a --filter "until=24h"

核心要点 / 常见坑

  1. docker system prune --volumes 会删未挂载的卷,里面如果残留数据库数据,删了就没了——生产慎用
  2. dangling 镜像指的是无 tag 的中间层镜像(<none>:<none>),安全可删
  3. 想看"能删多少"先用 docker system df 看磁盘占用
  4. docker system df -v 还能看到每个 volume / image 占多少空间,方便定位"硬盘杀手"

十三、镜像代理(应对国内拉镜像慢)

拉 Docker Hub / ghcr / gcr / k8s.gcr.io / quay.io 镜像在国内慢到超时是常态。常见做法是用镜像代理做反代。

原始 registry代理写法(以 dockerproxy.com 为例)
Docker Hubdocker pull dockerproxy.com/library/nginx:latest
GHCRdocker pull ghcr.dockerproxy.com/username/image:tag
GCRdocker pull gcr.dockerproxy.com/username/image:tag
k8s.gcr.io / registry.k8s.iodocker pull k8s.dockerproxy.com/coredns:1.6.5
Quay.iodocker pull quay.dockerproxy.com/username/image:tag

南京大学 GHCR 镜像ghcr.nju.edu.cn 是国内 GHCR 加速的另一个选择,直接把 ghcr.io/xxx 替换为 ghcr.nju.edu.cn/xxx 即可。

如果嫌每个镜像都改前缀麻烦,直接配 daemon.jsonregistry-mirrors(见第八节)就能让所有 docker pull 走代理。

十四、常见问题速查

报错原因解决
permission denied 访问 /var/run/docker.sock当前用户不在 docker 组sudo usermod -aG docker $USER,重新登录
Cannot connect to the Docker daemondaemon 没起systemctl start docker
WARNING: IPv4 forwarding is disabled宿主机没开 ip_forwardecho "net.ipv4.ip_forward=1" >> /etc/sysctl.confsysctl -p
unknown or invalid runtime name: docker-runc老 docker 升级后 runtime 名变了grep -rl 'docker-runc' /var/lib/docker/containers/ | xargs sed -i 's/docker-runc/runc/g',重启 daemon
K8s 1.24+ 报 failed to create sandbox: cri-dockerd not found用了 docker 但没装 cri-dockerd shim装 cri-dockerd(见 6.3 节),kubelet 加 --cri-socket=unix:///var/run/cri-dockerd.sock
kubelet cgroup driver: "cgroupfs" is different from docker: "systemd"kubelet / docker cgroup driver 不一致双方都改成 systemd:daemon.json 加 "exec-opts": ["native.cgroupdriver=systemd"],kubelet 加 --cgroup-driver=systemd
image pull failed: toomanyrequestsDocker Hub 匿名拉取限流registry-mirrors 走国内 mirror,或登录 Docker Hub 账号

十五、小结

把这一篇的要点压缩成 7 条:

  1. 版本选型:Debian/Ubuntu 优先 docker.io(系统接管依赖),其他发行版走 docker-ce 官方源,商业场景评估 docker-ee / Mirantis 商业支持
  2. 离线部署:静态二进制 + systemd unit + daemon.json,三件套即可;K8s 1.24+ 别忘了 cri-dockerd
  3. buildx:2020 年后推荐用 docker buildx,多架构 + 缓存导出 + BuildKit 特性完胜老 docker build
  4. Compose v2:用空格 docker compose,v1 已弃用
  5. 关键配置daemon.jsonlog-driver / log-opts 一定要限制大小,否则生产会撑爆磁盘;K8s 节点必须开 live-restore
  6. 国内镜像:必须配 registry-mirrors,否则 docker pull 慢到怀疑人生
  7. 卸载干净:apt/yum remove 删不干净 /var/lib/docker,重装前手动清掉避免配置残留

下一步:装好 Docker 之后,最常被问到的就是"容器之间怎么通信"、“数据怎么持久化”——这正是下一篇《Docker 进阶与运维:网络模式、存储卷与镜像加速》要展开的内容。

参考资料

使用 Hugo 构建
主题 StackJimmy 设计