从零部署香港服务器 Docker:镜像加速、overlay2 与容器网络怎么配?
这套部署方案以一台香港地域、Ubuntu Server 22.04/24.04 LTS、x86_64/amd64 架构的新服务器为例,目标是安装 Docker Engine,确认 overlay2 存储驱动可用,为 Docker Hub 配置由服务商或企业提供的镜像加速地址,并建立可复用的自定义容器网络。香港地域不会改变 Docker 的安装方式,但可能影响访问境外镜像仓库时的延迟、DNS 解析和连接稳定性,因此镜像加速、网络连通性和回滚配置需要单独验证。
文中的命令默认通过 SSH 以具备 sudo 权限的账号执行。示例中的镜像地址、网段和端口均为演示值,不能直接替代生产环境规划。正式上线前,应确认服务器快照、云平台安全组、系统防火墙、数据盘挂载状态以及业务端口清单。
面向香港地区的 Docker 部署场景,A5数据提供入门建站、Xeon Gold 与 AMD EPYC 等物理服务器方案,配备 SSD 或 NVMe 存储及不同内存规格,可承载网站、业务后台、数据库、接口服务和多容器任务。部分产品提供 CN2 与国际带宽选择,能够结合访问地区、应用负载和网络需求,为容器化业务提供相应的计算、存储与网络资源基础。
一、准备条件与上线目标
1. 适用环境
本文按以下环境编写:
| 项目 | 示例值 |
|---|---|
| 服务器地域 | 香港 |
| 操作系统 | Ubuntu Server 22.04 LTS 或 24.04 LTS |
| CPU 架构 | amd64,uname -m 应为 x86_64 |
| Docker 形态 | Docker Engine、containerd、Buildx、Compose Plugin |
| 存储驱动 | overlay2 |
| 默认容器网络 | Docker bridge |
| 业务网络 | 自定义 bridge 网络 |
| 公开端口 | 按业务需要开放,通常只考虑 22、80、443 |
| 镜像加速 | 服务商、企业内部或可信仓库提供的 Registry Mirror |
如果系统是 Debian、CentOS、Rocky Linux 或 ARM64 架构,不建议直接复制本文的 APT 仓库命令。先确认系统信息:
cat /etc/os-release
uname -m
dpkg --print-architecture
预期结果应类似:
Ubuntu 24.04.1 LTS
x86_64
amd64
如果架构显示为 aarch64 或 arm64,Docker 本身仍可安装,但镜像必须提供对应架构,部分闭源应用镜像可能无法直接运行。
2. 上线前检查
先确认磁盘、时间、DNS 和外网访问情况:
timedatectl
df -h
df -ih
getent hosts download.docker.com
getent hosts registry-1.docker.io
curl -4I https://registry-1.docker.io/v2/
访问 Docker Registry API 时返回 401 Unauthorized 并不一定是故障,它通常表示 Registry 已经可达,但请求尚未携带认证信息。以下结果更值得关注:

Could not resolve host:DNS 解析失败。Connection timed out:出站连接、路由或云平台安全策略存在问题。SSL certificate problem:系统时间、CA 证书或中间网络设备可能异常。- 返回
401:通常说明网络链路已打通。
检查服务器是否已有 Docker 或其他容器运行时:
command -v docker || true
docker version 2>/dev/null || true
systemctl status docker --no-pager 2>/dev/null || true
systemctl status containerd --no-pager 2>/dev/null || true
如果是已有业务的服务器,不要直接卸载旧版本或清空 /var/lib/docker。先保存现状:
docker ps -a 2>/dev/null || true
docker network ls 2>/dev/null || true
docker volume ls 2>/dev/null || true
docker info 2>/dev/null || true
Docker 数据目录、镜像、容器、卷和网络配置都可能位于 /var/lib/docker。删除该目录会导致容器和镜像数据不可恢复,应在备份或云硬盘快照完成后再进行任何迁移操作。
二、安装 Docker Engine
1. 添加 Docker 软件仓库
以下命令适用于 Ubuntu 22.04 和 24.04。先安装 HTTPS 仓库所需的基础依赖:
sudo apt update
sudo apt install -y ca-certificates curl gnupg
创建 APT 密钥目录并导入 Docker 仓库公钥:
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL \
https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
写入软件源。命令会优先使用 Ubuntu 提供的 UBUNTU_CODENAME:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
更新软件包索引并检查 Docker 包是否可见:
sudo apt update
apt-cache policy docker-ce
如果 Candidate 显示为版本号,说明软件源已生效。若显示为 Candidate: (none),优先排查以下问题:
- 系统不是 Ubuntu,或者 Ubuntu 版本过旧。
- 软件源中的代号与系统代号不匹配。
- DNS 无法解析
download.docker.com。 - 系统时间错误导致 HTTPS 证书验证失败。
- 云平台出站策略限制了访问。
2. 安装组件并启动服务
安装 Docker Engine、命令行工具、containerd、Buildx 和 Compose Plugin:
sudo apt install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
设置 Docker 开机启动并立即运行:
sudo systemctl enable --now docker
sudo systemctl status docker --no-pager
确认客户端和服务端版本:
docker version
docker compose version
正常情况下可以看到 Client、Server 和 Compose 的版本信息。版本号会随软件仓库中的可用版本变化,不应把某个固定版本号当作安装成功的唯一标准。
3. 首次运行验证
执行测试容器:
sudo docker run --rm hello-world
预期会出现包含以下含义的提示:
Hello from Docker!
Your installation appears to be working correctly.
如果测试容器无法拉取,不要立即重复安装 Docker。先检查:
sudo systemctl is-active docker
docker info
curl -4I https://registry-1.docker.io/v2/
Docker 服务正常但拉取失败,通常属于镜像仓库访问、DNS、认证或镜像加速配置问题,而不是 Docker Engine 未安装。
三、配置镜像加速与 Docker 守护进程
1. 镜像加速的适用边界
Docker Registry Mirror 主要用于改善 Docker Hub 公共镜像的拉取路径,不等于所有镜像仓库都会自动加速。
以下对象需要分别处理:
- Docker Hub 公共镜像:可以通过
registry-mirrors配置镜像加速。 - 企业私有仓库:应直接使用类似
registry.example.com/team/app:1.0.0的完整地址,并配置认证。 - 需要登录的公共或私有仓库:镜像加速地址不一定能够代替登录,仍需执行
docker login。 - 多架构镜像:加速服务还必须完整同步目标架构的 Manifest 和 Blob。
- 构建阶段的基础镜像:BuildKit 通常仍会读取 Docker 守护进程的 Registry 配置,但应通过实际构建验证。
不要随意复制来源不明的公共镜像地址。镜像加速服务可以看到镜像请求信息,且同步延迟、限流、镜像完整性和服务可用性都可能存在差异。正式环境优先使用云厂商、企业内部或团队明确维护的 Registry Mirror。
2. 备份 Docker 配置
如果服务器是新安装环境,通常还没有 /etc/docker/daemon.json。仍建议先备份目录:
if [ -d /etc/docker ]; then
sudo cp -a /etc/docker "/root/docker-config-backup-$(date +%F-%H%M%S)"
fi
sudo install -d -m 0755 /etc/docker
如果 /etc/docker/daemon.json 已经存在,不能用新的内容直接覆盖。应先查看并合并已有配置:
sudo cat /etc/docker/daemon.json
3. 编写基础配置
在全新 Ubuntu 主机上,可以使用以下配置。storage-driver 仅适合确认数据目录为空或当前已经使用 overlay2 的场景:
{
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
配置项含义如下:
storage-driver: overlay2:指定本地镜像层和容器可写层使用overlay2。log-driver: json-file:使用 Docker 默认 JSON 日志驱动。max-size和max-file:限制单个容器日志文件大小及轮转数量,避免日志持续增长占满系统盘。
对于已经运行容器的服务器,不要仅为了“统一配置”就切换存储驱动。切换存储驱动后,原有镜像和容器可能无法在新驱动下直接识别。先执行:
docker info --format 'Storage Driver: {{.Driver}}'
如果已经输出 overlay2,无需重复切换。
4. 添加镜像加速地址
在 JSON 顶层加入 registry-mirrors。以下地址是格式示例,必须替换成实际取得的可信地址,不能把示例域名直接用于生产:
{
"registry-mirrors": [
"https://YOUR_MIRROR_ENDPOINT"
],
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
编辑文件:
sudoedit /etc/docker/daemon.json
注意 JSON 的格式要求:
- 属性名和字符串必须使用双引号。
- 最后一项后面不能有逗号。
- 同一个属性不能重复出现。
registry-mirrors必须是数组。- 不要把带说明文字的注释写入 JSON。
先校验 JSON:
sudo python3 -m json.tool /etc/docker/daemon.json > /dev/null
没有输出且退出码为 0,说明 JSON 语法正确。随后重启 Docker:
sudo systemctl restart docker
sudo systemctl status docker --no-pager
重启会短暂影响正在运行的容器。生产环境应安排维护窗口,并提前确认容器是否配置了自动重启策略。
5. 验证镜像加速是否生效
查看 Docker 已加载的配置:
docker info
关注输出中的两部分:
Storage Driver: overlay2
Registry Mirrors:
https://YOUR_MIRROR_ENDPOINT/
也可以直接筛选:
docker info 2>/dev/null | grep -A5 -E 'Storage Driver|Registry Mirrors'
使用一个小型公共镜像进行拉取测试:
docker pull alpine:3.20
检查本地镜像:
docker image inspect alpine:3.20 \
--format 'Image={{.RepoTags}} Size={{.Size}} Created={{.Created}}'
如果镜像仓库提供 Registry API,可测试其 /v2/ 端点:
curl -I https://YOUR_MIRROR_ENDPOINT/v2/
返回 200 或需要认证的 401,通常说明 Registry API 可访问。返回 404、连接超时或证书错误时,应先修正镜像地址或网络环境。
镜像加速并不保证每次都比直连更快。如果加速服务出现同步延迟、限流或某个镜像不存在,可以临时移除 registry-mirrors 配置后重启 Docker,再通过原始仓库测试。不要在生产环境中同时堆叠多个未经验证的镜像地址。
四、确认并配置 overlay2 存储
1. overlay2 与容器网络不是一回事
overlay2 是 Docker 的本地存储驱动,负责管理镜像层、容器可写层和 Copy-on-Write 文件系统。

Docker 的 bridge、host、none 等是容器网络模式,负责容器之间以及容器与主机之间的通信。两者互不替代:
- 启用
overlay2不会自动创建多主机容器网络。 - 创建 bridge 网络也不会改变 Docker 的存储驱动。
- 多主机网络、Swarm 等场景另有网络控制面,不属于本机 Docker bridge 配置。
2. 检查底层文件系统
执行以下命令查看 Docker 数据目录所在的文件系统:
findmnt -T /var/lib/docker -o TARGET,SOURCE,FSTYPE,OPTIONS
df -h /var/lib/docker
df -ih /var/lib/docker
Docker 数据目录应位于本地、稳定且有足够空间的文件系统上。常见可用组合包括:
- ext4。
- XFS,且
ftype=1。 - 具备相应内核支持的本地文件系统。
查看 Docker 实际使用的存储驱动:
docker info --format \
'Driver={{.Driver}}
BackingFilesystem={{.DriverStatus}}'
更完整地查看存储相关信息:
docker info | sed -n '/Storage Driver/,+8p'
典型结果可能类似:
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Using metacopy: false
XFS 文件系统需要进一步确认 ftype=1:
MOUNT_POINT=$(findmnt -n -o TARGET -T /var/lib/docker)
sudo xfs_info "$MOUNT_POINT" 2>/dev/null | grep -o 'ftype=[01]' || true
如果输出 ftype=0,不应通过设置 overlay2.override_kernel_check 强行绕过检查。更稳妥的做法是使用新的 ext4 文件系统,或重新格式化为启用目录类型支持的 XFS。重新格式化会删除目标分区全部数据,必须先完成备份、卸载和业务迁移。
3. 检查磁盘空间与 inode
镜像层和容器日志可能分别消耗块空间与 inode。即使 df -h 还有空间,inode 耗尽也会导致创建文件失败:
df -h /var/lib/docker
df -ih /var/lib/docker
sudo du -xhd1 /var/lib/docker | sort -h
常见现象与判断方式:
| 现象 | 优先检查项 | 处理方向 |
|---|---|---|
no space left on device | df -h、容器日志 | 清理无用镜像、限制日志、扩容 |
| 创建文件失败但磁盘仍有空间 | df -ih | 检查 inode 使用率 |
| Docker 启动失败并提示 overlay | 文件系统类型、XFS ftype | 更换或迁移到兼容文件系统 |
| 镜像层增长过快 | 镜像版本、构建缓存、日志 | 优化镜像、设置保留策略 |
| 重启后容器数据异常 | data-root、挂载顺序 | 检查数据盘是否成功挂载 |
不要在不了解影响范围时直接执行:
docker system prune -a
该命令可能删除未被容器引用的镜像和构建缓存。生产环境清理前应先列出容器、镜像和卷,并确认没有依赖这些资源的回滚版本。
4. 将 Docker 数据目录迁移到独立数据盘
如果系统盘容量较小,可以把 Docker 数据目录放在独立数据盘。新主机最简单的方式是:先完成数据盘挂载,再设置 data-root,最后启动 Docker。
先确认目标目录确实位于数据盘,而不是普通目录:
findmnt -T /data/docker
df -h /data/docker
如果 findmnt 没有返回预期的设备,先配置 /etc/fstab,使用 blkid 获取 UUID:
lsblk -f
sudo blkid
不要根据示例设备名直接编辑生产环境的 /etc/fstab。挂载点确认后,在 /etc/docker/daemon.json 中加入:
{
"data-root": "/data/docker",
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
启动前验证:
sudo systemctl stop docker
sudo python3 -m json.tool /etc/docker/daemon.json > /dev/null
sudo systemctl start docker
docker info --format 'DockerRootDir={{.DockerRootDir}} Driver={{.Driver}}'
findmnt -T /data/docker
预期结果应包含:
DockerRootDir=/data/docker Driver=overlay2
对于已经存在镜像和容器的主机,不能只修改 data-root 后启动,否则 Docker 会把新目录当成空数据目录。正确迁移流程至少包括:

- 创建云硬盘快照或完整备份。
- 停止 Docker,确认所有容器已经停止。
- 使用保留权限、硬链接和扩展属性的方式复制数据。
- 修改
data-root后启动 Docker。 - 验证容器、镜像、卷和网络。
- 保留旧目录一段时间,不要立即删除。
示例复制命令如下,执行前应确认源目录和目标挂载点:
sudo systemctl stop docker
sudo rsync -aHAX --numeric-ids /var/lib/docker/ /data/docker/
迁移成功后,如果需要回滚,必须先停止 Docker,再把迁移期间产生的新数据同步回旧目录,随后恢复原配置。不能仅修改配置文件就认定数据已经回滚。
五、配置 Docker 容器网络
1. 先确认主机路由和端口
Docker 创建自定义网段前,先查看主机现有路由:
ip -4 route
ip -6 route
如果主机、云平台 VPC、办公网络或其他容器网络已经使用 172.30.0.0/16,就不要重复使用该网段。网段冲突会导致容器能够启动,但访问外部服务或访问主机内网时出现路由错误。
查看当前 Docker 网络:
docker network ls
docker network inspect bridge
查看主机端口占用:
sudo ss -lntp
2. 创建自定义 bridge 网络
假设检查确认 172.30.0.0/16 没有冲突,可以创建名为 app_net 的自定义 bridge 网络:

docker network create \
--driver bridge \
--subnet 172.30.0.0/16 \
--gateway 172.30.0.1 \
app_net
确认网络参数:
docker network inspect app_net \
--format '{{json .IPAM.Config}}'
预期会看到包含网段和网关的信息:
[{"Subnet":"172.30.0.0/16","Gateway":"172.30.0.1"}]
自定义 bridge 网络相较于默认 bridge 的主要优势是:
- 同一网络中的容器可以通过容器名或 Compose 服务名解析。
- 可以按应用、环境或项目划分网络。
- 不需要把容器 IP 写死。
- 可以通过
docker network connect和docker network disconnect调整成员。
不要把容器 IP 当作长期配置。容器重建后 IP 可能改变,应用之间应使用服务名访问,例如 http://api:8080 或 db:5432。
3. 用临时容器验证容器间通信
启动一个临时 Web 容器:
docker run -d \
--name net-test-web \
--network app_net \
nginx:1.27-alpine
使用同一网络中的另一个容器访问它:
docker run --rm \
--network app_net \
busybox:1.36 \
wget -qO- http://net-test-web
如果输出包含 Nginx HTML 内容,说明以下链路正常:
app_net网络创建成功。- 容器加入网络成功。
- 内置 DNS 能够解析
net-test-web。 - 容器之间的 TCP 80 端口可达。
查看临时容器的地址:
docker inspect net-test-web \
--format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
测试完成后,只删除本次创建且名称明确的测试资源:
docker rm -f net-test-web
如果 wget 报错,可以分别检查:
docker network inspect app_net
docker logs net-test-web
docker exec net-test-web cat /etc/resolv.conf
4. 配置端口发布
容器端口只有在发布到主机后,外部客户端才能访问。下面的命令仅绑定服务器本机回环地址:
docker run -d \
--name local-web-test \
--network app_net \
-p 127.0.0.1:18080:80 \
nginx:1.27-alpine
在服务器本机测试:
curl -I http://127.0.0.1:18080
127.0.0.1:18080:80 的含义是:
- 主机监听地址:
127.0.0.1 - 主机端口:
18080 - 容器端口:
80
如果需要让公网访问,才使用类似以下形式:
docker run -d \
--name public-web-test \
--network app_net \
-p 18080:80 \
nginx:1.27-alpine
此时 Docker 会在主机的多个地址上发布端口。公网开放前,应同时检查云安全组、系统防火墙和应用自身访问控制。数据库、缓存、管理后台等服务通常不应直接使用 -p 0.0.0.0:端口:端口 暴露到公网。
5. 使用 Compose 固化网络配置
对多容器应用,建议将网络、端口和服务依赖写入 Compose 文件。下面是一个结构示例,app 镜像地址需要替换为实际应用镜像:
services:
web:
image: nginx:1.27-alpine
restart: unless-stopped
ports:
- "80:80"
networks:
- app_net
depends_on:
- app
app:
image: your-registry.example.com/team/app:1.0.0
restart: unless-stopped
expose:
- "8080"
networks:
- app_net
environment:
APP_ENV: production
networks:
app_net:
driver: bridge
ipam:
config:
- subnet: 172.30.0.0/16
gateway: 172.30.0.1
启动前检查 Compose 文件格式:
docker compose config
如果只想检查并查看最终展开配置,可以执行:
docker compose config --services
docker compose config --networks
启动:
docker compose up -d
查看服务、网络和日志:
docker compose ps
docker network inspect app_net
docker compose logs --tail=100
在 Compose 网络中,web 可以通过服务名访问 app,例如:
http://app:8080
不应使用宿主机公网 IP 或固定容器 IP 代替服务名。若服务需要访问宿主机上的其他程序,应单独设计访问地址、监听地址和防火墙规则。
6. DNS、转发和 MTU 检查
查看 Docker 是否能够在容器内解析外部域名:
docker run --rm \
--network app_net \
alpine:3.20 \
nslookup registry-1.docker.io
查看内核转发状态:
sysctl net.ipv4.ip_forward
通常 Docker bridge 需要 IPv4 转发。如果输出为 net.ipv4.ip_forward = 0,不要在不了解云平台网络策略的情况下直接修改防火墙和内核参数。先检查 Docker 服务日志及现有系统网络配置。需要调整时,应保存 /etc/sysctl.conf 或 /etc/sysctl.d/ 相关文件,并在变更窗口内验证。
检查网卡 MTU:
ip link
docker network inspect bridge
如果容器访问特定站点出现大包丢失、TLS 连接中断或部分页面加载失败,再结合上游网络确认 MTU。不要仅凭“香港服务器”这一地域信息强行把 Docker 网络 MTU 改成某个固定值。错误的 MTU 配置可能导致普通连接也异常。
六、常见失败处理
1. Docker 服务无法启动
先看服务状态和最近日志:
sudo systemctl status docker --no-pager
sudo journalctl -u docker -n 100 --no-pager
如果刚修改过 daemon.json,优先检查 JSON 格式:
sudo python3 -m json.tool /etc/docker/daemon.json
常见原因包括:
- JSON 最后一项多了逗号。
- 配置项名称拼写错误。
- 同一个配置项重复出现。
registry-mirrors不是数组。data-root路径不存在或未挂载。- 指定了不兼容的
storage-driver。 - Docker 端口或 Unix Socket 被其他进程占用。
需要恢复时,不要删除 Docker 数据目录。先停止服务并恢复配置备份:
sudo systemctl stop docker
sudo mv /etc/docker/daemon.json \
"/etc/docker/daemon.json.failed-$(date +%F-%H%M%S)"
sudo systemctl start docker
sudo systemctl status docker --no-pager
如果原配置有备份,应从明确的备份文件恢复,而不是随意创建一个新配置覆盖生产设置。
2. 镜像拉取超时或认证失败
执行:
docker info
getent hosts registry-1.docker.io
curl -4I https://registry-1.docker.io/v2/
docker pull alpine:3.20
根据结果判断:
- DNS 失败:检查
/etc/resolv.conf、云平台 DNS 和容器 DNS。 curl超时:检查服务器出站策略、路由和安全设备。- 只有镜像加速地址失败:临时移除该地址,验证直连路径。
- 私有仓库返回认证错误:执行针对该仓库的
docker login,不要把账号密码写进 Compose 文件。 - 拉取公共镜像正常、拉取私有镜像失败:镜像仓库权限或认证配置有问题,不是 Docker 网络基础故障。
3. overlay2 不可用
检查:
docker info | sed -n '/Storage Driver/,+8p'
findmnt -T /var/lib/docker
df -h /var/lib/docker
df -ih /var/lib/docker
如果是 XFS,再确认:
MOUNT_POINT=$(findmnt -n -o TARGET -T /var/lib/docker)
sudo xfs_info "$MOUNT_POINT" 2>/dev/null | grep -o 'ftype=[01]' || true
ftype=0 时,不要强制启动 overlay2。选择兼容的本地文件系统并迁移 Docker 数据。迁移前必须停止 Docker、备份数据并保留旧目录。
4. 自定义网络创建失败
如果提示网段已被占用,查看现有路由和 Docker 网络:
ip -4 route
docker network ls
docker network inspect $(docker network ls -q)
换用没有冲突的私有网段,例如 172.31.0.0/16,但仍需要先核对主机和云 VPC 路由。
如果容器启动时报端口已占用:
sudo ss -lntp | grep ':18080'
可以更换主机端口,或停止占用端口的服务。不要为了让容器启动而直接杀掉未知进程。
5. 容器本机可访问但公网无法访问
按由外到内的顺序检查:
- 云平台安全组是否放行目标 TCP 端口。
- 服务器系统防火墙是否放行目标端口。
- Docker 是否发布了正确的主机端口。
- 容器内应用是否监听在
0.0.0.0而不是仅监听127.0.0.1。 - 主机是否存在端口冲突或上游网络策略。
- IPv4 和 IPv6 访问是否使用了不同监听地址。
查看端口发布:
docker ps
docker port local-web-test
sudo ss -lntp
Docker 发布端口可能绕过部分基于 UFW 的预期规则,具体取决于系统的 iptables/nftables 配置。调整防火墙前应保存规则,并先确认只影响目标端口。不要为了临时测试直接清空防火墙规则。
七、上线前结果检查
完成安装、镜像配置、存储检查和网络测试后,可以按以下顺序验收:
systemctl is-enabled docker
systemctl is-active docker
docker version
docker compose version
docker info --format \
'RootDir={{.DockerRootDir}}
Driver={{.Driver}}
LoggingDriver={{.LoggingDriver}}'
docker info | grep -A5 'Registry Mirrors' || true
docker image ls
docker network ls
docker ps -a
建议至少确认以下结果:
| 验收项目 | 检查命令 | 通过条件 |
|---|---|---|
| Docker 开机启动 | systemctl is-enabled docker | 返回 enabled |
| Docker 当前状态 | systemctl is-active docker | 返回 active |
| 服务端可用 | docker version | 能看到 Server 信息 |
| Compose 可用 | docker compose version | 返回 Compose 版本 |
| 存储驱动 | docker info | Storage Driver: overlay2 |
| 数据目录 | docker info | 与预期系统盘或数据盘一致 |
| 镜像加速 | docker info | 能看到可信镜像加速地址 |
| 镜像拉取 | docker pull alpine:3.20 | 下载完成且无超时 |
| 自定义网络 | docker network inspect app_net | 网段、网关和容器成员正确 |
| 容器 DNS | 同网络临时容器访问服务名 | 能解析并建立连接 |
| 端口发布 | docker port、ss -lntp | 仅暴露计划中的端口 |
| 磁盘空间 | df -h、df -ih | 块空间和 inode 均有余量 |
| 日志轮转 | docker inspect 容器名 | 使用了预期日志驱动和限制 |
如果业务使用 Compose,还应执行:
docker compose config
docker compose ps
docker compose logs --tail=100
确认容器状态为 Up,健康检查为 healthy 或业务定义的正常状态。仅看到容器进程存在,并不能证明应用端口、数据库连接和外部访问已经正常。
八、回滚与恢复检查项
1. 回滚镜像加速和 daemon 配置
如果加入镜像加速后 Docker 无法启动,先停止服务并恢复变更前配置:
sudo systemctl stop docker
sudo cp -a /etc/docker/daemon.json \
"/root/daemon.json.after-change-$(date +%F-%H%M%S)"
然后使用之前保存的配置恢复:
sudo cp -a /root/docker-config-backup-YYYY-MM-DD-HHMMSS/daemon.json \
/etc/docker/daemon.json
sudo python3 -m json.tool /etc/docker/daemon.json > /dev/null
sudo systemctl start docker
sudo systemctl status docker --no-pager
上面的备份路径需要替换为实际存在的目录。若只需要移除镜像加速,也可以编辑配置删除 registry-mirrors,保留已经验证的 data-root、日志和存储配置。
2. 回滚数据目录迁移
回滚前先停止 Docker:
sudo systemctl stop docker
如果新数据目录在验证期间产生了新容器、镜像或卷,先将其备份或反向同步。确认不需要保留新目录的数据后,再把 data-root 恢复为原路径:
{
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
启动并检查:
sudo systemctl start docker
docker info --format 'DockerRootDir={{.DockerRootDir}} Driver={{.Driver}}'
docker ps -a
docker volume ls
不要直接执行以下命令作为常规回滚手段:
sudo rm -rf /var/lib/docker
该操作会删除 Docker 的镜像、容器、网络和本地卷数据,只有在已经完成独立备份、明确放弃原数据并经过再次确认时才可能使用。
3. 回滚测试网络和端口
只删除本次创建且确认不承载业务的资源:
docker rm -f local-web-test 2>/dev/null || true
docker rm -f public-web-test 2>/dev/null || true
docker network rm app_net
如果 app_net 已被 Compose 或生产容器使用,不能执行 docker network rm。先查看成员:
docker network inspect app_net
确认业务容器已迁移到其他网络后,再进行删除。端口回滚则应停止对应容器,并检查主机端口是否恢复空闲:
sudo ss -lntp
4. 最终回滚检查清单
- 已保存 Docker 配置、Compose 文件和云平台磁盘快照。
- 已记录变更前的
docker info、容器、镜像、卷和网络列表。 daemon.json已通过 JSON 语法检查。- Docker 服务可以停止、启动并正常返回
active。 storage-driver没有在已有生产数据上被强制切换。data-root修改前已确认数据盘挂载,回滚时没有遗漏迁移期间的新数据。- 镜像加速地址出现异常时,可以恢复直连仓库配置。
- 业务端口和数据库端口没有因回滚被意外暴露到公网。
- 删除测试容器和测试网络前,已确认名称没有被正式业务占用。
- 云安全组、系统防火墙和 Docker 端口发布规则均与上线清单一致。



