概念
Dockerfile是什么
Docker提供的一个用于自定义构建镜像的配置文件。
Dockerfile的作用就是描述如何构建一个镜像。
为什么要使用Dockerfile
- 项目打包成Docker镜像,后续部署更方便。
- 构建镜像的基础服务镜像,更容易精简镜像大小。
Dockerfile的作用
- 可以自定义镜像内容;
- 构建公共基础镜像,减少其他镜像配置;
- 更灵活的组合自定义镜像;
- 可以实现服务的快速部署;
命令
指令列表
- FROM:
- 格式:FROM
- 解释:指定基础镜像。每个 Dockerfile 必须以 FROM 指令开始。
- 举例:
FROM ubuntu:18.04
- LABEL:
- 格式:LABEL = = …
- 解释:为镜像添加元数据标签,这些标签可以包含在 docker push 命令中。
- 举例:
LABEL maintainer="WangMingWu <wangmingqu@example.com>"
- RUN
- 格式:RUN 或 RUN [“executable”, “param1”, “param2”]
- 解释:执行指定的命令并将其结果添加到镜像中。可以是 Shell 命令或执行文件。
- 举例:
RUN apt-get update && apt-get install -y wget
- CMD
- 格式:CMD [“executable”, “param1”, “param2”] 或 CMD [“param1”, “param2”] 或 CMD command param1 param2
- 解释:指定容器启动时要执行的命令。如果指定了多个命令,只有最后一个命令会被执行。
- 举例:
CMD ["npm", "start"]
- ENTRYPOINT
- 格式:ENTRYPOINT [“executable”, “param1”, “param2”] 或 ENTRYPOINT [“param1”, “param2”] 或 ENTRYPOINT command param1 param2
- 解释:指定容器启动时要执行的命令。与 CMD 指令不同,ENTRYPOINT 指令不会被覆盖,因此它是启动容器时的主要命令。
- 举例:
ENTRYPOINT ["npm", "start"]
- COPY
- 格式:COPY … 或 COPY [“”,… “”]
- 解释:将文件或目录从宿主机的文件系统复制到镜像中。如果源路径是相对路径,它将被解释为相对于 Dockerfile 文件的位置。
- 举例:
COPY . /app
- ADD
- 格式:ADD … 或 ADD [“”,… “”]
- 解释:类似于 COPY,但它会自动处理 URL 和 tar 文件。如果源路径是 URL,它会下载文件并添加到镜像中。
- 举例:
ADD . /app
- ENV
- 格式:ENV
- 解释:设置环境变量。可以在 RUN 指令中使用这些环境变量。
- 举例:
ENV DEBIAN_FRONTEND noninteractive
- VOLUME
- 格式:VOLUME [“”] 或 VOLUME
- 解释:创建一个可以从宿主机挂载的卷。可以在容器运行时挂载卷。
- 举例:
VOLUME ["/data"]
- EXPOSE
- 格式:EXPOSE [/…]
- 解释:声明容器监听的端口。这不会自动将端口暴露给宿主机。
- 举例:
EXPOSE 8080
- WORKDIR
- 格式:WORKDIR
- 解释:指定工作目录,即容器中的工作目录。
- 举例:
WORKDIR /app
- USER
- 格式:USER [:]
- 解释:指定运行后续 RUN, CMD, ENTRYPOINT 和 VOLUME 指令的用户。
- 举例
WORKDIR /app
- ONBUILD
- 格式:ONBUILD
- 解释:用于构建触发器,当父镜像被用于构建新镜像时执行。
- 举例:
ONBUILD ADD . /app
- ARG
- 格式:ARG [=]
- 解释:定义构建时使用的变量。可以在 RUN 指令中使用这些变量。
- 举例:
ARG BUILD_DATE
- MAINTAINER
- 格式:MAINTAINER
- 解释:指定镜像的维护者信息。这个指令已经被 LABEL 指令取代,并且在新版本的 Dockerfile 中不推荐使用。
- 举例:
MAINTAINER John Doe <johndoe@example.com>
- STOPSIGNAL
- 格式:STOPSIGNAL signal
- 解释:指定容器停止时使用的信号。例如,STOPSIGNAL SIGINT。
- 举例:
STOPSIGNAL SIGTERM
- HEALTHCHECK
- 格式:HEALTHCHECK [OPTIONS] CMD command 或 HEALTHCHECK NONE
- 解释:配置容器的健康检查。这可以是简单的命令,也可以是更复杂的检查,例如 HTTP 请求。NONE 选项可以用来禁用健康检查。返回参数:0:success–>健康状态;1:unhealthy–>不健康;2:reserved–>保留值。
- 举例:
HEALTHCHECK --interval=5m --timeout=30s --start-period=40s --retries=3 --cmd='curl -f http://localhost/health'
- SHELL
- 格式:SHELL [“executable”, “parameters”]
- 解释:指定在 RUN, CMD, ENTRYPOINT, COPY, ADD 指令中使用的 Shell。默认情况下,Docker 使用 /bin/sh -c。
- 举例:
SHELL ["/bin/bash", "-c"]
常用指令
#1. 先指定当前镜像基于那个基础镜像
FROM centos:latest
#2. 指定镜像的作者联系方式
MAINTAINER WangMingQu<15515190288@163.com>
#3. 为镜像设置标签信息,如:描述、版本
LABEL Version="1.0"
LABEL Description="Nginx Image"
#4. 为镜像设置环境变量
ENV JAVA_ENV dev
ENV APP_NAME test-dockerfile
#5. 为镜像构建时设置执行命令
RUN ls -al
RUN mkdir /www/test/dockerfile
#6. 将主机中的文件夹复制到镜像中对应位置(要拷贝的文件需要与Dockerfile在同一级下)
ADD ./hosts /www/data/hosts
ADD ./config/ /www/data/config/
#7. 为镜像设置工作目录,如果此目录不存在则自动创建
WORKDIR /www/data/
#8. 为镜像设置挂载目录,声明对外挂载的目录
VOLUME /usr/local/apache-7.9.1/logs
VOLUME /usr/local/apache-7.9.1/conf
VOLUME /usr/local/apache-7.9.1/html
#9. 为镜像设置暴漏端口,声明对外保留的端口
EXPOSE 8080
EXPOSE 3306
#10. 为镜像启动容器时默认执行的脚本,CMD和ENTRYPOINT二选一即可
CMD startup.sh
#ENTRYPOINT CMD startup.sh
#11. 为镜像构建时指定变量
ARG version=latest
#12. 为镜像设置用户,为容器运行时指定用户,后续执行的命令都基于tomcat用户
USER tomcat
#13. 为镜像设置健康检查,检查容器运行时的健康状态
HEALTHCHECK --interval=10 --timeout=3 --retries=5 --cmd='ps -ef | grep tomcat'
生成镜像
基于现有容器构建一个镜像
- 运行一个容器
docker run -it -d -p 192.168.108.128:8989:80/udp --name nginx_004 nginx:1.20
- 生成镜像
docker commit -a 'wangmingqu' -m 'MingQu-nginx' nginx_004 mq-nginx:1.0
- 参数解释
commit #基于现有容器构建镜像
-a #指定镜像作者
-m #指定镜像信息
nginx_004 #基于那个镜像生成的新镜像
mq-nginx:1.0 #生成新镜像的名称和版本
- 查看镜像
docker images
# REPOSITORY TAG IMAGE ID CREATED SIZE
# mq-nginx 1.0 76ab7dc3b665 3 seconds ago 141MB
通过Dockerfile构建一个镜像
- 编辑dockerfile文件
ARG version=latest
FROM centos:${version}
MAINTAINER WangMingQu<15515190288@163.com>
ADD ./data/ /www/data/
WORKDIR /www/data/
ENTRYPOINT ping 127.0.0.1
- 生成镜像
docker build -f /root/Dockerfile -t my_centos:v1.0 .
- 参数解释
-f #指定dockerfile文件路径
-t #指定生成的镜像名称及标签
- 查看镜像
docker images | grep centos
# my_centos v1.0 24632478ae99 4 minutes ago 231MB
应用
应用举例
- 准备工作
#创建工作目录
mkdir -p /data/dockerfiles/jdk1.8
#下载jdk1.8
cd /data/dockerfiles/jdk1.8
wget https://download.oracle.com/otn/java/jdk/8u401-b10/4d245f941845490c91360409ecffb3b4/jdk-8u401-linux-x64.tar.gz
#创建dockerfile文件
touch dockerfile-jdk1.8
- 编辑dockerfile
FROM centos:centos7.6.1810
LABEL version="1.0" description="基于centos7.6的jdk1.8"
WORKDIR /usr/local/
ADD ./jdk-8u171-linux-x64.tar.gz /usr/local/
ENV HISTTIMEFORMAT="%F %T "
ENV JAVA_HOME=/usr/local/jdk-8u401-linux-x64/
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=$JAVA_HOME/jre/lib/rt.jar:.
CMD ["java","-version"]
- 构建镜像
docker build -t jdk1.8:v1.0 -f ./dockerfile_jdk1.8 .
分层构建
同一个Dockerfile文件中包含多个FROM,构建出来的镜像,暂未找到合适的案例,后续补充笔记。