前言
现在对于一个开发来说,Docker
应该是再熟悉不过了。还记得在20132014左右的时候,听说多最多的就是 Cloud Foundry
,那个时候就一直在说云的事情。后面Docker
就绝杀了它
那它帮我们解决了一个什么问题了?面试的时候也许会问到。
在很久以前,我们开发代码,估计最蛋疼的事情就是发布版本了。我还记得在房多多的时候(2014~2016)左右,每次发布几个开发围绕在运维的身边,有时候运维忙不过来,开发就直接在运维的电脑上开始VIM
干活了,修改若干配置。由于多环境的原因,我们无法保证每个环境都是一样的。
- 可能你的操作系统不同,导致打包、发布的脚本不同
- 环境不同,没有很好的配置管理,你的代码有不同的写法
- 特别是跟操作系统相关的那些参数,可能瞬间就会带来性能问题
那么Docker
就可以把我们的操作系统、代码、脚本等都一起打包成一个Image
,就可以保证只要是运行同一个Image
,我们的所有内容都是一样的。就不会出现,我在测试环境跑的好好的,一到生产连启动都成问题。
问题
现在一般一个POD
就只跑一个进程,DevOps
会根据我们的发布流水线自动的将一个项目进行打包、发布,整套的CI
、CD做的是行云流水。但是,每个项目ROOT
下都会需要一个叫Dockerfile
的文件。但偏偏有一些历史项目,没有Dockerfile
文件,只有一个Run
的容器再跑,真的是非常惊悚。docker rm [OPTIONS] CONTAINER [CONTAINER...]
,就GAME OVER
了。
怎么办?
方法1:以当前容器作为基础镜像
真的,什么也不想。先保个底,把你当前的容器打包成一个镜像推送到仓库里去,哪天有以外或者说需要基于它做一些事情的时候才有可能。比如:你要本地也部署一份代码来debug
。
一般都是私有的仓库,会需要输入用户名与密码
1 | ➜ ~ docker login {仓库地址} |
然后,将镜像打包推送到私有仓库去
1 | docker commit -a "name" -m "小陈来拯救你" 706e502e8693 {镜像地址}:{tag} |
但是这样子的问题在于,我们无法知道环境依赖了哪些模块,如果需要重新再部署一套,我为了保证环境的干净又需要删除哪些东西。就是无法知道增加与减少哪些东西,也就会导致环境存在不一致性,失去了我们的初衷。
方法2:从运行的容器中复制
先把镜像跑起来,然后从运行起来的容器中复制文件出来,复制命令如下:
1 | 从容器复制文件或目录到宿主机器 |
第一种方法并不是万能的,因为有些镜像过于简单,少了许多基础命令,以至于无法复制文件,也无法进入shell
环境。其次,要运行起来再操作,也有点占用资源,比较麻烦。
方法3:解压镜像tar文件(推荐)
此方法就是相当于反编译,拿到当时打镜像时候你做的详细操作。比较麻烦,但是是最靠谱的,最具有操作性的。
先将镜像保存为tar文件,命令如下:
1 | docker save -o {name}.tar {镜像地址}:{tag} |
下载后就会有一个tar包在本地,然后就解压出来。可以看一下manifest.json
文件的内容
1 | [ |
图片是解压后的效果,里面都会存在一个layer.tar
,这里再解压就是当时打镜像时候的一些资源文件。
红色的部分就是我们想要的内容。再辛苦一点,把自己想要的东西整理出来。描述的比较轻描淡写,任何事情只要手动去做一遍,就会理解与记住。
参考地址
如果大家喜欢我的文章,可以关注个人订阅号。欢迎随时留言、交流。如果想加入微信群的话一起讨论的话,请加管理员微信号:chengcheng222e
,他会拉你们进群。