断网救急!手把手教你用U盘完成Docker环境迁移(Ubuntu版)

当你在工业现场调试设备时,突然发现网络中断,而客户的生产线正等着你的Docker环境部署——这种场景对工程师来说简直是噩梦。本文将分享一套经过实战验证的U盘迁移方案,让你在完全离线的环境下,15分钟内恢复完整的Docker工作环境。

1. 准备工作:制作便携式安装U盘

选择Ubuntu 20.04 LTS(Focal)作为基准系统并非偶然。这个长期支持版本不仅稳定,其官方deb包还保留了完整的依赖关系链,特别适合离线安装。以下是制作安装U盘的关键步骤:

  1. 下载官方deb包组合

    wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/{containerd.io_*.deb,docker-ce_*.deb,docker-ce-cli_*.deb}
    
  2. 验证文件完整性(重要!):

    sha256sum docker-ce_*.deb > checksums.txt
    
  3. U盘目录结构建议

    /docker-offline/
    ├── deb-packages/
    │   ├── containerd.io_1.4.12-1_amd64.deb
    │   ├── docker-ce-cli_20.10.12~3-0~ubuntu-focal_amd64.deb
    │   └── docker-ce_20.10.12~3-0~ubuntu-focal_amd64.deb
    ├── docker-compose
    └── images/
        └── app-backup.tar
    

提示:建议使用exFAT格式的U盘,既能支持大文件又兼容Linux/Windows双系统

2. 离线安装核心组件

2.1 Docker引擎安装

在目标机器上执行以下命令序列时,注意观察依赖报错(虽然官方包通常能自动解决):

sudo dpkg -i containerd.io_*.deb
sudo dpkg -i docker-ce-cli_*.deb
sudo dpkg -i docker-ce_*.deb

常见问题处理:

  • 若出现libseccomp2依赖错误,可从Ubuntu官方仓库下载对应版本的deb包
  • 工业设备常遇到的时区问题可通过以下命令预防:
    sudo timedatectl set-timezone Asia/Shanghai
    

2.2 极简版docker-compose部署

不同于常规的Python安装方式,我们采用静态编译的二进制文件:

sudo cp docker-compose /usr/local/bin/
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose

验证安装:

docker-compose --version
# 输出应类似:Docker Compose version v2.3.3

3. 镜像迁移的两种策略对比

3.1 docker save vs docker export

特性docker savedocker export
保存格式分层存储(完整镜像)扁平化文件系统(仅容器快照)
元数据保留完整保留标签、历史记录仅保留文件系统
典型用途镜像备份/迁移容器状态快照
恢复命令docker loaddocker import
文件大小较大(保留所有层)较小(单层)

实战建议:

  • 需要完整开发环境时用docker save
    docker save -o /mnt/usb/images/full-env.tar myapp:1.2
    
  • 只需运行态数据时用docker export
    docker export mycontainer > /mnt/usb/data/container-snapshot.tar
    

4. 断网环境下的生存技巧

4.1 容器自启动方案

/etc/systemd/system/下创建服务单元:

[Unit]
Description=MyApp Container
After=docker.service

[Service]
Restart=always
ExecStart=/usr/bin/docker start -a myapp
ExecStop=/usr/bin/docker stop -t 2 myapp

[Install]
WantedBy=multi-user.target

启用服务:

sudo systemctl daemon-reload
sudo systemctl enable myapp-container

4.2 空间不足的应急处理

当U盘空间紧张时,可以:

  1. 清理Docker缓存:
    docker system prune -af
    
  2. 使用--exclude参数选择性备份:
    tar -cvf backup.tar --exclude='*.log' appdata/
    
  3. 压缩镜像(节省30%-50%空间):
    docker save myapp:1.2 | gzip > myapp-1.2.tar.gz
    

5. 实战案例:工业控制器迁移

某PLC控制系统的Docker环境包含:

  • ModbusTCP网关容器
  • 数据采集服务
  • 时序数据库

迁移步骤:

  1. 在联网机器上打包完整环境:

    docker save modbus-gateway:2.1 data-collector:1.4 influxdb:1.8 > plc-system.tar
    
  2. 将tar文件和安装包拷贝到U盘

  3. 在目标设备上:

    docker load < plc-system.tar
    docker network create plc-net
    docker run -d --net=plc-net --restart unless-stopped --name modbus modbus-gateway:2.1
    

注意:工业现场务必测试容器启动顺序,可使用depends_on或健康检查机制

这套方案已在多个智能制造现场验证,最典型的成功案例是在某汽车焊装车间,工程师仅用8分钟就恢复了因网络故障瘫痪的视觉检测系统。关键点在于提前准备好包含所有依赖的U盘工具包,并定期更新镜像备份。

更多推荐