【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. 容器被修改了,但镜像没变

===

相关推荐
用户0328472220701 小时前
如何搭建本地yum源(上)
运维
武子康2 小时前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn863 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉3 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造