目录
构建镜像
构建镜像的两种方法:docker commit和docker build。
通过这2种方式构建出来的镜像大小都是一样的;那么既然这2种方式都一样,我们应该使用哪一种呢?
commit
用户提交对容器的修改,并生成新的镜像。
docker commit -a="作者" -m="说明" -p 容器id/容器名称 镜像新名称:镜像版本 # 举例,制作当前的tomcat容器生成镜像 docker commit -a="yexindong" -m="首次制作的镜像" tomcat_1 mytomcat:1.0 # 参数说明 -a :提交的镜像作者; -c :使用dockerfile指令来创建镜像; -m :提交时的说明文字; -p :在commit时,将容器暂停。
dockerfile
特点
- 每个指令都必须是大写
- 执行顺序是从上到下顺序执行
- # 表示注释
- 每个指令都会创建提交一个新的镜层,并提交(每个指令都是一个docker commit)
- dockerfile是面向开发人员的;由开发人员构建镜像,就需要写dockerfile文件,然后将镜像交付给运维直接部署即可;不需要运维配置繁杂的jvm参数命令;
- dockerfile正在逐渐称为企业的交付标注,所以开发人员必须要掌握;
dickerfile 指令
使用dockerfile创建镜像,实际上就是用脚本文件的方式创建;脚本内指令如下
from
:指定基础镜像(它的妈妈是谁)maintainer
:指定作者(告诉别人,是谁创造了它),一般都是姓名 邮箱label
:指定标签信息user
:设置容器运行时的用户run
:在build过程要运行的命令 (在容器外运行,也就是在宿主机运行的命令,在这里我们可以给容器安装一些应用程序 yum install xxxx)add
:添加文件到镜像中(往它肚子里放点东西),如果.tar.gz文件的话, 会自动解压copy
:类似add,将文件拷贝到镜像,不会解压压缩文件env
:设置环境变量volume
:设置文件挂载(给它一个存放行李的地方),默认是匿名挂载expose
:暴露端口,指定容器运行时开放的端口,运行也需要开放这个端口才能访问 docker run -d -p 8080:8080 镜像id (打开一扇窗,让风(数据)可以来去自如)cmd
:容器运行时要执行的命令(在容器内运行的命令),可用来运行默认要运行的程序,只有最后一个cmd才会运行,且只运行一次entrypoint
:和cmd一样,但是可以追加命令;onbiuild
:当构建一个被继承dockerfile,这个时候就会运行onbuild 指令,属于触发指令workdir
:指定工作目录,也就是登陆后默认进去的目录;
指令用法
from
from centos
maintainer
maintainer yexindong
user
指定用户运行,默认使用root用户,在docker run 中可以通过 -u 选项来覆盖user指令的设置。
如果不是内置帐户,则必须首先创建该用户;
user root
env
# 环境变量可以随便设置,mypath为key ,/user/local是值 env mypath /user/local
expose
# 开放单个端口 expose 80 # 开放多个端口 expose 22 80 8080 3306 8009 8090
add
# file 是你当前宿主机的文件名称 # /root/home 是你要将file打包到镜像的目录 add file /root/home
copy
用法与add一致,区别是copy指令不会解压文件
copy file /root/home
cmd
容器内运行命令,只能运行一个命令
# 第一种用法 cmd echo 11 # 第二种用法 cmd ["echo","33"]
entrypoint
容器内运行命令,用法和cmd一致,区别是可以运行多个命令
# 定义多个 entrypoint 就可以运行多个命令 entrypoint ["ls","-l"] entrypoint ["./start.sh"] entrypoint ps -ef | grep tomcat
cmd 和 entrypoint 的区别
cmd
相同的指令只有最后一个会生效entrypoint
可以追加命令;
使用 dockerfile创建镜像
那么现在我们就自己一个tomcat的镜像,首先创建一个文件 dockerfile_1
vim dockerfile_1
脚本内容如下,注意,脚本内的关键字必须是大写的,volume
是匿名挂载的
from centos run yum install net-tools.x86_64 -y run yum -y install vim run yum install vi -y volume ["/data/tomcat_file_1","/data/tomcat_file_2"] expose 8080 # 打印当前时间 cmd date workdir /root
创建好脚本文件后,就可以就行构建了,注意后面那个点
docker build -f dockerfile_1 -t xindong_centos_3:1.1 . # 说明 -f 需要构建的脚本文件 -t tag的缩写,构建后的镜像名称:版本号
运行命令后展示以下信息,就表示已经构建成功了
sending build context to docker daemon 1.802gb step 1/8 : from centos ---> 5d0da3dc9764 step 2/8 : run yum install net-tools.x86_64 -y ---> using cache ---> a3d489e47eeb step 3/8 : run yum -y install vim ---> using cache ---> f7dfc03c0fd9 step 4/8 : run yum install vi -y ---> using cache ---> c111382ba821 step 5/8 : volume ["data/tomcat_file_1","/data/tomcat_file_2"] ---> using cache ---> 37a5e93cbe4a step 6/8 : expose 8080 ---> using cache ---> 1a2305853377 step 7/8 : cmd date ---> using cache ---> 8102785d418d step 8/8 : workdir /root ---> using cache ---> ad8a585d32e3 successfully built ad8a585d32e3 successfully tagged xindong_centos_3:latest
查看镜像,这就是我们刚刚创建好的镜像
[root@vm_0_5_centos ~]# docker images repository tag image id created size xindong_tomcat 1.1 f72aa7e90980 37 seconds ago 680mb
运行这个镜像
# 通过镜像id运行 docker run -d 镜像id/镜像名称 # 通过镜像名称运行 docker run -d 镜像名称:版本号
镜像保存、加载
如果需要将自己构建的镜像发送给别人,又不想通过仓库来共享,就可以用镜像保存的功能,
镜像保存
首先我们将镜像以文件的方式保存到本地磁盘,使用save
命令
docker save 镜像id/镜像名称 -o /本地目录/文件名称 # 比如这样 docker save ad8a585d32e3 -o /root/dockerfile/xx.tar # 运行后,就可以看到,文件已经保存成功了 [root@vm_0_5_centos dockerfile]# ll total 356440 -rw------- 1 root root 364991488 oct 28 18:45 xx.tar
加载已保存的镜像
使用load
命令加载,看到如下内容,表示镜像已经加载成功了
[root@vm_0_5_centos dockerfile]# docker load -i /root/dockerfile/xx.tar 2fefb3e7f055: loading layer [==================================================>] 47.6mb/47.6mb 8b589f61fd94: loading layer [==================================================>] 58.82mb/58.82mb 753a6b1d88c8: loading layer [==================================================>] 19.99mb/19.99mb loaded image id: sha256:ad8a585d32e34b301aab4b278704a908f6eca53884fd531a79859dd6054a22ae
接下来我们看看镜像已经加载好了,但是还没有名字
[root@vm_0_5_centos dockerfile]# docker images repository tag image id created sizead8a585d32e3 2 hours ago 356mb
接下来使用tag
命令给这个镜像起个名字和版本号吧
[root@vm_0_5_centos dockerfile]# docker tag ad8a585d32e3 xindong_tomcat_2:1.0 # 在看看镜像,已经有名字了 [root@vm_0_5_centos dockerfile]# docker images repository tag image id created size xindong_tomcat_2 1.0 ad8a585d32e3 2 hours ago 356mb
区别
- 使用commit的话,其他人或者过一段时间后自己也不知道这个镜像是怎么做出来的,都安装了什么。。但是使用dockerfile构建的镜像,我们能够很清楚看到是执行了哪些命令。
- 既然使用docker commit这么不方便,那我们为什么还要学习它呢?其实仔细想一下docker build的每一步构建出来的镜像是不是就是通过docker commit构建出来的。因此学习docker commit可以让我们更好的理解docker build;
其实说白了,不管是docker commit 和是dockefile,都是将目前已有的镜像经过处理后在生成一个新的镜像,它们之间的流程图如下
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。