迁移docker image到别的服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 首先,将当前容器的内容保存为一个镜像
docker commit <container_id> <new_image_name>

# 将镜像保存为一个 tar 文件
docker save -o <path_to_tar_file> <new_image_name>

# 将生成的 tar 文件传输到目标机器
# 可以使用 scp、rsync 或其他文件传输工具
scp my_new_image.tar user@remote_host:/path/to/destination

# 在目标机器上,将 tar 文件加载为 Docker 镜像
docker load -i <path_to_tar_file>

# 从加载的镜像创建并运行新的容器
docker run -d --name <new_container_name> <new_image_name>

是的,你可以保存容器的配置内容,包括其环境变量、端口映射、挂载卷等。这可以通过 docker container inspect 命令获取容器的配置,然后在目标机器上使用相同的配置启动新的容器。以下是详细步骤:

1. 获取容器的配置

使用 docker container inspect 命令获取容器的配置,并将其保存到一个文件中:

1
docker container inspect <container_id> > container_config.json

2. 保存容器的镜像

将当前容器的内容保存为一个镜像:

1
docker commit <container_id> <new_image_name>

3. 保存镜像为文件

将镜像保存为一个 tar 文件:

1
docker save -o <path_to_tar_file> <new_image_name>

4. 传输镜像和配置文件

将生成的 tar 文件和配置文件传输到目标机器。例如,使用 scp

1
2
scp my_new_image.tar user@remote_host:/path/to/destination
scp my_container_config.json user@remote_host:/path/to/destination

5. 在目标机器上加载镜像

在目标机器上,将 tar 文件加载为 Docker 镜像:

1
docker load -i <path_to_tar_file>

6. 使用配置文件启动新容器

在目标机器上,可以参考 my_container_config.json 中的配置启动新的容器。你需要手动提取关键配置项并使用 docker run 命令。例如,如果配置文件显示容器使用了环境变量和端口映射:

1
docker run -d --name <new_container_name> -e ENV_VAR=value -p host_port:container_port <new_image_name>

为了简化这个过程,可以编写一个脚本来读取配置文件并启动容器。以下是一个简单的示例脚本,假设 my_container_config.json 中包含了所需的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

CONFIG_FILE="my_container_config.json"
IMAGE_NAME="my_new_image"
CONTAINER_NAME="my_new_container"

# 提取环境变量
ENV_VARS=$(jq -r '.[0].Config.Env[] | "-e " + .' $CONFIG_FILE)

# 提取端口映射
PORTS=$(jq -r '.[0].HostConfig.PortBindings | to_entries[] | "-p " + .key + ":" + .value[0].HostPort' $CONFIG_FILE)

# 启动新容器
docker run -d --name $CONTAINER_NAME $ENV_VARS $PORTS $IMAGE_NAME

确保你的目标机器上安装了 jq 工具用于解析 JSON 文件。这个脚本会从配置文件中提取环境变量和端口映射,并使用这些配置启动新的容器。