构建镜像
直接进入主题,docker的构建有两种方式,一种是通过commit命令的方式,一种是通过 Dockerfile 构建文件的方式构建,分析一下这两种方式用法,以拿构建centos为例吧,打算将本地仓库的centos安装一些常用工具,然后构建成新的镜像文件,并保存到本地仓库中,下面直接上干货.
前期准备
执行一下 docker images 看看centos 是否已经拉取到本地仓库了,如果没有,那么需要从 docker hub(https://hub.docker.com/) 官方网站下载一个版本,
拉取centos镜像文件
执行 docker pull centos 命令
执行完上述命令,发现已经将centos拉取到本地仓库了,接下来就是通过改造centos,重新构建成新的镜像文件
命令构建
这种方式构建装有常用工具的新的centos镜像需要完成以下三个步骤:
(1)运行容器。
(2)修改容器,需要在运行的容器中安装常用工具命令
(3)将修改后的容器保存为新的镜像
运行容器
首先进入到centos容器,先执行 docker run -it --name centos_old -d docker.io/centos bash
进入到该容器的命令其实有四种,这里只介绍两种:
执行 docker ps 拿到正在运行的容器之后,执行如下:
1) docker attach containerid(容器id) 进入到容器,上述是通过该命令执行,这种方式比较古老
2) docker exec -it cenos_old(你起的别名) bash 进入到容器,该命令是新版的docker才具有的,,
进入容器之后,发现命令的最左侧有一串大概是散列值的东西,那就是容器的id,,
注意:
- -it 参数表示交互执行
- bash参数表示以脚本方式执行 ,常用命令大家自行脑补.
进入到该容器之后,发现基本的 net-tools vim 等命令无法使用,那么,我们可以根据情况安装几个常用工具,然后重新构建
修改容器
比如我想安装一个 net-tools的命令,执行 yum install -y net-tools 那么安装完毕之后,ifconfig工具就可以用了
保存镜像
重新复制一个ssh窗口界面,找到目前正在运行的centos_old 容器
执行commit命令将容器保存为新的镜像,1362da3ae2a7 是运行的容器的ID,centos_new 是新镜像的名字,1.0.0是版本号
如上图所示,centos_new 是新构建的镜像文件,1.0.0是构建的版本号,上述sha256是通过sha算法生成的一串散列值,这样commit方式构建镜像完毕.
文件构建
上述,,除了通过commit方式构建镜像文件以外,我们还可以通过Dockerfile的方式来构建镜像.因为通过Dockerfile的方式构建镜像,需要有上下文的支持,因此,需要在/目录下,新建一个文件夹,比如叫myDockerfle文件
然后在该文件夹下再创建一个叫 Dockerfile的文件,那么该文件就是镜像文件的构建脚本.
在Dockerfile文件中写一些需要构建的目标脚本,比如本例中,我打算在上述通过commit生成的centos_new 版本的基础上,接着进行构建,并生成新的版本centos镜像文件,输入如下一些脚本信息:
上述构建脚本的含义是:我打算在centos_new基础之上,构建一个安装了httpd服务的新的centos镜像文件,并且需要让该镜像文件开机的时候httpd服务生效,并暴露80端口,并且作者是yebn(嘻嘻)
说明:在上述执行过程中,大家会看到比较惊喜的一幕,会发现每步执行的时候,都会有step提示
- step1) 执行from操作的时候,会从id为ad9ad47b8ddb的容器中获取源,如果没有则将会从官网默认拉取
- step2) 执行第一个命令maintainer yebn ,表示构建作者是yebn,并且临时生成一个id为2daeeb264489的容器
- step3)执行第三个命令的时候,将会打包生成一个新的镜像a7dc5cf6d9a5,并移除step2的临时镜像2daeeb264489,这样依次循环,直到所有的镜像全部打包完毕
执行效果如上图所示,执行 docker images 发现已经生成了最新的centos镜像文件,如下图所示,centos_new 有两个版本
执行 docker history 将会呈现该版本的每次构建历史,如下图所示:
欢迎各位小伙伴提出建议或者建议!
完
转载于:https://my.oschina.net/yaukie/blog/2986857