05. Docker基础-Dockerfile

概念

Dockerfile是什么

Docker提供的一个用于自定义构建镜像的配置文件。
Dockerfile的作用就是描述如何构建一个镜像。

为什么要使用Dockerfile

  1. 项目打包成Docker镜像,后续部署更方便。
  2. 构建镜像的基础服务镜像,更容易精简镜像大小。

Dockerfile的作用

  1. 可以自定义镜像内容;
  2. 构建公共基础镜像,减少其他镜像配置;
  3. 更灵活的组合自定义镜像;
  4. 可以实现服务的快速部署;

命令

指令列表

  1. FROM:
  • 格式:FROM
  • 解释:指定基础镜像。每个 Dockerfile 必须以 FROM 指令开始。
  • 举例:
FROM ubuntu:18.04
  1. LABEL:
  • 格式:LABEL = = …
  • 解释:为镜像添加元数据标签,这些标签可以包含在 docker push 命令中。
  • 举例:
LABEL maintainer="WangMingWu <wangmingqu@example.com>"
  1. RUN
  • 格式:RUN 或 RUN [“executable”, “param1”, “param2”]
  • 解释:执行指定的命令并将其结果添加到镜像中。可以是 Shell 命令或执行文件。
  • 举例:
RUN apt-get update && apt-get install -y wget
  1. CMD
  • 格式:CMD [“executable”, “param1”, “param2”] 或 CMD [“param1”, “param2”] 或 CMD command param1 param2
  • 解释:指定容器启动时要执行的命令。如果指定了多个命令,只有最后一个命令会被执行。
  • 举例:
CMD ["npm", "start"]
  1. ENTRYPOINT
  • 格式:ENTRYPOINT [“executable”, “param1”, “param2”] 或 ENTRYPOINT [“param1”, “param2”] 或 ENTRYPOINT command param1 param2
  • 解释:指定容器启动时要执行的命令。与 CMD 指令不同,ENTRYPOINT 指令不会被覆盖,因此它是启动容器时的主要命令。
  • 举例:
ENTRYPOINT ["npm", "start"]
  1. COPY
  • 格式:COPY … 或 COPY [“”,… “”]
  • 解释:将文件或目录从宿主机的文件系统复制到镜像中。如果源路径是相对路径,它将被解释为相对于 Dockerfile 文件的位置。
  • 举例:
COPY . /app
  1. ADD
  • 格式:ADD … 或 ADD [“”,… “”]
  • 解释:类似于 COPY,但它会自动处理 URL 和 tar 文件。如果源路径是 URL,它会下载文件并添加到镜像中。
  • 举例:
ADD . /app
  1. ENV
  • 格式:ENV
  • 解释:设置环境变量。可以在 RUN 指令中使用这些环境变量。
  • 举例:
ENV DEBIAN_FRONTEND noninteractive
  1. VOLUME
  • 格式:VOLUME [“”] 或 VOLUME
  • 解释:创建一个可以从宿主机挂载的卷。可以在容器运行时挂载卷。
  • 举例:
VOLUME ["/data"]
  1. EXPOSE
  • 格式:EXPOSE [/…]
  • 解释:声明容器监听的端口。这不会自动将端口暴露给宿主机。
  • 举例:
EXPOSE 8080
  1. WORKDIR
  • 格式:WORKDIR
  • 解释:指定工作目录,即容器中的工作目录。
  • 举例:
WORKDIR /app
  1. USER
  • 格式:USER [:]
  • 解释:指定运行后续 RUN, CMD, ENTRYPOINT 和 VOLUME 指令的用户。
  • 举例
WORKDIR /app
  1. ONBUILD
  • 格式:ONBUILD
  • 解释:用于构建触发器,当父镜像被用于构建新镜像时执行。
  • 举例:
ONBUILD ADD . /app
  1. ARG
  • 格式:ARG [=]
  • 解释:定义构建时使用的变量。可以在 RUN 指令中使用这些变量。
  • 举例:
ARG BUILD_DATE
  1. MAINTAINER
  • 格式:MAINTAINER
  • 解释:指定镜像的维护者信息。这个指令已经被 LABEL 指令取代,并且在新版本的 Dockerfile 中不推荐使用。
  • 举例:
MAINTAINER John Doe <johndoe@example.com>
  1. STOPSIGNAL
  • 格式:STOPSIGNAL signal
  • 解释:指定容器停止时使用的信号。例如,STOPSIGNAL SIGINT。
  • 举例:
STOPSIGNAL SIGTERM
  1. 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'
  1. 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

应用

应用举例

  1. 准备工作
#创建工作目录
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
  1. 编辑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"]
  1. 构建镜像
docker build -t jdk1.8:v1.0 -f ./dockerfile_jdk1.8 .

分层构建

同一个Dockerfile文件中包含多个FROM,构建出来的镜像,暂未找到合适的案例,后续补充笔记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值