详解Docker中Image、Container与 Volume 的迁移
开源Linux
长按二维码加关注~
已经部署的容器化服务,也不是不需要维护的。而且,由于生产环境往往有这样那样的严格要求,往往需要些非常规操作。Image(镜像)、Container(容器)和Volume(数据卷)的迁移,就是一类有用的非常规操作。
以下镜像,均以最简单的Alpine为例。
Image
镜像的迁移,适用于离线环境。
一般离线环境,都会自建Docker Registry。无论官方的,还是最近流行的Harbor,都是不错的选择。但是,这个世界上就是有些环境,或者说一些环境在某些时期,没有外网,也没有内部的Registry。这个时候要部署Docker的服务,怎么办?
只能通过镜像的迁移。实际上,Harbor的offline installer,就是采用这种形式。
Save
# use stdout
docker save alpine > /tmp/alpine.tar
# or write to a file directly
docker save alpine -o /tmp/alpine.tar
推荐使用-o
的形式,因为利用stdout的做法虽然直观,但在某些场景下无效,比如利用ssh
远程执行命令。
Load
# use stdout
docker load < /tmp/wekan.tar
# or read from a file directly
docker load -i /tmp/wekan.tar
Container
容器的迁移,适用于已经上线,且状态复杂、从零开始启动不能正常工作的服务。容器迁移的包,包含了镜像。
Export
先准备一个正在运行的服务,并且弄脏环境。
$ docker run --rm -d --name test alpine tail -f /dev/null
9232f0c1dafe0f29918f281ca37bb41914677e818cb6f252abf3dab3be04fbb2
$ docker exec test touch proof
$ docker exec test ls -hl proof
-rw-r--r-- 1 root root 0 Nov 20 14:33 proof
#执行导出操作:
docker export test -o test.tar
Import
首先,关闭刚才运行的服务。
$ docker kill test
test
#执行导入操作:
$ docker import test.tar test-img
sha256:e03727eeba7e16dd3acfcc7536f1244762508f9b6b9856e49cc837c1b7ffa444
要注意的是,import
后得到的是一个镜像,相当于是执行了docker commit
后的内容。当然,docker commit
不是一个推荐的操作,所以容器的导入、导出,就显得不是那么的顺眼。
最后,检查之前创建的文件。
$ docker run --rm -d --name test test-img tail -f /dev/null
ee29cb63bb2d3ed8ac890789ba80c4fe4078b9d5343a8952b6217d64b4dcbe23
$ docker exec test ls -hl proof
-rw-r--r-- 1 root root 0 Nov 20 14:33 proof
可以看到,前面创建的文件是存在的,并且时间戳完全一致。
Volume
数据卷的迁移,比较麻烦。Docker并未提供官方的简单方案。
当然,直接用root
用户访问文件系统的Docker数据,比如默认的/var/lib/docker/volumes/
下的文件夹,直接进行打包操作,也不是不行。但这毫无疑问是最糟糕的方案。
目前参考《Use volumes | Docker Documentation》,找到的最佳方案是,用另一个容器,把数据卷内容打包,并且通过挂载的形式传递到宿主机。
Backup
首先,准备一个Volume。
$ docker run --rm -d --name test -v test-vol:/data test-img tail -f /dev/null
f4ff81f4c31025ff476fbebc2c779a915b43ba5940b5bcc42e3ef9b1379eaeab
$ docker exec test touch /data/proof
$ docker exec test ls -hl proof
-rw-r--r-- 1 root root 0 Nov 20 14:40 proof
执行备份操作:
$ docker run --rm -v test-vol:/volume -v $PWD:/backup alpine tar cvf /backup/backup.tar volume
volume/
volume/proof
直接在已运行容器中打包,然后通过docker cp
复制出来,也是一个方案。但这会对正在运行的容器有影响,不建议在真正重要的容器中使用。
这里利用了一个Alpine镜像来执行操作。实际上,任何一个自带tar
的镜像都是可以的。
Restore
首先,清理刚才的容器和数据卷。
$ docker kill test
test
$ docker volume rm test-vol
test-vol
执行还原操作:
docker run --rm -v test-vol:/volume -v $PWD:/backup alpine tar xf /backup/backup.tar
最后,检查还原后的结果。
$ docker run --rm -v test-vol:/data alpine ls -ahl /data
total 8
drwxr-xr-x 2 root root 4.0K Nov 20 14:48 .
drwxr-xr-x 1 root root 4.0K Nov 20 14:50 ..
-rw-r--r-- 1 root root 0 Nov 20 14:40 proof
结论
以上三招六式,其实都不是常规手段。
Image的传递,更应该依赖于内部Docker Registry而非tar。(当然,也有例外,比如集群部署大镜像的P2P方案,也许可以借鉴这个手段。)
Container的状态,应该是可弃的。一个运行了很长时间的Container,应该是可以restart
、甚至kill
后再重新run
也不影响既有功能的。任何有依赖的状态,都应该考虑持久化、网络化,而不能单纯地保存在本地文件系统中。
Volume的手动迁移,的确可以采用上述方式。但是,Volume需要手动迁移、备份吗?这需要专业而完善的插件来实现。
作者:匿蟒
原文:https://note.qidong.name/2018/11/docker-migration/
- End -
好文章,分享、点赞、在看三连哦️↓↓↓
详解Docker中Image、Container与 Volume 的迁移的更多相关文章
- 详解docker中容器devicemapper设备的挂载流程
事故起因 版本说明:本文中docker版本主要基于1.10版本,操作系统为centos7.devicemapper在文中缩写为dm. 某个用户的容器启动不起来,启动时候一直报错.通过docker lo ...
- 详解Docker 端口映射与容器互联
详解Docker 端口映射与容器互联 1.端口映射实现访问容器 1.从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的. 当容器中运行 ...
- jQuery:详解jQuery中的事件(二)
上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件.事件冒泡和事件移除等内容. 接上篇jQuery:详解jQuery中的事件(一) ...
- 图文详解Unity3D中Material的Tiling和Offset是怎么回事
图文详解Unity3D中Material的Tiling和Offset是怎么回事 Tiling和Offset概述 Tiling表示UV坐标的缩放倍数,Offset表示UV坐标的起始位置. 这样说当然是隔 ...
- 【转】详解C#中的反射
原帖链接点这里:详解C#中的反射 反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子: 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内 ...
- 详解Webwork中Action 调用的方法
详解Webwork中Action 调用的方法 从三方面介绍webwork action调用相关知识: 1.Webwork 获取和包装 web 参数 2.这部分框架类关系 3.DefaultAction ...
- 【转】详解JavaScript中的this
ref:http://blog.jobbole.com/39305/ 来源:foocoder 详解JavaScript中的this JavaScript中的this总是让人迷惑,应该是js众所周知的坑 ...
- 深入详解SQL中的Null
深入详解SQL中的Null NULL 在计算机和编程世界中表示的是未知,不确定.虽然中文翻译为 “空”, 但此空(null)非彼空(empty). Null表示的是一种未知状态,未来状态,比如小明兜里 ...
- java 乱码详解_jsp中pageEncoding、charset=UTF -8"、request.setCharacterEncoding("UTF-8")
http://blog.csdn.net/qinysong/article/details/1179480 java 乱码详解__jsp中pageEncoding.charset=UTF -8&quo ...
随机推荐
- 在 Java 中 Executor 和 Executors 的区别?
Executors 工具类的不同方法按照我们的需求创建了不同的线程池,来满足业务 的需求. Executor 接口对象能执行我们的线程任务. ExecutorService 接口继承了 Executo ...
- npm安装包出现UNMET DEPENDENCY报错
出现这个内容应该是包损坏,导致npm无法正常解析,通过 npm ls 命令也可以看到UNMET DEPENDENCY在依赖包上出现,在输出的信息最后有一个错误信息 npm view pkg versi ...
- 你能保证 GC 执行吗?
不能,虽然你可以调用 System.gc() 或者 Runtime.gc(),但是没有办法保证 GC 的执行.
- BMZCTF ssrfme
<?php if(isset($_GET) && !empty($_GET)){ $url = $_GET['file']; $path = "upload/" ...
- 使用滑模控制对sin(t)曲线追踪
结合:[Matlab]简单的滑模控制程序及Simulink仿真本片文章观看,此篇文章是在这篇文章的基础上进行修改的 输出u的推导过程 如果不明白控制量输出u的推到过成请看:[控制理论]滑模控制最强解析 ...
- 一行代码让微信小程序支持 cookie
weapp-cookie 一行代码让微信小程序支持 cookie,传送门:github Intro 微信原生的 wx.request 网络请求接口并不支持传统的 Cookie,但有时候我们现有的后端接 ...
- 聊一聊Web端的即时通讯
聊一聊Web端的即时通讯 Web端实现即时通讯的方法有哪些? - 短轮询 长轮询 iframe流 Flash Socket 轮询 客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并 ...
- ES6-11学习笔记--Symbol
Symbol:一种新的原始数据类型 声明方式: let s1 = Symbol() let s2 = Symbol() console.log(s1); // Symbol() console.l ...
- 在vue中实现点击哪个哪个区域变化背景色和字体颜色,其他默认(uni-app框架中也可以使用)
template: 1 <view class="wrap"> 2 <view class="total" :class="{ se ...
- BootstrapBlazor实战 Chart 图表使用(1)
BootstrapBlazor组件 Chart 图表介绍 通过给定数据,绘画各种图表的组件 本文主要介绍三种图表使用:折线图,柱状图,饼图 1.新建工程 新建工程b06chart,使用 nuget.o ...