In Docker, there are two ways to copy a file, namely, ADD and COPY.In this article, we will primarily focus on the COPY instruction of Docker.
In this article, we will discuss how to use the COPY Instruction to copy files and directories inside a Docker Container. To do so follow the below steps:
Table of Contents
将docker pull 的镜像拷贝到其他电脑
要将一台电脑上的镜像复制到另一台电脑上使用,有两种方式
1. 使用 docker save 和 docker load 命令
2. 使用 Docker Registry
除了可以借助仓库外,可以直接将镜像保存成一个文件,再拷贝到另一台电脑上导入使用。
1. 使用 docker save 和 docker load 命令
列出本地所有的镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
m.daocloud.io/docker.io/nodered/node-red latest 55fc57012066 7 days ago 823MB
ghcr.io/esphome/esphome latest b8209dc73177 2 months ago 733MB
ghcr.io/home-assistant/home-assistant stable 031d355a2e52 4 months ago 2.43GB
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rhasspy/wyoming-whisper latest 7163929fa497 2 weeks ago 558MB
nodered/node-red latest 489a122103aa 6 weeks ago 576MB
rhasspy/wyoming-piper latest 9e90dce8ae81 8 months ago 180MB
rhasspy/rhasspy latest 80cde42c6126 3 years ago 1.82GB
导出镜像
源服务器:将镜像保存为 tar 文件
docker save -o filename.tar #ID or #Name
docker save -o /path/to/image.tar image_name:tag
docker save ubuntu:14.04 > /images/ubuntu_14.04.tar
docker save -o /home/user/my_image.tar my_image:latest
wyoming-piper
docker save -o ./wyoming-piper.tar 9e90dce8ae81
docker save -o ./wyoming-whisper.tar 7163929fa497
docker save -o ./node-red.tar 489a122103aa
docker save 支持可以同时将多个镜像打包到一个文件中
docker save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)
使用 scp 或其他文件传输工具将保存的 tar 文件传输到目标服务器。
# scp /path/to/image.tar username@remote-server:/path/on/remote/server/
scp /home/user/my_image.tar user@remote-server:/home/user/
导入镜像(两种方式)
目标服务器上加载 tar 文件
在目标服务器上使用 docker load 命令加载传输过来的 tar 文件。
#导入镜像文件
docker load [options]
示例
docker load -i nginx.tar
或
docker load < nginx.tar
其中-i和<表示从文件输入。会成功导入镜像及相关元数据,包括tag信息
docker load --input /images/ubuntu_14.04.tar
#通过符号的方式来导入
docker load < /images/ubuntu_14.04.tar
docker load -i ./wyoming-piper.tar
docker load -i ./wyoming-whisper.tar
output
Loaded image ID: sha256:e64a72efd1ff3b13e07d9c117e38b65a5e0ad134906bbefc4c324397ed7306e9
(5)查看镜像是否导入成功
执行命令:docker images
docker images -a
ghcr.io/esphome/esphome latest b8209dc73177 3 months ago 733MB
ghcr.io/home-assistant/home-assistant stable 031d355a2e52 5 months ago 2.43GB
<none> <none> e64a72efd1ff 8 months ago 388MB
2、使用 Docker Registry
如果你有一个 Docker Registry,可以将镜像推送到 Registry,然后在另一台服务器上拉取镜像。这种方法适用于有内部或外部 Docker Registry 的情况下。
1. 将镜像推送到 Docker Registry
在源服务器上,将镜像推送到 Docker Registry。首先需要给镜像打标签,使其指向 Registry。
docker tag image_name:tag registry_url/image_name:tag
1
然后,推送镜像到 Docker Registry。
docker push registry_url/image_name:tag
1
示例:
docker tag my_image:latest myregistry.com/my_image:latest
docker push myregistry.com/my_image:latest
1
2
2. 在目标服务器上拉取镜像
在目标服务器上,从 Docker Registry 拉取镜像。
docker pull registry_url/image_name:tag
1
示例:
docker pull myregistry.com/my_image:latest
3、使用 docker export 和 docker import 命令
docker export 和 docker import 命令用于将运行中的容器导出为 tar 文件,并从 tar 文件中导入为镜像。这种方法适用于需要在容器运行时进行导出和导入的情况。
1. 导出运行中的容器
在源服务器上,使用 docker export 命令导出运行中的容器。
docker export container_id -o /path/to/container.tar
1
示例:
docker export my_container -o /home/user/my_container.tar
1
2. 传输 tar 文件到目标服务器
使用 scp 或其他文件传输工具将导出的 tar 文件传输到目标服务器。
scp /path/to/container.tar username@remote-server:/path/on/remote/server/
1
示例:
scp /home/user/my_container.tar user@remote-server:/home/user/
3. 在目标服务器上导入 tar 文件
在目标服务器上使用 docker import 命令从 tar 文件中导入镜像。
docker import xxx.tar newname:tag
docker import /path/on/remote/server/container.tar new_image_name:tag
示例:
docker import wyoming-whisper.tar wyoming-whisper
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wyoming-whisper latest 3d49bb47733b 8 seconds ago 178MB
ghcr.io/esphome/esphome latest 13cc1ca1d6e6 8 days ago 643MB
ghcr.io/esphome/esphome stable 13cc1ca1d6e6 8 days ago 643MB
4.docker commit
docker commit [容器名称|ID] 生成新的镜像名字
容器备份迁移案例
提交容器生成新的镜像
使用此方法,数据卷不会被迁移,但它会保留在容器内创建的应用程序的数据
docker commit 9f708f0c6077 movedwhisper
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
movedwhisper latest 9455da0dfada 9 seconds ago 564MB
将镜像保存成一个tar压缩包
docker save movedwhisper > movedwhisper.tar
ls -l
total 742496
-rw-r--r-- 1 root root 575980544 Jan 25 13:12 movedwhisper.tar
drwx------ 4 root root 4096 Jan 4 02:28 snap
-rw-r--r-- 1 root root 184322048 Jan 25 12:14 wyoming-whisper.tar
将tar压缩包复制到另一台主机
scp movedwhisper.tar [email protected]:/root/test
在另一台主机上加载镜像的tar压缩包
docker load -i movedwhisper.tar
6a4fdc7ff1bf: Loading layer [==================================================>] 84.21MB/84.21MB
5f70bf18a086: Loading layer [==================================================>] 1.024kB/1.024kB
64cc77dff041: Loading layer [==================================================>] 489.2MB/489.2MB
0db3851544e3: Loading layer [==================================================>] 2.048kB/2.048kB
c899438e7546: Loading layer [==================================================>] 2.491MB/2.491MB
Loaded image: movedwhisper:latest
root@debian:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
movedwhisper latest 9455da0dfada 49 minutes ago 564MB
wyoming-whisper latest 3d49bb47733b About an hour ago 178MB
ghcr.io/esphome/esphome latest 13cc1ca1d6e6 8 days ago 643MB
ghcr.io/esphome/esphome stable 13cc1ca1d6e6 8 days ago 643MB
docker run -it -p 10300:10300 -v /path/to/local/data:/data 9455da0dfada --model medium-int8 --language en
四、总结
docker save 的应用场景
docker save 和 docker load 是 Docker 提供的两个命令,用于将镜像保存为 tar 文件和从 tar 文件中加载镜像。
如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。
是否可以同时将多个镜像打包到一个文件中
docker export 不支持
docker save 支持
是否包含镜像历史
export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)
docker load 不能对载入的镜像重命名
Docker Registry,可以将镜像推送到 Registry,然后在另一台服务器上拉取镜像。这种方法适用于有内部或外部 Docker Registry 的情况下。
docker export 和 docker import 命令的应用场景
docker export 和 docker import 命令用于将运行中的容器导出为 tar 文件,并从 tar 文件中导入为镜像。这种方法适用于需要在容器运行时进行导出和导入的情况。
docker export的包会比save的包要小,原因是save的是一个分层的文件系统,export导出的只是一个linux系统的文件目录。
主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
docker import 可以为镜像指定新名称
是否可以同时将多个镜像打包到一个文件中
docker export 不支持
docker save 支持
是否包含镜像历史
export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)
通过本文介绍的方法,你可以选择适合自己需求的方式将 Docker 镜像移动或复制到另一台服务器。无论是使用 docker save 和 docker load,Docker Registry,还是 docker export 和 docker import,都能帮助你实现镜像的迁移和管理
原文链接:
https://cloud.tencent.com/developer/article/2027894
https://blog.csdn.net/yimenglin/article/details/106017991
https://blog.csdn.net/qq_41973632/article/details/140093227
Docker容器迁移到其他服务器的5种方法
https://blog.csdn.net/u014389734/article/details/115265963