dockerfile作用
首先我们查看官方文档对于dockerfile的解释
Docker can build images automatically by reading the instructions from a Dockerfile. A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image. Using docker build users can create an automated build that executes several command-line instructions in succession.
(Docker 可以通过读取 Dockerfile 中的指令自动构建镜像。 Dockerfile 是一个文本文档,其中包含用户可以在命令行上调用以组合图像的所有命令。使用 docker build 用户可以创建一个连续执行多个命令行指令的自动构建。)
这是官方对于dockerfile作用的解释。看英文也看的很明白,我们平时要多读英文,读着读着查着查着慢慢就会了。
说白了dockerfile就是可以用一段命令来创建一个镜像。可以把整个你的项目,项目需要的环境,在这一个dockerfile里面全部构建完毕。到时候创建镜像就可以当做环境软件安装包。发布直接创建容器即可。
dockerfile指令集
网上找了一张图片,这个比喻的特别恰当,我们来编写dockerfile时就可以参照下图来做。
dockerfile初步尝试
我们看完上面图之后我们来做一个初步的尝试,做啥事都要勇于尝试,你不试试你怎么知道自己是真的不行?hhh
我们来构建一个简单的centos系统,同时安装一些我们需要的命令
FROM centos:latest #基础镜像
MAINTAINER HONG<1034996580@qq.com> #标注作者
RUN yum -y install vim #安装命令
EXPOSE 80
CMD echo "start"
ENTRYPOINT ["ls","-a"]
创建完成,可以发现docker解析dockerfile是一行一行跑的。
我们看看镜像里面是不是已经有了
现在看到我们的mycentos2已经有镜像了 大小比基础的要大几十M 因为我们装了一些功能。看来阉割真的能减少很多空间呀
我们现在来启动下 顺便看看CMD和ENTRYPOINT的区别
CMD:The main purpose of a CMD is to provide defaults for an executing container. These defaults can include an executable, or they can omit the executable, in which case you must specify an ENTRYPOINT instruction as well.
意思是,cmd给出的是一个容器的默认的可执行体。也就是容器启动以后,默认的执行的命令。重点就是这个“默认”。意味着,如果docker run没有指定任何的执行命令或者dockerfile里面也没有entrypoint,那么,就会使用cmd指定的默认的执行命令执行。同时也从侧面说明了entrypoint的含义,它才是真正的容器启动以后要执行命令。
- CMD三种使用方法
The CMD instruction has three forms:
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
ENTRYPOINT:An ENTRYPOINT allows you to configure a container that will run as an executable.
这句话意思就是说ENTRYPOINT才是真正容器启动后的执行体。这也就是入口的含义
上图也表明了CMD和ENTRYPOINT的三种使用方式
我们说说区别
CMD在官方文档说的时候有个词汇我们重点关注,默认 默认什么意思? 我们在docker run 的时候 后面如果没加参数命令
那么就会默认执行CMD的命令行 如果加了 就会覆盖CMD的命令 就是这个意思 所以有多个CMD 也就只会最后一条生效。
话不多说实战我们练一练
FROM centos
CMD ["ls","-a"]
[root@VM_0_16_centos ~]# docker build -f ./dockerfile-test -t dockerfile-test .
镜像打好了
我们跑起来
docker run dockerfile-test2
[root@VM_0_16_centos ~]# docker run dockerfile-test2 -a
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-a": executable file not found in $PATH: unknown.
我们尝试追加参数 ,发现是不可以的
必须写全部命令来替换CMD的默认命令 也就是需要将默认的全部替换掉
- 测试ENTRYPOINT
FROM centos
ENTRYPOINT ["ls","-a"]
docker build -f ./dockerfile-test -t dockerfile-entrypoint .
如果里面使用的是ENTRYPOINT 是可以直接去追加的
我们直接这么理解吧
CMD 后面如果执行 ls -a
我们在run后面追加 -l的话 会默认执行-l 但是-l不是命令 所以会报错
但是ENTRYPOINT 后面加参数 他是可以加上去
也就是追加的就变成 ls -a -l 这样执行是没有问题的
这就是两者的区别
用着用着就会了 呵呵哈哈哈