Docker 迁移

编译好的 Docker 镜像,可以方便地打包成一个文件(tar 格式),然后在其他电脑上导入运行。这种方法非常适合在没有直接访问互联网或者网络环境受限的情况下,迁移 Docker 镜像。

以下是将 Docker 镜像打包(导出)和导入的步骤:

在源电脑(镜像已编译好):

  1. 列出本地 Docker 镜像:
    首先,你需要知道要导出的镜像的名称或 ID。

    1
    docker images

    你会看到一个列表,其中包含 REPOSITORYTAGIMAGE IDCREATEDSIZE 等信息。

  2. 导出镜像为 tar 文件:
    使用 docker save 命令来将一个或多个镜像打包成一个 .tar 文件。

    1
    docker save -o <output_filename.tar> <image_name>:<tag>

    或者使用 Image ID:

    1
    docker save -o <output_filename.tar> <image_id>

    示例:
    假设你要导出的镜像是 my-custom-app:latest,并且你想将其保存为 my-custom-app.tar

    1
    docker save -o my-custom-app.tar my-custom-app:latest

    或者使用 Image ID(例如 a1b2c3d4e5f6):

    1
    docker save -o my-custom-app.tar a1b2c3d4e5f6

    这个命令会将所有包含这个镜像的层都打包到一个文件中。

    导出多个镜像:
    如果你想导出多个镜像,可以重复使用 -o 和指定多个镜像名/ID:

    1
    docker save -o my-apps.tar my-custom-app:latest another-app:v1.0
  3. 传输 tar 文件:
    将生成的 my-custom-app.tar 文件通过 U 盘、网络共享、FTP 等方式传输到目标电脑上。

在目标电脑上:

  1. 将 tar 文件传输到目标电脑:
    将你在源电脑上打包好的 .tar 文件复制到目标电脑上。

  2. 导入镜像:
    使用 docker load 命令来加载这个 .tar 文件,它会将里面的镜像导入到目标电脑的 Docker 守护进程中。

    1
    docker load -i <input_filename.tar>

    示例:
    假设你将 my-custom-app.tar 文件复制到了目标电脑的当前目录下:

    1
    docker load -i my-custom-app.tar

    这个命令会输出正在加载的镜像层信息,最后显示导入成功的镜像名称和标签。

  3. 验证导入的镜像:
    使用 docker images 命令来查看目标电脑上的 Docker 镜像列表,确认你的自定义镜像已经被成功导入。

    1
    docker images

    你应该能看到 my-custom-app:latest(或者你导出的名称和标签)。

  4. 运行导入的镜像:
    现在你可以像使用其他任何 Docker 镜像一样,运行你刚刚导入的镜像了。

    1
    docker run <image_name>:<tag>

    或者如果你之前是使用 docker-compose 构建并运行的,你可以在目标电脑上有一个相应的 docker-compose.yml 文件,它引用了你刚刚导入的镜像(如果 docker-compose.yml 文件中直接引用了镜像名,而没有 build 指令)。

    示例:

    1
    docker run my-custom-app:latest

    如果你有 docker-compose.yml 文件,并且该文件是直接引用镜像名(而不是 build 指令),那么 docker-compose up 应该就能直接工作。

优点:

  • 离线迁移: 适用于没有互联网连接或网络受限的环境。
  • 快速部署: 比在目标电脑上重新构建镜像(特别是如果构建过程复杂或耗时)要快得多。
  • 版本控制: 可以将特定的镜像版本打包,确保部署的一致性。

注意事项:

  • 镜像大小: 镜像文件可能会很大,尤其是包含完整操作系统和许多库的镜像。传输可能需要一些时间。
  • 依赖关系: docker save 只保存了镜像本身,不包含任何其他 Docker Compose 服务或外部依赖。如果你导出的是一个需要特定网络配置或数据库服务的镜像,你需要确保目标电脑上也有相应的配置和运行环境。
  • Docker 版本兼容性: 通常情况下,不同版本的 Docker 之间兼容性很好。但非常老旧的版本和新版本之间可能存在一些细微的差异,尽管这种情况很少见。
  • Windows 上的 Docker Desktop: 在 Windows 上,Docker Desktop 负责管理 Docker 守护进程(通常运行在 WSL 2 中)。docker savedocker load 命令是 Docker CLI 发送给 Docker Daemon 的指令,它们会正确处理 WSL 2 的后端。

通过 docker savedocker load,你可以非常方便地在不同电脑之间迁移 Docker 镜像,非常实用。