面试官:你说你精通 Docker,那你来详细说说 Dockerfile 吧
一、 带着问题学Dockerfile
1、疑问
我们都知道从远程仓库可以pull一个tomcat等镜像下来,然后docker run启动容器,然后docker exec -it 容器id /bin/bash进入容器,往webapps下仍我们的程序。等等这一系列操作,都需要人工一步步的去操作,那我问你:你没qa和生产环境的部署权限,你咋操作这些?这就需要将所有人工一步步操作的地方都写到Dockerfile文件里,然后将文件给到运维人员,他们build成镜像然后进行启动。
2、举例
比如:你要用tomcat部署一个war包,这时候你的Dockerfile文件内容会包含如下:
将tomcat从远程仓库拉下来
进入到tomcat的webapps目录
将宿主机上的war包扔到容器的webapps目录下
然后运维拿着这个Dockerfile进行build成image,在run一下启动容器。大功告成
3、好处
上面的例子好处不难发现
Dockerfile解放了手工操作很多步骤
Dockerfile保证了环境的统一
再也不会出现:QA是正常的,线上就是不行的情况了(前提是由于环境问题导致的 ),因为Dockerfile是同一份,大到环境,小到版本全都一致。再有问题那也是代码问题,节省了和运维人员大量“亲密接触”的时间。
二、什么是Dockerfile
知道Dockerfile是干嘛的了,那Dockerfile的定义到底是啥呢?
Dockerfile中文名叫镜像描述文件,是一个包含用于组合镜像目录的文本文档,也可以叫“脚本”。他通过读取Dockerfile中的指令安装步骤自动生成镜像。
补充:文件名称必须是:Dockerfile
三、Dockerfile命令
1、构建镜像命令
docker build -t 机构/镜像名称<:tags> Dockerfile目录
比如如下,最后一个.代表当前目录,因为我的Dockerfile文件就在这,也可以用绝对路径
docker build -t chentongwei.com/mywebapp:1.0.0 .
然后执行docker images 进行查看会发现有我们刚才构建的镜像
docker images
面试官:你说你精通 Docker,那你来详细说说 Dockerfile 吧
2、基础命令
2.1、FROM
制作基准镜像
FROM 镜像
比如我们要发布一个应用到tomcat里,那么的第一步就是FROM tomcat
FROM tomcat<:tags>
先有个印象,下面会实战操作。
2.2、LABEL&MAINTAINER
MAINTAINER,一般写个人id或组织id
LABEL 就是注释,方便阅读的,纯注释说明。不会对Dockerfile造成任何影响
比如:
MAINTAINER baidu.com
LABEL version = “1.0.0”
LABEL description = “我们是大百度!”
…等等描述性信息,纯注释。
2.3、WORKDIR
类似于Linux中的cd命令,但是他比cd高级的地方在于,我先cd,发现没有这个目录,我就自动创建出来,然后在cd进去
WORKDIR /usr/local/testdir
这个路径建议使用绝对路径。
2.4、ADD©
2.4.1、COPY
将1.txt拷贝到根目录下。它不仅仅能拷贝单个文件,还支持Go语言风格的通配符,比如如下:
COPY 1.txt /
拷贝所有 abc 开头的文件到testdir目录下
COPY abc* /testdir/