【Docker】构建镜像时使用的 Dockerfile ,以及其中的 MicroDNF

目录

[■Docker 命令使用 Dockerfile](#■Docker 命令使用 Dockerfile)

简单例子(Dockerfile中的内容)

基础指令

[1. FROM - 指定基础镜像](#1. FROM - 指定基础镜像)

[2. RUN - 执行命令](#2. RUN - 执行命令)

[3. CMD - 容器启动命令](#3. CMD - 容器启动命令)

[4. ENTRYPOINT - 入口点](#4. ENTRYPOINT - 入口点)

[5. COPY - 复制文件](#5. COPY - 复制文件)

[6. ADD - 添加文件(功能更强)](#6. ADD - 添加文件(功能更强))

[7. ENV - 设置环境变量](#7. ENV - 设置环境变量)

配置指令

[8. WORKDIR - 设置工作目录](#8. WORKDIR - 设置工作目录)

[9. EXPOSE - 声明端口](#9. EXPOSE - 声明端口)

[10. USER - 指定用户](#10. USER - 指定用户)

[11. ARG - 构建参数](#11. ARG - 构建参数)

[12. VOLUME - 挂载点](#12. VOLUME - 挂载点)

优化与元数据指令

[13. LABEL - 添加元数据](#13. LABEL - 添加元数据)

[14. HEALTHCHECK - 健康检查](#14. HEALTHCHECK - 健康检查)

[15. SHELL - 指定shell](#15. SHELL - 指定shell)

[16. ONBUILD - 触发器指令](#16. ONBUILD - 触发器指令)

[17. STOPSIGNAL - 停止信号](#17. STOPSIGNAL - 停止信号)

多阶段构建指令

[18. AS - 别名](#18. AS - 别名)

[■Dockerfile 中的 MicroDNF](#■Dockerfile 中的 MicroDNF)

[MicroDNF 在镜像制作中](#MicroDNF 在镜像制作中)

[MicroDNF 本身就是镜像的一部分](#MicroDNF 本身就是镜像的一部分)

层次结构对比

更形象的比喻

场景1:构建新镜像

场景2:在运行的容器中调试


==================

■Docker 命令使用 Dockerfile

复制代码
# 1. 默认使用 Dockerfile
docker build .                      # 使用 Dockerfile

# 2. 显式指定不同文件
docker build -f Dockerfile.dev .    # 使用 Dockerfile.dev
docker build -f Dockerfile.prod .   # 使用 Dockerfile.prod

简单例子(Dockerfile中的内容)

====

bash 复制代码
# 第一阶段:构建阶段
FROM node:18-alpine AS builder

ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}

WORKDIR /app

# 复制依赖文件
COPY package*.json ./

# 安装依赖
RUN npm ci --only=production

# 复制源代码
COPY src/ src/

# 第二阶段:运行阶段
FROM node:18-alpine AS runner

LABEL maintainer="team@example.com"
LABEL version="1.2.0"

WORKDIR /app

# 创建非root用户
RUN addgroup --system --gid 1001 nodejs && \
    adduser --system --uid 1001 nodejs

# 从builder阶段复制文件
COPY --from=builder --chown=nodejs:nodejs /app /app

USER nodejs

EXPOSE 3000

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD node healthcheck.js || exit 1

CMD ["node", "src/server.js"]

====

基础指令

1. FROM - 指定基础镜像

复制代码
# 必须放在第一行(除了注释和ARG)
FROM ubuntu:22.04
FROM python:3.9-slim
FROM node:18-alpine

2. RUN - 执行命令

复制代码
# 在镜像构建时执行的命令
RUN apt-get update && apt-get install -y nginx
RUN pip install -r requirements.txt
RUN npm install

3. CMD - 容器启动命令

复制代码
# 指定容器启动时的默认命令
CMD ["nginx", "-g", "daemon off;"]
CMD ["python", "app.py"]
CMD echo "Hello World"

4. ENTRYPOINT - 入口点

复制代码
# 类似CMD,但不会被docker run后的命令覆盖
ENTRYPOINT ["docker-entrypoint.sh"]
ENTRYPOINT ["nginx", "-g", "daemon off;"]

5. COPY - 复制文件

复制代码
# 从宿主机复制文件到镜像
COPY app.py /app/
COPY requirements.txt /tmp/
COPY --chown=user:group src/ dest/

6. ADD - 添加文件(功能更强)

复制代码
# 类似COPY,但可以解压压缩文件或从URL下载
ADD app.tar.gz /app/     # 自动解压
ADD https://example.com/file.tar.gz /tmp/
ADD . /app

7. ENV - 设置环境变量

复制代码
# 设置环境变量,在容器运行时可用
ENV NODE_ENV=production
ENV APP_VERSION=1.0.0
ENV PATH="/app/bin:$PATH"

配置指令

8. WORKDIR - 设置工作目录

复制代码
# 设置后续命令的工作目录(会自动创建)
WORKDIR /app
WORKDIR /usr/src/app

9. EXPOSE - 声明端口

复制代码
# 声明容器监听的端口(仅文档作用)
EXPOSE 80
EXPOSE 443
EXPOSE 3000/tcp

10. USER - 指定用户

复制代码
# 切换执行命令的用户
USER nginx
USER 1000:1000  # UID:GID
USER nobody

11. ARG - 构建参数

复制代码
# 定义构建时的变量,只在构建时有效
ARG VERSION=latest
ARG USERNAME=admin

12. VOLUME - 挂载点

复制代码
# 创建挂载点(匿名卷)
VOLUME /data
VOLUME ["/var/log", "/var/db"]

优化与元数据指令

13. LABEL - 添加元数据

复制代码
# 添加镜像的元数据标签
LABEL version="1.0"
LABEL maintainer="dev@example.com"
LABEL description="Web application"

14. HEALTHCHECK - 健康检查

复制代码
# 定义容器健康检查
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
  CMD curl -f http://localhost/ || exit 1

15. SHELL - 指定shell

复制代码
# 更改默认的shell
SHELL ["/bin/bash", "-c"]
SHELL ["powershell", "-Command"]

16. ONBUILD - 触发器指令

复制代码
# 当本镜像被其他镜像作为基础时触发
ONBUILD COPY . /app
ONBUILD RUN pip install -r requirements.txt

17. STOPSIGNAL - 停止信号

复制代码
# 指定容器停止时发送的信号
STOPSIGNAL SIGTERM
STOPSIGNAL SIGINT

多阶段构建指令

18. AS - 别名

复制代码
# 多阶段构建中给阶段命名
FROM node:18 AS builder
FROM nginx:alpine AS production

======

■Dockerfile 中的 MicroDNF

MicroDNF 在镜像制作中

==

复制代码
# microdnf 是制作镜像的工具之一
FROM ubi8/ubi-minimal  # ← 这个基础镜像已经包含了 microdnf

# 使用 microdnf 安装软件包来构建镜像
RUN microdnf install -y nginx \
    && microdnf clean all  # ← 这是构建过程的一部分

=

MicroDNF 本身就是镜像的一部分

复制代码
# 查看镜像中的 microdnf
docker run --rm ubi8/ubi-minimal which microdnf
# 输出:/usr/bin/microdnf

docker run --rm ubi8/ubi-minimal ls -lh /usr/bin/microdnf
# 输出:显示 microdnf 文件大小(约1-2MB)
  • microdnf 是 被包含在镜像中的工具

  • 就像蓝图里包含"去哪个家具店购物"的说明

层次结构对比

层级 内容 microdnf 的作用
镜像 静态文件层 1. microdnf 是镜像中的一个文件 2. microdnf 用于在构建时安装其他软件
容器 运行实例 1. microdnf 是可执行命令 2. 可以临时安装软件(不推荐)
Dockerfile 构建指令 1. 使用 RUN microdnf install 指令 2. 定义镜像构建过程

更形象的比喻

复制代码
一家汽车工厂(Docker):

1. 设计图纸(镜像)上写着:
   - "从工具库(microdnf)取螺丝刀、扳手"
   - "安装发动机、轮胎"

2. 生产车间(构建过程):
   - 工人按照图纸,从工具库拿工具
   - 用工具安装零件,生产出汽车

3. 成品汽车(容器):
   - 可以在使用时临时放东西(microdnf安装)
   - 但不改变设计图纸

===

  1. microdnf 是工具:像螺丝刀、扳手

  2. 镜像是设计蓝图:包含"使用什么工具"的说明

  3. 容器是成品:运行时可以临时使用工具

===

复制代码
镜像 = 基础系统 + microdnf工具
容器 = 镜像的实例化运行
microdnf的作用 = ①构建镜像时安装软件 ②容器内临时管理软件

====

场景1:构建新镜像

bash 复制代码
# 创建 Dockerfile
cat > Dockerfile << 'EOF'
FROM ubi8/ubi-minimal

# 1. 使用镜像中的 microdnf
RUN microdnf install -y httpd

# 2. 生成包含 httpd 的新镜像
CMD ["httpd", "-DFOREGROUND"]
EOF

# 构建镜像(microdnf 在构建过程中起作用)
docker build -t my-webapp .

场景2:在运行的容器中调试

bash 复制代码
# 1. 从镜像运行容器
docker run -d --name web my-webapp

# 2. 进入运行的容器
docker exec -it web /bin/bash

# 3. 在容器内使用 microdnf 安装调试工具
[root@web]# microdnf install -y curl wget

# 4. 容器被修改了,但镜像没变

===

相关推荐
2601_949146536 小时前
Shell语音通知接口使用指南:运维自动化中的语音告警集成方案
运维·自动化
儒雅的晴天6 小时前
大模型幻觉问题
运维·服务器
Gofarlic_OMS7 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
通信大师7 小时前
深度解析PCC策略计费控制:核心网产品与应用价值
运维·服务器·网络·5g
dixiuapp7 小时前
智能工单系统如何选,实现自动化与预测性维护
运维·自动化
Elastic 中国社区官方博客7 小时前
如何防御你的 RAG 系统免受上下文投毒攻击
大数据·运维·人工智能·elasticsearch·搜索引擎·ai·全文检索
小锋学长生活大爆炸7 小时前
【教程】免Root在Termux上安装Docker
运维·docker·容器
进击切图仔7 小时前
常用 Docker 命令备份
运维·docker·容器
NotStrandedYet8 小时前
《国产系统运维笔记》第8期:挑战国产化流媒体部署——银河麒麟+龙芯架构编译SRS实战全记录
运维·kylin·国产化·银河麒麟·龙芯·信创运维·srs编译安装
默|笙9 小时前
【Linux】fd_重定向本质
linux·运维·服务器