Docker 镜像与容器的备份迁徙

金歌  金牌会员 | 2024-9-16 19:47:36 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 704|帖子 704|积分 2112

参:https://cloud.tencent.com/developer/article/2027894
Docker镜像与容器的备份迁徙

容器迁徙直接看最后的案例的方式。推荐使用 commit 构建新镜像,导出后迁徙。
 用户既可以使用 docker load 来导入镜像存储文件到当地镜像库,也可以使用 docker import 来导入一个容器快照到当地镜像库。这两者的区别在于容器快照文件将丢弃全部的汗青记载和元数据信息(即仅生存容器其时的快照状态),而镜像存储文件将生存完整记载,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
save、export 和 commit 的区别

docker save是用来生存镜像的


  • 用途:用于将一个或多个 Docker 镜像生存到一个压缩的 tar 文件中。
  • 特点:生存的 tar 文件包含镜像的全部层、标签、元数据和汗青记载,这允许在不同 Docker 环境之间完整地迁徙和还原镜像。
  • 场景:适用于在不同 Docker 环境之间共享和迁徙镜像,或在无网络毗连的环境中部署镜像。
docker export是用来导出容器文件系统的


  • 用途:用于将 Docker 容器(无论是运行中照旧已停止的)的文件系统导出为一个 tar 存档文件。
  • 特点:导出的 tar 文件不包含容器的汗青记载和元数据,只包含文件系统状态,这使得导出的文件更为紧凑但功能有所损失。
  • 场景:适用于备份或迁徙容器的当前状态,但不必要保留完整的容器汗青或元数据。
docker commit是用来根据容器的当前状态创建新镜像的


  • 用途:基于正在运行的容器的当前状态创建一个新的 Docker 镜像。
  • 特点:允许捕获容器所做的更改,并生存为一个新的镜像,包括容器的汗青记载和元数据。
  • 场景:当对容器举行了修改(如安装软件、更改配置等)后,并希望生存这些更改以便将来创建类似状态的容器或共享该状态时,非常有用。
容器迁徙(export/import)

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

  • 它只会导出文件系统;会丢失汗青记载和元数据,如映射端口、CMD 和 ENTRYPOINT 配置。数据卷也不会包含在导出归档中。
  • 启动export与import命令导出导入的镜像必须加/bin/bash或者其他/bin/sh,否则会报错。
  1. # 导出(export):导出容器会丢失历史记录和元数据,类似快照
  2. docker export [container ID or NAMES] > xx.tar        # 将导出容器快照到本地文件(.tar)
  3. # 导入(import)
  4. docker import xx.tar [REPOSITORY:TAG]
复制代码
案例:

 通过 export 命令也可以将容器里的数据生存,并可以迁徙到别的docker主机。
  1. # 创建容器 web
  2. [root@localhost ~]# docker run -itd --name web nginx
  3. 9a17f7c9f00a3711018581a1523ecd7a06c40d1408ae5678e034be1a1e4e0cd8
  4. # 新增数据
  5. [root@localhost ~]# docker exec -it web touch /mnt/test.txt
  6. [root@localhost ~]# docker exec -it web ls /mnt/
  7. test.txt
  8. # 导出容器快照
  9. [root@localhost ~]# docker export web > web.tar
  10. [root@localhost ~]# docker import web.tar web:v1
  11. sha256:134f9251e15e56060d564c23cec4be0048434fb90b19188ea64bf77af77b85ff
  12. # 导入容器
  13. [root@localhost ~]# docker images
  14. REPOSITORY                      TAG                      IMAGE ID            CREATED             SIZE
  15. web      v1                       134f9251e15e        10 minutes ago      125MB
  16. # 启动容器
  17. [root@localhost ~]# docker run -itd --name web2 web:v1 /bin/bash
  18. ef07135bcda92c8660392ce29e24c7c8de82f3369fb024ae772c34cd74b9258d
  19. # 查看之前新增的数据
  20. [root@localhost ~]# docker exec -it web2 ls /mnt/
  21. test.txt
复制代码
构建镜像(commit)

应用场景: 主要作用是将配置好的一些容器生成新的镜像,可以得到复用(再次使用不必要再配置)。将已存在容器中的镜像和修改内容提交为一个新的镜像,通过这个方式同样能生存读写层内容。
注意: commit 命令固然能实现生存读写层数据,但不适于做数据长期化。
  1. #  返回镜像id;-m :提交时的说明文字;
  2. $ docker commit -m “xxxx” [container ID] xx/xx:v1
复制代码


  • -a:提交的镜像作者
  • -c:使用dockerfile指令来创建镜像
  • -m:提交时的说明笔墨
  • -p:在commit的时候,将正在运行的容器停息
案例

  1. # 启动一个 nginx 容器,并且在容器的 /mnt 目录下创建一个文件
  2. [root@localhost ~]# docker run -itd --name nginxweb -p 80:80 nginx
  3. fda3ca1b33ba4c9dc6a1ca27c7242bbbdc2a08f4e6e7642d3ec5de62e1e8f78c
  4. [root@localhost ~]# docker exec -it nginxweb touch /mnt/test.txt
  5. [root@localhost ~]# docker exec -it nginxweb ls /mnt/
  6. test.txt
  7. # 将 nginxweb 容器 commit 成一个新的镜像
  8. [root@localhost ~]# docker commit nginxweb nginx_test:v2
  9. sha256:a06b16b343036bcbf424c499022ca635bf90740aa7d76acbe0c271a731aba2ef
  10. [root@localhost ~]# docker images
  11. REPOSITORY                      TAG                      IMAGE ID            CREATED             SIZE
  12. nginx_test                      v2                       a06b16b34303        4 seconds ago       127MB
  13. # 使用 nginxweb 生成的新镜像 nginx_test启动一个nginx_v2容器,并查看新容器中的数据
  14. [root@localhost ~]# docker run -itd --name nginx_v2 -p 82:80 nginx_test:v2      
  15. df074341d7a39b072966672ef9bb8769142b67395488e30e81711d0c75f2a821
  16. [root@localhost ~]# docker exec -it nginx_v1 ls /mnt/
  17. test.txt       # 可以看到新容器nginx_v2中有之前nginxweb的数据
复制代码
镜像迁徙(save/load)

应用场景:
 如果应用是使用 docker-compose.yml 编排的多个镜像组合,但要部署的客户服务器并不能连外网。这时,可以使用docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入(一样平常用于镜像迁徙到别处)。
  1. # 导出(save)/
  2. $ docker save > xx.tar [REPOSITORY:TAG] or [container ID]
  3. $ docker save [REPOSITORY:TAG] or [container ID] > xx.tar
  4. # 导入(load)
  5. $ docker load < xx.tar
  6. # 其中-o和>表示输出到文件,xx.tar为目标文件
  7. # 导入后的镜像的tag为空时,需要为镜像做tag
  8. $ docker tag [container ID] [REPOSITORY:TAG]
复制代码
涉及数据卷迁徙

检察 docker 容器详细信息中挂载的宿主机目录
  1. [root@localhost ~]# docker inspect [container ID or NAMES]
复制代码
  1. [{
  2.         ...
  3.         "HostConfig": {        # 容器的宿主机配置信息
  4.                 "Binds": [        绑定挂载信息
  5.                 "/opt/Development/testA:/vmdir/testA",
  6.                 "/opt/Development/testB:/vmdir/testB"
  7.                 ],
  8.         ...
  9.        
  10.         "Mounts": [{        # 容器挂载的卷和绑定挂载信息
  11.                 "Type": "bind",
  12.                 "Source": "/opt/Development/testA",        # 宿主机的源路径
  13.                 "Destination": "/vmdir/testA",                # 容器内的目标路径
  14.                 "Mode": "",
  15.                 "RW": true,
  16.                 "Propagation": "rprivate"
  17.         },
  18.         {
  19.                 "Type": "bind",
  20.                 "Source": "/opt/Development/testB",
  21.                 "Destination": "/vmdir/testB",
  22.                 "Mode": "",
  23.                 "RW": true,
  24.                 "Propagation": "rprivate"
  25.         },
  26.         ...
  27. }]
复制代码
备份相关目录文件:
  1. [root@localhost opt]# tar -zcvf Development.tar.gz Development
复制代码
迁徙后启动:
Development.tar.gz 挂载文件上传迁徙服务器解压。
  1. # 启动
  2. [root@localhost ~]# docker run -d \
  3. -p 10004:8810 \        # 端口映射
  4. -p 10005:8811 \
  5. --name [containerNAME]  \
  6. -v /opt/Development/testA:/vmdir/testA \        # 挂载Development.tar.gz的解压目录
  7. -v /opt/Development/testB:/vmdir/testB \
  8. -it [container ID or NAMES] \
  9. sh -c "/start/start_all.sh"       
复制代码
容器备份迁徙案例

 运行一段时间后的容器,其中包含了新的数据,如果想把这些内容数据一并迁徙到新的主机上,可以按照以下步调举行:
1.提交容器构建新的镜像
  1. [root@localhost ~]# docker ps
  2. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
  3. 9a17f7c9f00a        nginx               "nginx -g 'daemon of…"   19 hours ago        Up 19 hours         80/tcp              web
  4. [root@localhost ~]# docker commit -p web webdata:v1    // -p暂停web容器并提交为新镜像webdata:v1
  5. sha256:b25ea02c5f1f4efe4c35d6503a277d968d5dfdf0cfd69092b3e99202dd687723
  6. [root@localhost ~]# docker images      //查看提交的新镜像webdata
  7. REPOSITORY                      TAG                      IMAGE ID            CREATED             SIZE
  8. webdata                         v1                       b25ea02c5f1f        3 seconds ago       127MB
复制代码
2.导出新构建的镜像
  1. [root@localhost ~]# docker save webdata:v1 > webdata.tar
复制代码
3.将tar压缩包复制到另一台主机
  1. [root@localhost ~]# scp webdata.tar root@192.168.2.128:/root/test
复制代码
4.在另一台主机上加载镜像的tar压缩包
  1. [root@localhost ~]# cd /root/test
  2. [root@localhost test]# docker load -i webdata.tar
  3. d9d778e6751c: Loading layer [==================================================>]  10.24kB/10.24kB
  4. Loaded image: webdata:v1
  5. [root@localhost test]# docker images
  6. REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
  7. webdata                       v1                  b25ea02c5f1f        12 minutes ago      127MB
复制代码
5.使用这个加载的镜像运行容器
  1. [root@localhost test]# docker run -itd --name web webdata:v1
  2. 51d9ed10961b9620ea6456f5bd75dbd43168b73c7bd184dcccdd25fcf956d9e5
  3. [root@localhost test]# docker ps
  4. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
  5. 51d9ed10961b        webdata:v1          "nginx -g 'daemon of…"   35 seconds ago      Up 33 seconds       80/tcp              web
  6. [root@localhost test]# docker exec -it web ls /mnt/
  7. test.txt
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金歌

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表