Dockerfile编写

1. Dockerfile 编写

Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令。

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

通过定义一系列命令和参数,Dockerfile 指导 Docker 构建一个自定义的镜像。

Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。

2. 编写 Dockerfile 前的准备

在编写Dockerfile前要做到以下这些准备:

  1. 安装并配置 Docker(如何已经配置则跳过)

    可以通过以下命令去检查

    docker version
    docker info
    
  2. 明确构建目标

    • 选择基础镜像:决定是使用官方镜像(如 ubuntu:latestalpine:latest)还是自定义基础镜像。
    • 确定应用环境:是否需要安装特定软件,运行特定任务,如Python,Java,Nginx等。
    • 定义运行方式:容器是长期运行的(如Web服务)还是一次性执行的(如编译任务)。
  3. 创建工作目录

    建议在一个独立的目录中编写 Dockerfile,并将相关依赖文件(如源码、配置文件等)放入该目录。

    mkdir mydocker
    cd mydocker
    

3. Dockerfile 指令详解

Dockerfile 是由一系列指令组成的,每条指令用于构建镜像的一部分。以下是所有重要指令的详细介绍:

3.1 FROM:指定基础镜像⭐

FROM ubuntu:22.04
  • 每个Dcokerfile必须有 FROM 指令,它定义了镜像的基础层。
  • 可以是官方镜像、私有镜像或自定义镜像

3.2 LABEL:添加元数据

LABEL maintainer="你的名字 <你的邮箱>"
  • 添加一些描述信息,如作者、版本等。

3.3 WORKDIR:设置工作目录 ⭐

WORKDIR /usr/src/app
  • 之后的 RUNCOPYCMD 等指令都会在此目录下执行。

3.4 RUN:执行命令

RUN apt-get update && apt-get install -y nginx
  • RUN 用于执行 shell 命令,如安装软件、修改文件等。
  • 每条 RUN 指令都会创建一个新的镜像层。
  • && 用于连接多条命令,减少镜像层数,提高构建效率。

3.5 COPYADD:复制文件

COPY myapp /usr/src/app
  • COPY 用于从宿主机复制文件到容器中。
  • ADDCOPY 类似,但支持解压 .tar.gz 文件,并可使用 URL 远程下载文件(不推荐)。
ADD myapp.tar.gz /usr/src/app/

3.6 ENV:设置环境变量

ENV NODE_ENV=production
  • 定义环境变量,容器运行时可以使用 echo $NODE_ENV 访问

3.7 EXPOSE:声明端口

EXPOSE 80
  • 声明容器对外开放的端口(但不会自动映射)
  • 需要在 docker run 时使用 -p 选项映射端口,如 -p 8080:80

3.8 CMDENTRYPOINT:指定容器启动命令

  • cmd:指定默认运行的命令,可以被 docker run 参数覆盖
  • ENTRYPOINT:始终执行的命令,不能被 docker run 轻易覆盖
CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT ["nginx", "-g", "daemon off;"]

区别:

  • cmd 可被 docker run 覆盖,如 docker run myimage bash 会忽略 CMD
  • ENTRYPOINT 通常用于确保某个命令始终执行,如 ENTRYPOINT ["python"] 可让 docker run myimage app.py 直接运行 python app.py

3.9 VOLUME:定义数据卷

VOLUME /var/lib/mysql
  • 声明挂载的目录,可用于数据持久化
  • 容器内部修改的 VOLUME 目录不会随容器删除而丢失数据

3.10 ARG:定义构建时变量

ARG VERSION=latest
RUN echo "Building version: $VERSION"
  • ARG 只在 构建阶段 使用,与 docker built --built-arg 结合使用
  • 不会保留在最终镜像中,适用于编译参数、临时变量等

3.11 USER:切换用户

USER nonroot
  • 以指定用户运行容器,默认是 root ,可以提高安全性

3.12 SHELL:修改默认 shell

SHELL ["/bin/bash", "-c"]
  • 默认情况下,Linux使用 sh ,可以修改为 bash

3.13 HEALTHCHECK:健康检查

HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
  CMD curl -f http://localhost || exit 1
  • 定期检查容器是否正常运行,如30秒检查一次
  • 如果 CMD 返回非0,Docker 会标记容器为 unhealthy

3.14 ONBUILD:用于继承镜像

ONBUILD COPY . /app
  • 只有当该镜像被 作为基础镜像 使用时,ONBUILD 指令才会生效。

3.15 示例 ---> tomcat_zrlog

  • 创建相关文件的文件夹

    mkdir -p /app/code/tomcat && touch Dockerfile
    mv zrlog.war /app/code/tomcat
    
  • 编写Dockerfile

    FROM tomcat:9.0-jdk8
    
    LABEL maintainer="soft water"
    
    RUN rm -rf /usr/local/tomcat/webapps/*
    
    COPY zrlog.war /usr/local/tomcat/webapps/
    
    EXPOSE 8080
    
    CMD ["catalina.sh", "run"]
    
  • 构建镜像

    docker build -t zrlog .
    
  • 查看构建的镜像

    docker images
    
    REPOSITORY   TAG           IMAGE ID       CREATED          SIZE
    zrlog        latest        f01409634d49   20 seconds ago   296MB
    
  • 查看是否有与想要映射的服务端口冲突的服务

    ss -lntup | grep 80
    
  • 启动服务

    docker run -d --name zrlog -p 80:8080 zrlog:latest
    
  • 浏览器访问

    10.0.0.81:80/zrlog
    
posted @ 2025-03-20 21:55  小时候老白啦  阅读(72)  评论(0)    收藏  举报