DockerFile简介

DockerFile可以说是一种可以被Docker程序解释的脚本,DockerFile是由一条条的命令组成的,每条命令对应linux下面的一条命令,Docker程序将这些DockerFile指令再翻译成真正的linux命令,其有自己的书写方式和支持的命令,Docker程序读取DockerFile并根据指令生成Docker镜像,相比手动制作镜像的方式,DockerFile更能直观的展示镜像是怎么产生的,有了写好的各种各样DockerFile文件,当后期某个镜像有额外的需求时,只要在之前的DockerFile添加或者修改相应的操作即可重新生成新的Docke镜像,避免了重复手动制作镜像的麻烦。

https://docs.docker.com/engine/reference/builder/ #dockerfile使用文档

DockerFile指令介绍

ADD:拷贝,可以自动解压tar包;
COPY:拷贝;
ENV:设置环境变量;
EXPOSE:暴露容器端口;
FROM:父镜像;
LABEL:标签,指定生成镜像的元数据,如作者及邮箱等;
STOPSIGNAL:指定容器退出的信号值;当容器退出时,执行所指定的信号值,如正常退出信号值;
USER:指定容器执行操作的用户;即Dockerfile中,USER以下的所有指令,全部都以USER所指定的用户身份去执行,并且将以指定用户的身份去进入到容器中;
VOLUME:创建挂载点,用于挂载外部存储,将容器中的数据保存到外部存储上。避免数据丢失,一次可以创建多个挂载点;
WORKDIR:在容器中,指定工作目录;WORKIDR指定一个如/apps/nginx,则WORKDIR后面的操作,如创建删除,将在/apps/nginx目录下执行;如果指定多个WORKDIR,如一个指定了/apps/nginx/,一个指定了linux,则最终的工作目录是/apps/nginx/linux;
RUN:在容器中执行shell命令;当执行Dockerfile文件中的RUN指令时,会生成一个临时容器,在临时容器中执行完RUN所指定的命令后,删除容器(其实是把容器提交为一个镜像);LABEL、EXPOSE、ENV、USER、WORKDIR、VOLUME、ENTRYPOINT、CMD都会在创建镜像时产生一个临时容器;
ENTRYPOINT:也是镜像启动为容器后,所执行的指令,如果ENTRYPOINT后面有CMD,则CMD中的指令将以参数形式传递给ENTRYPOINT;如ENTRYPOINT ["nginx"]  CMD["-g", "daemon off;"]
CMD:镜像启动为容器后,默认执行的命令;

注意:
容器中必须有一个一直运行的进程(任务),否则容器执行完所指定的任务之后,就会退出;即容器如果没有一个守护进程(一直在前台运行的进程),则容器会直接退出,如果把守护进程kill掉,容器也会直接退出。

DockerFile 制作编译版 nginx 1.16.1 镜像

1、root@test:~# mkdir /opt/dockerfile/{web/{nginx/static,php,tomcat},system/{ubuntu,centos}} -pv    #创建dockerfile文件存放目录

2、root@test:~# cd /opt/dockerfile/web/nginx/

3、root@test:/opt/dockerfile/web/nginx# zip static.zip static/*    #nginx所需要的数据

4、root@test:/opt/dockerfile/web/nginx# vim Dockerfile             #制作dockerfile
#Docker image for nginx      #注释信息

FROM centos:7.7.1908         #指定父镜像,基于哪个镜像基础之上做自定义构建;第一行必须为FROM,如果本地有该镜像,使用本地,如果本地没有,则去官方仓库下载

LABEL maintainer="dongge 903662133@qq.com"   #指定维护者信息,邮箱

ENV password 123456                          #创建环境变量,将变量传递给容器

RUN yum install epel-release -y && yum install vim wget unzip tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop -y                   #run是执行shell命令,构建镜像时,shell命令必须是非交互式的

ADD nginx-1.16.1.tar.gz /usr/local/src       #没生成容器时,是打到镜像中,生成为容器时,则打到容器的/usr/local/src中;ADD会对tar.gz的包自动解压,COPY不会,tar是linux自带命令,unzip不是;如果ADD的是配置文件,则会把容器中指定目录下同名的文件进行覆盖

RUN cd /usr/local/src/nginx-1.16.1 && ./configure --prefix=/apps/nginx && make && make install && rm /usr/local/src/nginx-1.16.1 -rf

ADD static.zip /apps/nginx/html

RUN cd /apps/nginx/html && unzip static.zip && rm static.zip -f

EXPOSE 80 443                                         #暴露容器的80和443端口

CMD ["/apps/nginx/sbin/nginx", "-g", "daemon off;"]   #镜像启动为容器后,指定默认执行的指令;在容器前台执行nginx进程,使之成为pid为1的守护进程

5、root@test:/opt/dockerfile/web/nginx# docker build -t nginx:make-v1 .         #创建镜像,指定镜像的仓库名及tag号,指定Dockerfile文件所在路径为当前目录下

6、oot@test:/opt/dockerfile/web/nginx# docker run -it -p 8686:80 nginx:make-v1  #创建容器

注意事项:
dockerfile如果前面执行过,并且前面的内容没有发生过变化,则前面内容不会再执行;如果是中间某步骤发生了变化,则发声变化之后的所有步骤都需要重新执行。