1.Dockerfile简介
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
1.1为何使用Dockerfile构建镜像
例如我们通过镜像部署一个nginx容器,部署完以后,通常运行在默认配置下
可生产环境中默认配置并不能满足我们的需求,此时我们就需要不停的修改nginx的配置
之前的几种修改方式:
1.通过docker exec进入容器内修改
2.通过挂载存储卷,在宿主机内修改,同步容器内nginx的配置
3.在宿主机拷贝nginx配置文件模板,通过docker cp传入nginx容器内并覆盖
4.建立模板nginx容器,每次修改完将该容器提交为新的镜像,利用新镜像重新搭建一个nginx服务
缺点:
1.每次有环境更新,需要修改配置时,都要一遍遍的手动修改,维护复杂
2.修改后的配置文件不一定能直接生效,还需要重启服务
使用Dockerfile构建镜像
dockerfile,相当于是一个文档,我们可以基于dockerfile生成新的容器
dockerfile仅仅是用来制作镜像的源码文件,是构建容器过程中的指令,docker能够读取dockerfile的指令进行自动构建容器,这样只需个性化的修改dockerfile文件然后生成新容器就可以,方便维护
基于dockerfile制作镜像,每一个指令都会创建一个镜像层,即镜像都是多层叠加而成,因此,层越多,效率越低,创建镜像,层越少越好。因此能在一个指令完成的动作尽量通过一个指令定义。
1.2Dcokerfile工作逻辑
首先需要有一个制作镜像的目录,该目录下有个文件,名称必须为Dockerfile,Dockerfile有指定的格式,#号开头为注释,,指令默认用大写字母来表示,以区分指令和参数,docker build读取Dockerfile是按顺序依次Dockerfile里的配置,且第一条非注释指令必须是FROM 开头,表示基于哪个基础镜像来构建新镜像。可以根据已存在的任意镜像来制作新镜像。
Dockerfile可以使用环境变量,用ENV来定义环境变量,变量名支持bash的变量替换,如${variable:-word},表示如果variable变量值存在,就使用原来的变量,变量为空时,就使用word作为变量的值
1.3Dockerfile常用指令
Dockerfile常用指令 | 作用 |
FROM | 指定 base 镜像 |
MAINTAINER | 设置镜像的作者,可以是任意字符串 |
COPY | 将文件从 build context 复制到镜像 |
ADD | 与 COPY 类似,从 build context 复制文件到镜像。不同的是,如果 src 是归档文件(tar, zip, tgz, xz 等),文件会被自动解压到目标路径 |
ENV | 设置环境变量,环境变量可被后面的指令使用 |
EXPOSE | 指定容器中的进程会监听某个端口,Docker 可以将该端口暴露出来 |
VOLUME | 将文件或目录声明为 volume,即将宿主机的目录挂载到容器上,可指定挂载的容器目录位置,但不可指定宿主机目录位置,宿主机目录位于/var/lib/docker/volumes下 |
WORKDIR | 为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录 |
RUN | 在容器中运行指定的命令 |
CMD | 容器启动时运行指定的命令,会被启动容器命令run后的参数覆盖掉 |
ENTRYPOINT | 设置容器启动时运行的命令,优先级高于CMD |
2.Dockerfile构建镜像实战
2.1构建带完整操作系统的nginx服务
FROM centos:7 #容器搭建为centos7
MAINTAINER Q #作者为Q
RUN yum -y update #更新yum仓库所有软件
RUN yum -y install gcc gcc-c++ make pcre-devel zlib-devel
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.2.tar.gz /usr/local/src #将宿主机本地的该文件导入容器内,ADD会自动解压归档文件,COPY不会
WORKDIR /usr/local/src/nginx-1.12.2 #指定下面的工作目录
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
RUN cp /usr/local/nginx/sbin/* /usr/local/bin
EXPOSE 80 #将80端口暴露出来
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf #关闭nginx的守护进程,否则会和容器的守护进程冲突
VOLUME ["/usr/local/nginx/html/"] #将nginx的网页目录挂载到宿主机来,以便写入内容,通过docker volume ls可查看宿主机目录名称及挂载信息
ENTRYPOINT ["nginx"] #当容器启动时第一时间启动nginx
docker build -t nginx:n1 . #构建镜像,.代表上下文路径,即当前目录下,Dockerfile文件和需要的文件需在此目录下,或者用-f选项指定Dockerfile文件位置