Docker教程(六)——DockerFile解析

一、DockerFile简介

DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

构建步骤

1、编写一个DockerFile文件;
2、docker build 构建称为一个镜像;
3、docker run运行镜像;
4、 docker push发布镜像(DockerHub 、阿里云仓库)。

以我们熟悉的centos为例

在这里插入图片描述
我们可以看到官方的Dockerfile。
但是很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!

二、DockerFile的构建过程

1、基础知识:

1)、每个保留关键字(指令)都是必须是大写字母
2)、执行从上到下顺序
3)、#表示注释
4)、每一个指令都会创建提交一个新的镜像层,并提交!

2、Docker执行DockerFile的大致流程

在这里插入图片描述

3、小结

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段:

  • Dockerfile是软件的原材料

  • Docker镜像是软件的交付品

  • Docker容器则可以认为是软件的运行态。

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

在这里插入图片描述
1、Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;

2、Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;

3、Docker容器,容器是直接提供服务的。

三、Dockerfile的指令

在这里插入图片描述
文字版:

# DockerFile常用指令
FROM				# 基础镜像,一切从这里开始构建
MAINTAINER			# 镜像是谁写的, 姓名+邮箱
RUN					# 镜像构建的时候需要运行的命令
ADD					# 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR				# 镜像的工作目录
VOLUME				# 挂载的目录
EXPOSE				# 保留端口配置
CMD					# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT			# 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD				# 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。
COPY				# 类似ADD,将我们文件拷贝到镜像中
ENV					# 构建的时候设置环境变量!

四、CMD 和 ENTRYPOINT区别

1、CMD

CMD:指定这个容器启动的时候要运行的命令,当有多个CMD命令时,只有最后一个会生效,CMD也会被docker run 之后的参数所替代

比如我们的一个dockerfile文件如下:

FROM centos
CMD ["ls","-a"]
docker build  -f dockerfile-test-cmd -t cmd-test:0.1 .

当我们构建一个新镜像后,运行这个镜像想要实现 ls -al 的效果,我们直接执行如下命令:

docker run cmd-test:0.1 -l

这样是不行的,会有报错:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\":
 executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled 

这是因为:cmd的情况下 -l 替换了"ls","-a"。 最终变为cmd ["-l"] 。

应该写为:

ocker run cmd-test:0.1 ls -al
2、ENTRYPOINT

ENTRYPOINT:指定这个容器启动的时候要运行的命令,可以追加命令。docker run 之后的参数会被当作参数传递给ENTRYPOINT,之后形成新的命令组合。

还是上面的那个例子,我们的dockerfile文件如下:

FROM centos
ENTRYPOINT ["ls","-a"]

我们运行镜像时可以直接在docker run 后面追加参数:

$ docker run entrypoint-test:0.1 -l
total 56
drwxr-xr-x   1 root root 4096 May 16 06:32 .
drwxr-xr-x   1 root root 4096 May 16 06:32 ..
-rwxr-xr-x   1 root root    0 May 16 06:32 .dockerenv
lrwxrwxrwx   1 root root    7 May 11  2019 bin -> usr/bin
drwxr-xr-x   5 root root  340 May 16 06:32 dev
drwxr-xr-x   1 root root 4096 May 16 06:32 etc
drwxr-xr-x   2 root root 4096 May 11  2019 home
lrwxrwxrwx   1 root root    7 May 11  2019 lib -> usr/lib
lrwxrwxrwx   1 root root    9 May 11  2019 lib64 -> usr/lib64 ....

可以看到,我们运行时传进去的参数拼接在ENTRYPOINT的参数的后面,形成了一个新的命令,相当于ENTRYPOINT [“ls”,"-al"]。

五、实战测试

创建一个自己的centos。

1、Bas镜像(scratch):

在这里插入图片描述
Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的。

2、镜像仓库原始的的centos的情况:

在这里插入图片描述
所以,我们想自定义mycentos目的是使我们自己的镜像具备如下:

     登陆后的默认路径
     vim编辑器
     查看网络配置ifconfig支持
3、编写DockerFile
FROM centos
MAINTAINER macay<1207@126.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
4、通过这个文件构建镜像
命令 docker build -f 文件路径 -t 镜像名:[tag] .
docker build -f Dockerfile -t mycentos:1.0 .
  • -f 指定Dockerfile文件
  • -t 指定生成的镜像名(target)
  • .代表当前目录下,不能少

在这里插入图片描述
在这里插入图片描述
可以看到,通过build构建新镜像的过程完全是按照我们的dockfile文件来一步一步执行的。

5、运行容器
docker run -it mycentos:1.0

在这里插入图片描述
在这里插入图片描述

可以看到,我们自己的新镜像已经支持vim/ifconfig命令,且终端登陆进来就是我们设置的工作目录/usr/local,说明扩展成功了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值