Docker镜像与容器备份迁移(export、import与commit、save、load)

54 篇文章 3 订阅
3 篇文章 0 订阅

容器与镜像迁移

注:

 用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

export与import命令:

注意:

1.会丢弃历史记录和元数据。
  2.启动export与import命令导出导入的镜像必须加/bin/bash或者其他/bin/sh,否则会报错。

   docker: Error response from daemon: No command specified.

export:导出容器会丢失历史记录和元数据,类似与快照。

命令格式:

docker export [容器ID|Name] > xxx.tar
 或
docker export -o xxx.tar [容器ID|Name]

应用场景:
  主要用来制作基础镜像,比如从一个ubuntu镜像启动一个容器,然后安装一些软件和进行一些设置后,使用docker export保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。


import:导入容器快照到本地镜像库。

命令格式:
docker import xxx.tar newname:tag

 如:
   docker import redis.tar myredis:v1

1.创建容器web并新增数据

[root@localhost ~]# docker run -itd --name web nginx
9a17f7c9f00a3711018581a1523ecd7a06c40d1408ae5678e034be1a1e4e0cd8

[root@localhost ~]# docker exec -it web touch /mnt/test.txt
[root@localhost ~]# docker exec -it web ls /mnt/
test.txt

2.导出容器快照

[root@localhost ~]# docker export web > web.tar

[root@localhost ~]# ll -h web.tar
-rw-r--r-- 1 root root 123M 5月  13 04:34 web.tar

3.导入容器快照到本机镜像库

[root@localhost ~]# docker import web.tar web:v1
sha256:134f9251e15e56060d564c23cec4be0048434fb90b19188ea64bf77af77b85ff

[root@localhost ~]# docker images
REPOSITORY                      TAG                      IMAGE ID            CREATED             SIZE
web                             v1                       134f9251e15e        10 minutes ago      125MB

4.启动使用import导入镜像库的web:v1镜像,并查看数据

注意:
启动export与import命令导出导入的镜像必须加/bin/bash或者其他/bin/sh,否则会报错。
   docker: Error response from daemon: No command specified.

[root@localhost ~]# docker run -itd --name web2 web:v1 /bin/bash
ef07135bcda92c8660392ce29e24c7c8de82f3369fb024ae772c34cd74b9258d

[root@localhost ~]# docker exec -it web2 ls /mnt/
test.txt

总结:
  通过export命令也可以将容器里的数据保存,并可以迁移到别的docker主机。

commit命令:

 将已存在容器中的镜像和修改内容提交为一个新的镜像,通过这个方式同样能保存读写层内容。

命令格式:

docker commit [容器名称|ID] 生成新的镜像名字

选项说明:

-a:提交的镜像作者

-c:使用dockerfile指令来创建镜像

-m:提交时的说明文字

-p:在commit的时候,将正在运行的容器暂停

应用场景:
 主要作用是将配置好的一些容器生成新的镜像,可以得到复用(再次使用不需要再配置)。

1.启动一个nginx容器,并且在容器的/mnt目录下创建一个文件

[root@localhost ~]# docker run -itd --name nginxweb -p 80:80 nginx
fda3ca1b33ba4c9dc6a1ca27c7242bbbdc2a08f4e6e7642d3ec5de62e1e8f78c

[root@localhost ~]# docker exec -it nginxweb touch /mnt/test.txt

[root@localhost ~]# docker exec -it nginxweb ls /mnt/
test.txt

2.将nginxweb容器commit成一个新的镜像

[root@localhost ~]# docker commit nginxweb nginx_test:v1
sha256:a06b16b343036bcbf424c499022ca635bf90740aa7d76acbe0c271a731aba2ef

[root@localhost ~]# docker images
REPOSITORY                      TAG                      IMAGE ID            CREATED             SIZE
nginx_test                      v1                       a06b16b34303        4 seconds ago       127MB

3.使用nginxweb生成的新镜像nginx_test启动一个nginx_v1容器,并查看新容器中的数据

[root@localhost ~]# docker stop nginxweb     //为了方便先停止nginxweb容器,因为80端口已被占用
nginxweb

[root@localhost ~]# docker run -itd --name nginx_v1 -p 80:80 nginx_test:v1       
df074341d7a39b072966672ef9bb8769142b67395488e30e81711d0c75f2a821

[root@localhost ~]# docker exec -it nginx_v1 ls /mnt/
test.txt       ---》可以看到新容器nginx_v1中有之前nginxweb的数据

注意:
  commit 命令虽然能实现保存读写层数据,但不适于做数据持久化。

save与load命令:

注意:
  1.不会丢弃历史记录和元数据,并可以回滚版本。
  2.启动不用加/bin/bash。

save:将指定镜像保存成tar文件。

命令格式:

docker save 镜像名 > xxx.tar
 或
docker save -o xxx.tar 镜像名

应用场景:
  如果你的应用是使用docker-compose.yml编排的多个镜像组合,但你要部署的客户服务器并不能连外网。这时,你可以使用docker save将用到的镜像打个包,然后拷贝到客户服务器上使用docker load载入(一般用于镜像迁移到别处)。


load:导入使用docker save命令导出的镜像。在这里插入代码片

命令格式:
docker load -i xxx.tar

docker load < xxx.tar

容器备份迁移案例:

  运行一段时间后的容器,其中包含了新的数据,如果想把这些内容数据一并迁移到新的主机上,可以按照以下步骤进行:

1.提交容器生成新的镜像

[root@localhost ~]# docker ps    //查看正在运行的容器web
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
9a17f7c9f00a        nginx               "nginx -g 'daemon of…"   19 hours ago        Up 19 hours         80/tcp              web

[root@localhost ~]# docker commit -p web webdata:v1    //-p暂停web容器并提交为新镜像webdata:v1
sha256:b25ea02c5f1f4efe4c35d6503a277d968d5dfdf0cfd69092b3e99202dd687723

[root@localhost ~]# docker images      //查看提交的新镜像webdata
REPOSITORY                      TAG                      IMAGE ID            CREATED             SIZE
webdata                         v1                       b25ea02c5f1f        3 seconds ago       127MB

2.将镜像保存成一个tar压缩包

[root@localhost ~]# docker save webdata:v1 > webdata.tar

[root@localhost ~]# ll -h webdata.tar
-rw-r--r-- 1 root root 125M 5月  13 23:47 webdata.tar

3.将tar压缩包复制到另一台主机

[root@localhost ~]# scp webdata.tar root@192.168.2.128:/root/test

4.在另一台主机上加载镜像的tar压缩包

[root@localhost ~]# cd test/

[root@localhost test]# ll
总用量 127572
-rw-r--r-- 1 root root 130631168 5月  13 23:49 webdata.tar

[root@localhost test]# docker load -i webdata.tar
d9d778e6751c: Loading layer [==================================================>]  10.24kB/10.24kB
Loaded image: webdata:v1

[root@localhost test]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
webdata                       v1                  b25ea02c5f1f        12 minutes ago      127MB

5.使用这个加载的镜像运行容器

[root@localhost test]# docker run -itd --name web webdata:v1
51d9ed10961b9620ea6456f5bd75dbd43168b73c7bd184dcccdd25fcf956d9e5

[root@localhost test]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
51d9ed10961b        webdata:v1          "nginx -g 'daemon of…"   35 seconds ago      Up 33 seconds       80/tcp              web

[root@localhost test]# docker exec -it web ls /mnt/
test.txt

注意:
如果有docker镜像仓库的权限,也可以直接将第1步生成的镜像push到docker仓库,然后在另一台主机上pull镜像并运行为容器即可。


docker save和docker export的区别

docker save保存的是镜像(image),docker export保存的是容器(container);

docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;

docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。

docker export的包会比save的包要小,原因是save的是一个分层的文件系统,export导出的只是一个linux系统的文件目录。

↓↓↓↓↓↓

最近刚申请了个微信公众号,上面也会分享一些运维知识,大家点点发财手关注一波,感谢大家。 【原创公众号】:非著名运维 【福利】:公众号回复 “资料” 送运维自学资料大礼包哦!
在这里插入图片描述

  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非著名运维

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值