Docker 镜像迁移有几种方法,具体可以根据你的需求选择适合的方式。以下是几种常见的 Docker 镜像迁移方法:
1. 使用 docker save
和 docker load
这种方法适用于在本地文件系统之间传输镜像。
步骤:
-
在源主机上,将镜像保存为一个 tar 文件:
1
docker save -o <保存文件名>.tar <镜像名>:<标签>
示例:
1
docker save -o myimage.tar myimage:latest
-
将生成的 tar 文件传输到目标主机。可以使用 SCP、FTP 等工具进行传输。
- 如果是wsl可以使用以下指令
1
2
3
4
5
6➜ ~ docker save portainer:2.16.2 -o portainer.2.16.2.tar
➜ ~ find portainer.2.16.2.tar
portainer.2.16.2.tar
➜ ~ ls
get-docker.sh portainer.2.16.2.tar snap
➜ ~ mv portainer.2.16.2.tar /mnt/d -
在目标主机上加载镜像:
1
docker load -i <保存文件名>.tar
示例:
1
2
3
docker load -i myimage.tar
2. 使用 Docker Registry
这种方法适用于通过网络传输镜像,特别是需要在多个主机之间传输镜像时。
步骤:
-
在源主机上,将镜像推送到 Docker Registry(可以是 Docker Hub,或是自建的私有 Registry):
1
2docker tag <镜像名>:<标签> <registry>/<镜像名>:<标签>
docker push <registry>/<镜像名>:<标签>示例:
1
2docker tag myimage:latest myregistry.com/myimage:latest
docker push myregistry.com/myimage:latest -
在目标主机上,从 Docker Registry 拉取镜像:
1
docker pull <registry>/<镜像名>:<标签>
示例:
1
docker pull myregistry.com/myimage:latest
3. 使用 docker save
和 docker import
这种方法适用于需要在迁移时修改镜像内容的情况。
步骤:
-
在源主机上,将镜像保存为一个 tar 文件:
1
2
3
docker save -o <保存文件名>.tar <镜像名>:<标签>示例:
1
2
3
docker save -o myimage.tar myimage:latest -
将生成的 tar 文件传输到目标主机。
-
在目标主机上,通过
docker import
创建一个新的镜像:1
2
3
cat <保存文件名>.tar | docker import - <新镜像名>:<标签>示例:
1
2
3
cat myimage.tar | docker import - mynewimage:latest
4. 使用 docker export
和 docker import
- 使用
docker export
和docker import
时,不会导出或导入容器的卷(volumes)、网络配置或环境变量等元数据。 - 如果你需要迁移或备份整个容器(包括其状态、配置和卷),你可能需要考虑使用其他工具或方法,如
docker save
和docker load
(针对镜像及其依赖项)或自定义脚本来备份卷和网络配置。
这种方法适用于容器的迁移,尤其是需要保留容器状态的情况。
步骤:
-
在源主机上,停止并导出容器:
1
2docker stop <容器ID>
docker export <容器ID> -o <保存文件名>.tar示例:
1
2docker stop mycontainer
docker export mycontainer -o mycontainer.tar -
将生成的 tar 文件传输到目标主机。
-
在目标主机上,通过
docker import
创建一个新的镜像:1
2
3
cat <保存文件名>.tar | docker import - <新镜像名>:<标签>示例:
1
2
3
cat mycontainer.tar | docker import - mynewcontainerimage:latest
选择适合你的场景的迁移方法,并根据步骤进行操作。
这里使用阿里云镜像库
1. 登录阿里云Docker Registry
1 | docker login --username=jermainenee@yeah.net registry.cn-hangzhou.aliyuncs.com/ziming/mydocker |
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
1 | root@R7000K:~# docker login --username=jermainenee@yeah.net registry.cn-hangzhou.aliyuncs.com/ziming/mydocker |
推送
1 | root@R7000K:~# docker tag 5f11582196a4 registry.cn-hangzhou.aliyuncs.com/ziming/mydocker/[镜像名称]:2.16.2 |
您可以在访问凭证页面修改凭证密码。
2. 从Registry中拉取镜像
1 | $ docker pull registry.cn-hangzhou.aliyuncs.com/ziming/mydocker:[镜像版本号] |
3. 将镜像推送到Registry
1 | $ docker login --username=jerma******@yeah.net registry.cn-hangzhou.aliyuncs.com$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ziming/mydocker:[镜像版本号]$ docker push registry.cn-hangzhou.aliyuncs.com/ziming/mydocker:[镜像版本号] |
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
4. 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
5. 示例
使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
1 | $ docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEregistry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB$ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816 |
使用 “docker push” 命令将该镜像推送至远程。
1 | $ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816 |
1 | root@R7000K:~# docker tag 5f11582196a4 registry.cn-hangzhou.aliyuncs.com/ziming/mydocker:2.16.2 |
这里查看后台推送成功
拉取,我们在另外有一台主机进行拉取
如果你已经将 Docker 镜像推送到 Docker Registry(无论是 Docker Hub 还是私有 Registry),其他主机可以通过以下步骤拉取该镜像:
-
登录到 Docker Registry(如果是私有 Registry,可能需要先登录):
1
2
3
docker login <registry>示例(使用 Docker Hub):
1
2
3
docker login docker.io示例(使用私有 Registry):
1
2
3
docker login myregistry.com在登录时,你需要输入你在 Registry 上的用户名和密码。
-
拉取镜像:
1
2
3
docker pull <registry>/<镜像名>:<标签>示例:
1
2
3
docker pull docker.io/myimage:latest或者,如果是私有 Registry:
1
2
3
docker pull myregistry.com/myimage:latest -
等待镜像下载完成。拉取过程会自动从 Registry 下载镜像到本地主机。
通过这些步骤,其他主机就能够从 Docker Registry 上拉取到你之前推送的镜像了。确保目标主机具有访问相应 Registry 的权限,并且能够连接到网络。