docker之dockerFile

2022-01-31 10:04:07 浏览数 (1)

概念

我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,这个脚本就是Dockerfile; Dockerfile是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建;

dockerFile指令

基本指令如图:

从上图我们可以看到dockerFile的一些相关指令, 完整指令如图:

自定义一个centos镜像

我们现在写一个dockerFile自定义一个centos镜像让它有这些命令;

构建一个dockerFile我们一定要有一个dockerFile文件,文件的命名可以随意,但是不建议随意命名,官方的命名就是DockerFile;

代码语言:javascript复制
cd /home
mkdir dockerFile
cd dockerFile
vim myDokerFile-centos

进去编辑如下:

可以看到我们是基于centos来构建的,注明了作者,定义了一个MYPATH的环境变量并指定为工作目录,在运行构建的时候安装vim命令和网络工具,对外暴露的是80端口,容器启动的时候输出自定义的环境变量,构建完成后输出一个bilid-end标记;最后跳转到默认的控制台;

有了这个dockerFile后我们基于它构建一个我们自己的镜像

代码语言:javascript复制
docker build -f myDokerFile-centos -t mycentos:1.0 .
# -f指哪个文件 不指定就会去找默认的名为DockeFile的文件
# -t起个镜像的名字 注意最后的"."别掉了

我们通过命令看下镜像的构建历史,可以看到镜像确实是按照我们的命令一层一层构建的;而且每一条命令执行完毕,就提交生成一个新的镜像层;

CMD & ENTRYPOINT

疑问?我们构建镜像的时候,用了三个CMD命令,发现只有最后一个CMD命令生效了,其实关于dockerfile 的CMD和ENTRYPOINT 命令有一个的区别,其中一个最主要的区别的时,CMD,ENTRYPOINT 命令编写多个时会只有最后一个生效,其中CMD命令如果在启动的时候加了命令会被替换,而ENTRYPOINT命令如果在启动的时候加了命令是在原命令中追加;具体实践很简单,自己尝试下即可;

CMD和ENTRYPOINT的应用场景,比如我们指定环境的运行内存时,如果我们用了CMD命令,那么用户在启动镜像的时候就可以更改;如果我们使用了ENTRYPOINT命令,那么用户只能在启动容器的时候追加命令,不能更改;

如果在Dockerfile中同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT 的参数;

如果在Dockerfile中同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效

dockerFile卷挂载

之前我们使用-v命令指定了tomcat的目录挂载,接下来我们看看另外一种挂载方式:dockerFile卷挂载

同样我们还是在home目录下新建一个测试目录,测试下dockerFile的卷挂载

vim 进去我们编写一个简单的dockerFile脚步

代码语言:javascript复制
FROM centos
VOLUME ["/datavolume01","/datavolume02]
CMD echo "------build-end-----"
CMD /bin/bash

0 人点赞