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如果前面执行过,并且前面的内容没有发生过变化,则前面内容不会再执行;如果是中间某步骤发生了变化,则发声变化之后的所有步骤都需要重新执行。