docker打包 commit和Dockerfile
Posted java叶新东老师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker打包 commit和Dockerfile相关的知识,希望对你有一定的参考价值。
构建镜像
构建镜像的两种方法: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<xxx@163.com>
ENV
# 环境变量可以随便设置,MYPATH为key ,/user/local是值
ENV MYPATH /user/local
CMD
# 第一种用法
CMD echo 11
# 第二种用法
CMD ["echo","33"]
COPY
COPY
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 镜像名称:版本号
区别
-
使用commit的话,其他人或者过一段时间后自己也不知道这个镜像是怎么做出来的,都安装了什么。。但是使用Dockerfile构建的镜像,我们能够很清楚看到是执行了哪些命令。
-
既然使用docker commit这么不方便,那我们为什么还要学习它呢?其实仔细想一下docker build的每一步构建出来的镜像是不是就是通过docker commit构建出来的。因此学习docker commit可以让我们更好的理解docker build;
其实说白了,不管是docker commit 和是dockefile,都是将目前已有的镜像经过处理后在生成一个新的镜像,它们之间的流程图如下
以上是关于docker打包 commit和Dockerfile的主要内容,如果未能解决你的问题,请参考以下文章