上一篇 下一篇 分享链接 返回 返回顶部

从零部署香港服务器 Docker:镜像加速、overlay2 与容器网络怎么配?

发布人:Minchunlin 发布时间:2026-10-07 15:24 阅读量:6

这套部署方案以一台香港地域、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 已经可达,但请求尚未携带认证信息。以下结果更值得关注:

一、准备条件与上线目标 2. 上线前检查配图

  • 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 文件系统。

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 devicedf -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 会把新目录当成空数据目录。正确迁移流程至少包括:

1 创建快照或完整备份;2 停止 Docker 并确认容器停止;3 使用保留权限、硬链接和扩展属性的方式复制数据;4 修改 data-root;5 启动 Doc

  1. 创建云硬盘快照或完整备份。
  2. 停止 Docker,确认所有容器已经停止。
  3. 使用保留权限、硬链接和扩展属性的方式复制数据。
  4. 修改 data-root 后启动 Docker。
  5. 验证容器、镜像、卷和网络。
  6. 保留旧目录一段时间,不要立即删除。

示例复制命令如下,执行前应确认源目录和目标挂载点:

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 网络:

net-test-web”

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. 容器本机可访问但公网无法访问

按由外到内的顺序检查:

  1. 云平台安全组是否放行目标 TCP 端口。
  2. 服务器系统防火墙是否放行目标端口。
  3. Docker 是否发布了正确的主机端口。
  4. 容器内应用是否监听在 0.0.0.0 而不是仅监听 127.0.0.1。
  5. 主机是否存在端口冲突或上游网络策略。
  6. 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 infoStorage 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 端口发布规则均与上线清单一致。