docker打包 commit和Dockerfile

网友投稿 1079 2022-05-29

构建镜像

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

commit

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

1

2

3

4

5

6

7

8

9

10

dockerFile

特点

每个指令都必须是大写

执行顺序是从上到下顺序执行

# 表示注释

每个指令都会创建提交一个新的镜层,并提交(每个指令都是一个docker commit)

dockerFile是面向开发人员的;由开发人员构建镜像,就需要写dockerFile文件,然后将镜像交付给运维直接部署即可;不需要运维配置繁杂的jvm参数命令;

dockerFile正在逐渐称为企业的交付标注,所以开发人员必须要掌握;

dickerFile 指令

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

指令用法

FROM

FROM centos

1

MAINTAINER

MAINTAINER yexindong

1

ENV

# 环境变量可以随便设置,MYPATH为key ,/user/local是值 ENV MYPATH /user/local

1

2

EXPOSE

# 开放单个端口 EXPOSE 80 # 开放多个端口 EXPOSE 22 80 8080 3306 8009 8090

1

2

3

4

5

CMD

# 第一种用法 CMD echo 11 # 第二种用法 CMD ["echo","33"]

1

2

3

4

COPY

COPY

1

CMD 和 ENTRYPOINT 的区别

CMD 相同的指令只有最后一个会生效

ENTRYPOINT可以追加命令;

使用 dockerFile创建镜像

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

vim dockerFile_1

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

1

2

3

4

5

6

7

8

9

10

11

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

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

1

2

3

4

5

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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

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

1

2

3

运行这个镜像

# 通过镜像id运行 docker run -d 镜像id/镜像名称 # 通过镜像名称运行 docker run -d 镜像名称:版本号

1

2

3

4

5

6

7

镜像保存、加载

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

镜像保存

首先我们将镜像以文件的方式保存到本地磁盘,使用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

1

2

3

4

5

6

docker打包 commit和Dockerfile

7

加载已保存的镜像

使用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

1

2

3

4

5

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

[root@VM_0_5_centos dockerFile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ad8a585d32e3 2 hours ago 356MB

1

2

3

接下来使用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

1

2

3

4

5

6

区别

使用commit的话,其他人或者过一段时间后自己也不知道这个镜像是怎么做出来的,都安装了什么。。但是使用Dockerfile构建的镜像,我们能够很清楚看到是执行了哪些命令。

既然使用docker commit这么不方便,那我们为什么还要学习它呢?其实仔细想一下docker build的每一步构建出来的镜像是不是就是通过docker commit构建出来的。因此学习docker commit可以让我们更好的理解docker build;

其实说白了,不管是docker commit 和是dockefile,都是将目前已有的镜像经过处理后在生成一个新的镜像,它们之间的流程图如下

Docker 镜像服务

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:WinForm——TableLayoutPanel实例
下一篇:关于RabbitMQ的一些面试题
相关文章