Docker 镜像与容器的备份迁移

embedded/2024/9/18 20:56:37/ 标签: docker, 容器, 运维, 迁移, 数据卷, 挂载

参: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 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,如作为基础的开发环境。

注意

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

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

# 创建容器 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# 导出容器快照
[root@localhost ~]# docker export web > web.tar
[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# 启动容器
[root@localhost ~]# docker run -itd --name web2 web:v1 /bin/bash
ef07135bcda92c8660392ce29e24c7c8de82f3369fb024ae772c34cd74b9258d
# 查看之前新增的数据
[root@localhost ~]# docker exec -it web2 ls /mnt/
test.txt

构建镜像(commit)

应用场景: 主要作用是将配置好的一些容器生成新的镜像,可以得到复用(再次使用不需要再配置)。将已存在容器中的镜像和修改内容提交为一个新的镜像,通过这个方式同样能保存读写层内容。

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

#  返回镜像id;-m :提交时的说明文字;
$ docker commit -m “xxxx” [container ID] xx/xx:v1
  • -a:提交的镜像作者
  • -c:使用dockerfile指令来创建镜像
  • -m:提交时的说明文字
  • -p:在commit的时候,将正在运行的容器暂停
案例
# 启动一个 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# 将 nginxweb 容器 commit 成一个新的镜像
[root@localhost ~]# docker commit nginxweb nginx_test:v2
sha256:a06b16b343036bcbf424c499022ca635bf90740aa7d76acbe0c271a731aba2ef
[root@localhost ~]# docker images
REPOSITORY                      TAG                      IMAGE ID            CREATED             SIZE
nginx_test                      v2                       a06b16b34303        4 seconds ago       127MB# 使用 nginxweb 生成的新镜像 nginx_test启动一个nginx_v2容器,并查看新容器中的数据
[root@localhost ~]# docker run -itd --name nginx_v2 -p 82:80 nginx_test:v2      
df074341d7a39b072966672ef9bb8769142b67395488e30e81711d0c75f2a821
[root@localhost ~]# docker exec -it nginx_v1 ls /mnt/
test.txt       # 可以看到新容器nginx_v2中有之前nginxweb的数据

镜像迁移(save/load)

应用场景:

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

# 导出(save)/
$ docker save > xx.tar [REPOSITORY:TAG] or [container ID]
$ docker save [REPOSITORY:TAG] or [container ID] > xx.tar# 导入(load)
$ docker load < xx.tar# 其中-o和>表示输出到文件,xx.tar为目标文件
# 导入后的镜像的tag为空时,需要为镜像做tag
$ docker tag [container ID] [REPOSITORY:TAG]

涉及数据卷迁移

查看 docker 容器详细信息中挂载的宿主机目录

[root@localhost ~]# docker inspect [container ID or NAMES]
[{..."HostConfig": {	# 容器的宿主机配置信息"Binds": [	绑定挂载信息"/opt/Development/testA:/vmdir/testA","/opt/Development/testB:/vmdir/testB"],..."Mounts": [{	# 容器挂载的卷和绑定挂载信息"Type": "bind","Source": "/opt/Development/testA",	# 宿主机的源路径"Destination": "/vmdir/testA",		# 容器内的目标路径"Mode": "","RW": true,"Propagation": "rprivate"},{"Type": "bind","Source": "/opt/Development/testB","Destination": "/vmdir/testB","Mode": "","RW": true,"Propagation": "rprivate"},...
}]

备份相关目录文件:

[root@localhost opt]# tar -zcvf Development.tar.gz Development

迁移后启动:

Development.tar.gz 挂载文件上传迁移服务器解压。

# 启动
[root@localhost ~]# docker run -d \
-p 10004:8810 \	# 端口映射
-p 10005:8811 \
--name [containerNAME]  \
-v /opt/Development/testA:/vmdir/testA \	# 挂载Development.tar.gz的解压目录
-v /opt/Development/testB:/vmdir/testB \
-it [container ID or NAMES] \
sh -c "/start/start_all.sh"	

容器备份迁移案例

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

1.提交容器构建新的镜像

[root@localhost ~]# docker ps
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.导出新构建的镜像

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

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

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

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

[root@localhost ~]# cd /root/test
[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

http://www.ppmy.cn/embedded/46091.html

相关文章

x264 参考帧管理原理:i_frame_num 变量

x264 参考帧管理 x264 是一个开源的 H.264 视频编码软件,它提供了许多高级特性,包括对参考帧的高效管理。参考帧管理是视频编码中的一个重要部分,它涉及到如何存储、更新和使用已经编码的帧以提高编码效率。 x264 参考帧管理的一些关键点总结如下: 参考帧的初始化和重排序:…

如何查询Windows 10电脑的IP地址

如何查询Windows 10电脑的IP地址 引言 在Windows 10操作系统中&#xff0c;查询电脑的IP地址是一项基本而重要的任务&#xff0c;无论是为了配置网络、解决连接问题&#xff0c;还是进行远程访问。 基础知识 IP地址&#xff1a;互联网协议地址&#xff0c;用于标识网络中的…

模糊C均值(FCM)算法更新公式推导

模糊C均值&#xff08;FCM&#xff09;算法更新公式推导 目标函数 FCM的目标函数为&#xff1a; J m ∑ i 1 n ∑ j 1 k u i j m ∥ x i − c j ∥ 2 J_m \sum_{i1}^n \sum_{j1}^k u_{ij}^m \|x_i - c_j\|^2 Jm​i1∑n​j1∑k​uijm​∥xi​−cj​∥2 其中&#xff1a; …

Rustdesk 自建服务器教程

一、环境 阿里云轻量服务器、debian11 系统 二、服务端搭建 2.1、开放防火墙指定端口 TCP(21115, 21116, 21117, 21118, 21119)UDP(21116) 2.2、安装 rustdesk 服务器文件 在 github 下载页https://github.com/rustdesk/rustdesk-server/releases/&#xff0c;下载 rustde…

openresty使用异步方式调用api接口

最近做了一个需求&#xff0c;对供应商报表系统导出文件进行RMS加密&#xff0c;同时还需要记录用户下载日志&#xff0c;该需求主要在openresty实现。RMS加密是核心功能&#xff0c;日志是附加功能&#xff0c;如果将2者同步处理&#xff0c;记录日志会影响到用户导出文件&…

如果jupyter notebook不能实现网页自动跳转,参考下面的链接

一招搞定Jupyter-notebook命令行打开之后不能自动跳转浏览器_一招搞定jupter notebook命令行打开之后-CSDN博客

JVM的相关知识

一.JVM内存区域划分&#xff08;JVM是一个Java进程&#xff09; 一个进程运行过程中就需要重操作系统这里申请到一些内存资源 JVM也是如此&#xff0c;搞一大块内存&#xff0c;供Java代码执行时使用 JVM把这一大块内存又划分成不同的区域&#xff0c;分别代表不同的用途 各个…

【MyBatis】MyBatis操作数据库(二):动态SQL、#{}与${}的区别

目录 一、 动态SQL1.1 \<if>标签1.2 \<trim>标签1.3 \<where>标签1.4 \<set>标签1.5 \<foreach>标签1.6 \<include>标签 二、 #{}与${}的区别2.1 #{}是预编译sql&#xff0c;${}是即时sql2.2 SQL注入2.3 #{}性能高于${}2.4 ${}用于排序功能…

【Linux】中常见的重要指令(下)以及重要的几个热键

目录 一、时间相关的指令date 1.时间戳 二、Cal指令 三、find指令 1.whereis 2.which 四、grep指令 五、zip和unzip指令 六、tar指令 七、bc指令 八、重要的几个热键[Tab]&#xff0c;[ctrl]-c&#xff0c;[ctrl]-d 一、时间相关的指令date date 指定格式显示时间&…

python情感分析库-snownlp

内容目录 一、words方法二、sentences方法三、han方法四、pinyin方法五、sentiments方法六、tags方法七、tf方法和idf方法八、summary方法九、keywords方法 SnowNLP 是一个简易的 Python 库&#xff0c;主要用于处理中文文本数据&#xff0c;提供了多种实用的功能。 源码中提供…

.Net Core 中间件与过滤器

过滤器这个是.Net MVC旧有的功能&#xff0c;中间件这个概念是新出的&#xff0c; ASP.NET Core只是完成了HTTP请求调度、报文解析等必要的工作&#xff0c;像检查用户身份、设置缓存报文头等操作都是在中间件中完成&#xff0c;中间件就是ASP.NET Core的一个组件&#xff0c;…

JVM监控-JMX探针的安装和使用

jvm监控的搭建和使用 ​ Java Management Extensions&#xff08;JMX&#xff09;是一种Java标准&#xff0c;用于管理和监控Java应用程序&#xff0c;特别是分布式系统。它提供了一种标准化的方式来管理应用程序的各种方面&#xff0c;包括性能监控、配置更改、事件通知等。目…

美创科技获评“2024年第一批浙江省专精特新中小企业”!

近日&#xff0c;由浙江省经济和信息化厅组织开展的“2024年第一批浙江省专精特新中小企业”名单公示结束。 美创科技通过严格筛选&#xff0c;凭借在数据安全领域的专业化能力以及创新实践成果&#xff0c;获评浙江省年度首批“专精特新”中小企业&#xff01; “专精特新”是…

某商业落地充电桩后台服务器通迅协议V2.28 开源 | 嘎嘎快充充电桩平台V2(支持 汽车 电动自行车 云快充1.5、云快充1.6 单体服务 )

嘎嘎快充开源充电桩平台 源码下载地址https://gitee.com/itholiday 充电桩与后台服务器 通讯协议 V2.28 目录 1 网络拓扑 1.1 功能界定&#xff1a; 1.1.1 充电机智能终端 1.1.2 智能中心管理系统 1.2 接口定义&#xff1a; 1.3 通讯方式&#xff1a; 1.4 通信规约 1.5…

华为OD刷题C卷 - 每日刷题 6 (求字符串中所有整数的最小和、求满足条件的最长子串的长度)

两段代码分别解决了两个字符串处理的问题&#xff0c;下面是对它们的概述&#xff1a; 1、&#xff08;求字符串中所有整数的最小和&#xff09;&#xff1a; 这段代码是解决“求字符串中所有整数的最小和”的问题。它提供了一个Java类Main&#xff0c;其中包含一个方法getMi…

HQChart使用教程100-uniapp如何在vue3运行微信小程序

HQChart使用教程100-uniapp如何在vue3运行微信小程序 症状原因分析解决思路解决步骤1. 修改vender.js2. 修改HQChartControl.js 完整实例HQChart代码地址 症状 HQChart插件在uniappvue3的项目编译成小程序以后&#xff0c; 运行会报错&#xff0c;见下图。 原因分析 查了下…

Docker安装Redis(云服务器)

准备&#xff1a; 在云服务器中开启6370端口号 docker run -d --name redis -p 6379:6379 redis 这条命令使用docker运行一个名为"redis"的容器&#xff0c;映射容器的6379端口到主机的6379端口&#xff0c;并且使用redis镜像来运行容器。REDIS是一个开源的内存数据…

手机号脱敏

手机号脱敏 // 手机号脱敏subTelephone(telphone) {let result telphone.substr(0, 4) **** telphone.substr(8);return result;},

第九周:员工激励理论

1. 关注自己到关注他人 你是激励者&#xff0c;也会是被激励者。 虽然每个人的价值观不一样&#xff0c;但要做好激励员工这件事情&#xff0c;我觉得可以从自身角度出发&#xff0c;可以问问自己&#xff0c;你是如何被激励的&#xff1f; 如果是我&#xff0c;就只想要钱&…

建设一个专门的西班牙语网站是非常必要的

对于做西班牙语市场的外贸公司来说&#xff0c;建设一个专门的西班牙语网站是非常必要的。这不仅可以帮助企业更有效地接触和服务于西班牙语市场&#xff0c;还可以提高其在全球市场中的竞争力和品牌影响力。 市场需求和潜力&#xff1a;西班牙语是全球使用人数众多的语言之一…