1. 离线环境下的Docker生态部署挑战

在企业的生产环境中,我们经常会遇到服务器无法连接外网的情况。可能是出于安全考虑的内网隔离,也可能是特殊场景下的网络限制。这时候想要部署Docker环境就会遇到各种麻烦——无法直接apt-get安装,不能pull镜像,甚至连基本的依赖都下载不了。

我去年就遇到过这样一个项目:客户要求在一台完全隔离的Ubuntu 18.04服务器上部署整套微服务系统。当时花了两天时间才摸清完整的离线部署方案,期间踩过的坑包括依赖缺失、版本冲突、镜像导出失败等等。现在把这些经验整理成这份全攻略,帮你避开我走过的弯路。

离线部署的核心难点在于三点:首先是基础安装包的获取,需要提前下载好所有依赖;其次是版本兼容性问题,不同Ubuntu版本对应的Docker包可能不同;最后是镜像的迁移方案,要确保导出的镜像在新环境能正常运行。接下来我们就从这三个维度展开,手把手带你完成整个离线部署流程。

2. Docker引擎的离线安装

2.1 准备工作:获取离线安装包

在能联网的机器上访问Docker官方仓库(https://download.docker.com/linux/ubuntu/dists/),找到对应Ubuntu版本的pool目录。以Ubuntu 20.04(focal)为例,需要下载以下三个核心deb包:

  • containerd.io_x.x.x-x_amd64.deb
  • docker-ce-cli_x.x.x~3-0~ubuntu-focal_amd64.deb
  • docker-ce_x.x.x~3-0~ubuntu-focal_amd64.deb

这里有个关键细节:一定要确认Ubuntu的codename(通过lsb_release -cs查看)。比如Ubuntu 18.04是bionic,20.04是focal,22.04是jammy。下载错版本会导致安装失败。

建议同时下载这些依赖包:

  • libltdl7_2.4.6-14_amd64.deb
  • docker-ce-rootless-extras_x.x.x~3-0~ubuntu-focal_amd64.deb
  • docker-scan-plugin_x.x.x~ubuntu-focal_amd64.deb

2.2 分步安装流程

将下载好的deb包通过U盘或内网传输到目标服务器,执行以下命令:

# 按依赖顺序安装
sudo dpkg -i containerd.io_1.4.12-1_amd64.deb
sudo dpkg -i docker-ce-cli_20.10.12~3-0~ubuntu-focal_amd64.deb
sudo dpkg -i docker-ce_20.10.12~3-0~ubuntu-focal_amd64.deb

# 处理可能缺少的依赖
sudo apt-get install -f

# 启动服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

# 验证安装
sudo docker run hello-world

如果最后一步报错"找不到hello-world镜像",这是正常的——因为现在是离线环境。我们真正需要确认的是docker服务是否正常运行:

sudo systemctl status docker

看到"active (running)"状态就说明安装成功了。建议此时执行docker --version记录下版本信息,后续安装docker-compose时需要版本匹配。

3. Docker Compose的离线部署

3.1 二进制文件安装方案

docker-compose的离线安装相对简单,直接从GitHub releases页面下载对应版本的二进制文件即可。以v2.20.0版本为例:

# 下载(在可联网机器操作)
wget https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-linux-x86_64

# 传输到目标服务器后执行
sudo install -o root -g root -m 755 docker-compose-linux-x86_64 /usr/local/bin/docker-compose

# 创建软链接(可选)
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 验证
docker-compose version

3.2 版本兼容性注意事项

这里有个隐藏的坑:docker-compose版本需要与Docker引擎版本匹配。经过实测,推荐以下组合:

Docker版本推荐Compose版本备注
20.10.xv2.12.x最稳定的生产环境组合
23.0.xv2.17.x新特性支持较好
24.0.xv2.20.x最新版本组合

如果版本不匹配,可能会遇到"unsupported API version"错误。这时要么升级Docker引擎,要么降级docker-compose版本。

4. Docker镜像的离线迁移方案

4.1 单镜像导出与导入

在源服务器上导出镜像:

# 查看已有镜像
docker images

# 导出到tar文件(推荐使用镜像ID而非名称)
docker save -o nginx-latest.tar 2b7d6430f78d

# 也可以批量导出
docker save -o all-images.tar image1 image2 image3

将tar文件拷贝到目标服务器后导入:

# 导入镜像
docker load -i nginx-latest.tar

# 查看导入结果
docker images

# 重命名镜像(可选)
docker tag 2b7d6430f78d nginx:latest

4.2 完整环境迁移技巧

对于需要迁移多个容器的场景,建议使用以下进阶方案:

  1. 在源服务器上导出所有容器配置:
docker ps -a > containers.list
  1. 对每个容器创建配置备份:
docker inspect <container-id> > container-<name>.json
  1. 导出所有相关镜像后,在新环境使用docker-compose重新部署:
version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./config:/etc/nginx

4.3 常见问题排查

如果导入后镜像无法运行,检查以下几点:

  • 使用docker history <image>查看镜像层级是否完整
  • 确认存储驱动一致(docker info | grep "Storage Driver")
  • 测试基础命令是否正常:docker run --rm -it <image> sh

5. 离线环境下的实用技巧

5.1 本地镜像仓库搭建

对于需要频繁部署的场景,建议在内网搭建私有仓库:

# 拉取registry镜像(提前在有网络环境操作)
docker pull registry:2

# 导出并导入到内网
docker save -o registry-2.tar registry:2

# 在内网启动仓库
docker run -d -p 5000:5000 --restart=always --name registry registry:2

然后就可以推送镜像到本地仓库:

docker tag nginx:latest localhost:5000/nginx
docker push localhost:5000/nginx

5.2 离线更新策略

当需要更新Docker版本时:

  1. 在有网络的机器访问:
    https://download.docker.com/linux/ubuntu/dists/<codename>/pool/stable/amd64/
    
  2. 下载新版deb包和所有依赖项
  3. 在内网按顺序安装:
    sudo dpkg -i containerd.io_new.deb
    sudo dpkg -i docker-ce-cli_new.deb
    sudo dpkg -i docker-ce_new.deb
    

5.3 资源清理与维护

离线环境尤其需要注意磁盘空间管理:

# 清理无用镜像
docker image prune -a

# 清理构建缓存
docker builder prune

# 查看磁盘使用情况
docker system df

建议设置定时任务每月自动清理,避免镜像堆积占满磁盘。

更多推荐