docker打包 commit和Dockerfile

发布时间:2022-03-01 09:50:14 作者:yexindonglai@163.com 阅读(1144)

构建镜像

构建镜像的两种方法:docker commit和docker build。通过这2种方式构建出来的镜像大小都是一样的;那么既然这2种方式都一样,我们应该使用哪一种呢?

commit

用户提交对容器的修改,并生成新的镜像。

  1. docker commit -a="作者" -m="说明" -p 容器id/容器名称 镜像新名称:镜像版本
  2. # 举例,制作当前的tomcat容器生成镜像
  3. docker commit -a="yexindong" -m="首次制作的镜像" tomcat_1 mytomcat:1.0
  4. # 参数说明
  5. -a :提交的镜像作者;
  6. -c :使用Dockerfile指令来创建镜像;
  7. -m :提交时的说明文字;
  8. -p :在commit时,将容器暂停。

dockerFile

特点

  • 每个指令都必须是大写
  • 执行顺序是从上到下顺序执行
  • # 表示注释
  • 每个指令都会创建提交一个新的镜层,并提交(每个指令都是一个docker commit)
  • dockerFile是面向开发人员的;由开发人员构建镜像,就需要写dockerFile文件,然后将镜像交付给运维直接部署即可;不需要运维配置繁杂的jvm参数命令;
  • dockerFile正在逐渐称为企业的交付标注,所以开发人员必须要掌握;

dickerFile 指令

使用dockerFile创建镜像,实际上就是用脚本文件的方式创建;脚本内指令如下

  1. FROM 指定基础镜像(它的妈妈是谁)
  2. MAINTAINER 指定作者(告诉别人,是谁创造了它),一般都是姓名 + 邮箱
  3. LABEL 指定标签信息
  4. USER 设置容器运行时的用户
  5. RUN build过程要运行的命令 (在容器外运行,也就是在宿主机运行的命令,在这里我们可以给容器安装一些应用程序 yum install xxxx
  6. ADD 添加文件到镜像中(往它肚子里放点东西),如果.tar.gz文件的话, 会自动解压
  7. COPY 类似ADD,将文件拷贝到镜像,不会解压压缩文件
  8. ENV 设置环境变量
  9. VOLUME 设置文件挂载(给它一个存放行李的地方),默认是匿名挂载
  10. EXPOSE 暴露端口,指定容器运行时开放的端口,运行也需要开放这个端口才能访问 docker run -d -p 8080:8080 镜像id (打开一扇窗,让风(数据)可以来去自如)
  11. CMD 容器运行时要执行的命令(在容器内运行的命令),可用来运行默认要运行的程序,只有最后一个CMD才会运行,且只运行一次
  12. ENTRYPOINT CMD一样,但是可以追加命令;
  13. ONBIUILD 当构建一个被继承dockerFile,这个时候就会运行ONBUILD 指令,属于触发指令
  14. WORKDIR 指定工作目录,也就是登陆后默认进去的目录;

指令用法

FROM
  1. FROM centos
MAINTAINER
  1. MAINTAINER yexindong<xxx@163.com>
USER

指定用户运行,默认使用root用户,在docker run 中可以通过 -u 选项来覆盖USER指令的设置。
如果不是内置帐户,则必须首先创建该用户;

  1. USER root
ENV
  1. # 环境变量可以随便设置,MYPATH为key ,/user/local是值
  2. ENV MYPATH /user/local
EXPOSE
  1. # 开放单个端口
  2. EXPOSE 80
  3. # 开放多个端口
  4. EXPOSE 22 80 8080 3306 8009 8090
ADD
  1. # file 是你当前宿主机的文件名称
  2. # /root/home 是你要将file打包到镜像的目录
  3. ADD file /root/home
COPY

用法与ADD一致,区别是COPY指令不会解压文件

  1. COPY file /root/home
CMD

容器内运行命令,只能运行一个命令

  1. # 第一种用法
  2. CMD echo 11
  3. # 第二种用法
  4. CMD ["echo","33"]
ENTRYPOINT

容器内运行命令,用法和CMD一致,区别是可以运行多个命令

  1. # 定义多个 ENTRYPOINT 就可以运行多个命令
  2. ENTRYPOINT ["ls","-l"]
  3. ENTRYPOINT ["./start.sh"]
  4. ENTRYPOINT ps -ef | grep tomcat

CMD 和 ENTRYPOINT 的区别

  • CMD 相同的指令只有最后一个会生效
  • ENTRYPOINT可以追加命令;

使用 dockerFile创建镜像

那么现在我们就自己一个tomcat的镜像,首先创建一个文件 dockerFile_1

  1. vim dockerFile_1

脚本内容如下,注意,脚本内的关键字必须是大写的,VOLUME 是匿名挂载的

  1. FROM centos
  2. RUN yum install net-tools.x86_64 -y
  3. RUN yum -y install vim
  4. RUN yum install vi -y
  5. VOLUME ["/data/tomcat_file_1","/data/tomcat_file_2"]
  6. EXPOSE 8080
  7. # 打印当前时间
  8. CMD date
  9. WORKDIR /root

创建好脚本文件后,就可以就行构建了,注意后面那个点

  1. docker build -f dockerFile_1 -t xindong_centos_3:1.1 .
  2. # 说明
  3. -f 需要构建的脚本文件
  4. -t tag的缩写,构建后的镜像名称:版本号

运行命令后展示以下信息,就表示已经构建成功了

  1. Sending build context to Docker daemon 1.802GB
  2. Step 1/8 : FROM centos
  3. ---> 5d0da3dc9764
  4. Step 2/8 : RUN yum install net-tools.x86_64 -y
  5. ---> Using cache
  6. ---> a3d489e47eeb
  7. Step 3/8 : RUN yum -y install vim
  8. ---> Using cache
  9. ---> f7dfc03c0fd9
  10. Step 4/8 : RUN yum install vi -y
  11. ---> Using cache
  12. ---> c111382ba821
  13. Step 5/8 : VOLUME ["data/tomcat_file_1","/data/tomcat_file_2"]
  14. ---> Using cache
  15. ---> 37a5e93cbe4a
  16. Step 6/8 : EXPOSE 8080
  17. ---> Using cache
  18. ---> 1a2305853377
  19. Step 7/8 : CMD date
  20. ---> Using cache
  21. ---> 8102785d418d
  22. Step 8/8 : WORKDIR /root
  23. ---> Using cache
  24. ---> ad8a585d32e3
  25. Successfully built ad8a585d32e3
  26. Successfully tagged xindong_centos_3:latest

查看镜像,这就是我们刚刚创建好的镜像

  1. [root@VM_0_5_centos ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. xindong_tomcat 1.1 f72aa7e90980 37 seconds ago 680MB

运行这个镜像

  1. # 通过镜像id运行
  2. docker run -d 镜像id/镜像名称
  3. # 通过镜像名称运行
  4. docker run -d 镜像名称:版本号

镜像保存、加载

如果需要将自己构建的镜像发送给别人,又不想通过仓库来共享,就可以用镜像保存的功能,

镜像保存

首先我们将镜像以文件的方式保存到本地磁盘,使用save命令

  1. docker save 镜像id/镜像名称 -o /本地目录/文件名称
  2. # 比如这样
  3. docker save ad8a585d32e3 -o /root/dockerFile/xx.tar
  4. # 运行后,就可以看到,文件已经保存成功了
  5. [root@VM_0_5_centos dockerFile]# ll
  6. total 356440
  7. -rw------- 1 root root 364991488 Oct 28 18:45 xx.tar

加载已保存的镜像

使用load命令加载,看到如下内容,表示镜像已经加载成功了

  1. [root@VM_0_5_centos dockerFile]# docker load -i /root/dockerFile/xx.tar
  2. 2fefb3e7f055: Loading layer [==================================================>] 47.6MB/47.6MB
  3. 8b589f61fd94: Loading layer [==================================================>] 58.82MB/58.82MB
  4. 753a6b1d88c8: Loading layer [==================================================>] 19.99MB/19.99MB
  5. Loaded image ID: sha256:ad8a585d32e34b301aab4b278704a908f6eca53884fd531a79859dd6054a22ae

接下来我们看看镜像已经加载好了,但是还没有名字

  1. [root@VM_0_5_centos dockerFile]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. <none> <none> ad8a585d32e3 2 hours ago 356MB

接下来使用tag命令给这个镜像起个名字和版本号吧

  1. [root@VM_0_5_centos dockerFile]# docker tag ad8a585d32e3 xindong_tomcat_2:1.0
  2. # 在看看镜像,已经有名字了
  3. [root@VM_0_5_centos dockerFile]# docker images
  4. REPOSITORY TAG IMAGE ID CREATED SIZE
  5. 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,都是将目前已有的镜像经过处理后在生成一个新的镜像,它们之间的流程图如下
在这里插入图片描述

关键字Docker