Docker高级管理--Dockerfile 镜像制作
目录
一:Docker 镜像管理
1:Docker 镜像结构
(1) 镜像分层核心概念
(2)镜像层特性
(3)关键操作命令
(4)优化建议
2:Dockerfile介绍
(1)Dockerfile 基础特性
(2)Dockerfile 核心指令
(3)Dockerfile 构建与优化
(4)Dockerfile 最佳实践
二:Dockerfile语法基础
(1)基础指令
(2)环境设置指令
(3)文件操作指令
(4)执行命令指令
(5)网络与存储指令
三:Dockerfile 系例实施
1:案例 1--构建 nginx 容器
(1)创建dockerfile 工作目录
(2)创建dockerfile
(3)编写Nginx启动脚本
(4)用Dockerfile创建镜像
(5)启动容器
(6)访问nginx网站
2:案例 2--构建 Tomcat 容器
(1)创建工作目录
3:案例 3--构建 mysq1 容器
(1)创建工作目录
(2)创建dockerfile 文件
编辑
编辑
(3)编写mysql初始化脚本
编辑
(4)生成镜像
编辑
(5)创建容器
4:案例 4--构建 php
(1)创建工作目录
(2)创建dockerfile(yum 安装安装)
编辑
(3)生成镜像
编辑
(4)启动容器
四:Dockerfile 语法注意事项
一:Docker 镜像管理
Docker 镜像除了是 Docker 的核心技术之外,也是应用发布的标准格式。一个完整的 Docker 镜像可以支撑一个 Docker 容器的运行,在 Docker 的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用服务。 如果要把已经安装的服务进行迁移,就需要把环境以及搭建的服务生成新的镜像。本案例将介绍如何创建 Docker 镜像。
1:Docker 镜像结构
(1) 镜像分层核心概念
| 特性 | 说明 | 
|---|---|
| 分层结构 | 镜像由多个只读层(Layer)叠加组成,每层对应 Dockerfile 中的一条指令 | 
| 容器读写层 | 容器运行时在镜像顶部添加一个可读写层(容器层),所有修改均写入此层 | 
| 存储位置 | 默认存储在 /var/lib/docker/<storage-driver>(如overlay2) | 
| 存储驱动 | 管理镜像层和容器层的读写机制(如 overlay2、aufs、devicemapper) | 
(2)镜像层特性
| 特性 | 说明 | 示例/影响 | 
|---|---|---|
| 指令对应分层 | Dockerfile 中每条指令(如 RUN、COPY)生成一个独立镜像层 | RUN apt-get update会生成一个包含更新后文件系统的层 | 
| 缓存复用 | 未更改的指令层可直接复用缓存,加速构建 | 修改 COPY的文件后,后续所有层缓存失效 | 
| 不可变性 | 已构建的镜像层不可修改,删除文件仅在新层标记删除,原层仍保留文件数据 | 即使后续层删除文件,镜像体积不会减小(需合并层优化) | 
| 依赖链失效 | 某一层缓存失效后,其后续所有层缓存均需重新构建 | 调整 Dockerfile 指令顺序可优化缓存利用率(如先复制静态文件) | 
(3)关键操作命令
| 命令 | 作用 | 示例 | 
|---|---|---|
| docker history | 查看镜像各层构成及大小 | docker history nginx:latest | 
| docker inspect | 查看镜像详细信息(包括分层哈希) | docker inspect nginx:latest | 
| docker diff | 查看容器层文件改动(对比镜像层) | docker diff <容器ID> | 
| docker system df | 查看 Docker 磁盘使用情况(含镜像、容器层体积) | docker system df -v | 
(4)优化建议
| 策略 | 说明 | 示例 | 
|---|---|---|
| 合并指令 | 使用 &&合并多个RUN指令减少层数 | RUN apt-get update && apt-get install -y curl | 
| 合理排序指令 | 将高频变动的指令(如 COPY)放在 Dockerfile 尾部 | 先安装依赖,最后复制代码 | 
| 使用多阶段构建 | 通过多阶段构建( FROM ... AS builder)剔除中间层,减小最终镜像体积 | 编译阶段与运行阶段分离 | 
| 清理无用文件 | 在同一层中删除临时文件避免残留 | RUN apt-get install -y curl && rm -rf /var/lib/apt/lists/* | 
2:Dockerfile介绍
(1)Dockerfile 基础特性
| 特性 | 说明 | 
|---|---|
| 本质 | 由多条指令组成的脚本文件,用于自动化构建 Docker 镜像 | 
| 文件命名 | 默认文件名 Dockerfile(首字母大写),或通过-f指定自定义文件名 | 
| 指令与命令 | 每条指令对应一个 Linux 命令(如 RUN、COPY) | 
| 构建过程 | Docker 按顺序解析指令并生成镜像层,解决依赖关系 | 
| 透明性 | 相比直接使用镜像,Dockerfile 明确展示镜像构建逻辑 | 
(2)Dockerfile 核心指令
| 指令 | 作用 | 示例 | 
|---|---|---|
| FROM | 指定基础镜像(必须为第一条指令) | FROM ubuntu:20.04 | 
| RUN | 执行命令并创建新镜像层(常用于安装软件) | RUN apt-get update && apt-get install -y curl | 
| COPY | 复制宿主机文件到镜像(需使用绝对路径) | COPY ./app /usr/src/app | 
| ADD | 类似 COPY,但支持自动解压压缩包和远程 URL | ADD https://example.com/file.tar.gz /data | 
| WORKDIR | 设置工作目录(后续指令的相对路径基于此目录) | WORKDIR /app | 
| EXPOSE | 声明容器运行时监听的端口(实际映射需通过 -p参数) | EXPOSE 8080 | 
| ENV | 设置环境变量(可被后续指令和容器进程使用) | ENV NODE_ENV=production | 
| CMD | 指定容器启动时的默认命令(可被 docker run覆盖) | CMD ["python", "app.py"] | 
| ENTRYPOINT | 类似 CMD,但命令不可被docker run覆盖(通常与CMD搭配使用) | ENTRYPOINT ["nginx"]+CMD ["-g", "daemon off;"] | 
| VOLUME | 创建匿名数据卷挂载点(实际挂载需通过 -v参数) | VOLUME /data | 
(3)Dockerfile 构建与优化
| 操作 | 命令 | 说明 | 
|---|---|---|
| 构建镜像 | docker build -t myimage:tag . | 使用当前目录下的 Dockerfile构建镜像 | 
| 指定构建文件 | docker build -f Dockerfile.dev -t myimage:dev . | 使用自定义文件名构建 | 
| 多阶段构建 | Dockerfile FROM builder AS build ... FROM alpine COPY --from=build ... | 减少最终镜像体积(丢弃中间层) | 
| 忽略文件 | 创建 .dockerignore文件排除无关文件 | 避免 COPY时复制node_modules等大目录 | 
(4)Dockerfile 最佳实践
| 实践建议 | 说明 | 示例 | 
|---|---|---|
| 指令合并 | 合并多个 RUN指令减少镜像层数 | RUN apt-get update && apt-get install -y curl | 
| 最小化基础镜像 | 使用 alpine等轻量镜像作为基础 | FROM python:3.9-alpine | 
| 清理缓存文件 | 同一层中删除临时文件以减小体积 | RUN apt-get install -y curl && rm -rf /var/lib/apt/lists/* | 
| 明确版本标签 | 避免使用 latest标签,确保构建可复现 | FROM nginx:1.21.6 | 
| 非 root 用户运行 | 使用 USER指令降低权限 | USER 1000 | 
总结:
-  Dockerfile 是声明式的镜像构建蓝图,通过指令逐层生成镜像。 
-  合理设计指令顺序和内容可优化构建速度、镜像安全性和可维护性。 
-  结合多阶段构建和 .dockerignore可显著减小镜像体积。
二:Dockerfile语法基础
        Dockerfile 是一个文本文件,其中包含了一系列用于构建 Docker 镜像的指令。通过编写
 Dockerfile,可以自动化地创建自定义的 Docker 镜像。以下为你详细介绍 Dockerfile 的常用语法:
(1)基础指令
| 指令 | 作用 | 语法示例 | 说明 | 
|---|---|---|---|
| FROM | 指定基础镜像 | FROM ubuntu:20.04 | 必须为第一条指令,支持多阶段构建(如 FROM ... AS builder) | 
| LABEL | 添加元数据(替代已弃用的 MAINTAINER) | LABEL maintainer="John" version="1.0" | 可定义多个键值对,用于镜像分类和管理 | 
(2)环境设置指令
| 指令 | 作用 | 语法示例 | 说明 | 
|---|---|---|---|
| ENV | 设置持久化环境变量 | ENV MYSQL_ROOT_PASSWORD=123456 | 容器运行时仍有效,可被应用程序读取 | 
| ARG | 定义构建时参数(仅在构建阶段有效) | ARG VERSION=1.0 | 可通过 --build-arg覆盖:docker build --build-arg VERSION=2.0 . | 
(3)文件操作指令
| 指令 | 作用 | 语法示例 | 说明 | 
|---|---|---|---|
| COPY | 复制本地文件到镜像 | COPY ./src /app/src | 需使用绝对路径,不支持自动解压或远程 URL | 
| ADD | 增强版 COPY,支持远程 URL 和自动解压 | ADD http://example.com/file.tar.gz /data | 远程文件需显式指定权限(如 RUN chmod) | 
| WORKDIR | 设置工作目录 | WORKDIR /app | 后续指令(如 RUN、COPY)均基于此目录执行 | 
(4)执行命令指令
| 指令 | 作用 | 语法示例 | 说明 | 
|---|---|---|---|
| RUN | 在构建时执行命令 | RUN apt-get update && apt-get install -y curl | 推荐合并多条命令减少层数 | 
| CMD | 指定容器启动时的默认命令 | CMD ["python", "app.py"] | 可被 docker run覆盖,一个 Dockerfile 仅最后一个CMD生效 | 
| ENTRYPOINT | 定义容器启动时的主命令(不可被覆盖) | ENTRYPOINT ["nginx"] | 常与 CMD搭配使用:ENTRYPOINT ["python"]+CMD ["app.py"] | 
(5)网络与存储指令
| 指令 | 作用 | 语法示例 | 说明 | 
|---|---|---|---|
| EXPOSE | 声明容器运行时监听的端口 | EXPOSE 8080 | 实际映射需通过 docker run -p 8080:8080实现 | 
| VOLUME | 创建匿名数据卷挂载点 | VOLUME ["/data"] | 实际挂载需通过 docker run -v /host/path:/data指定 | 
关键对比
| 对比项 | COPYvsADD | CMDvsENTRYPOINT | 
|---|---|---|
| 核心差异 | ADD支持远程 URL 和解压,COPY更透明 | ENTRYPOINT不可覆盖,CMD可覆盖 | 
| 使用建议 | 优先使用 COPY,除非需要ADD的特性 | 固定命令用 ENTRYPOINT,参数用CMD | 
三:Dockerfile 系例实施
1:案例 1--构建 nginx 容器
(1)创建dockerfile 工作目录

(2)创建dockerfile

(3)编写Nginx启动脚本

(4)用Dockerfile创建镜像

(5)启动容器

或者:


(6)访问nginx网站

2:案例 2--构建 Tomcat 容器
(1)创建工作目录

(2)创建dockerfile

(3)创建启动脚本

(4)用Dockerfile创建镜像

(5)启动容器

(6)访问tomcat网站
http://192.168.10.101:8081
3:案例 3--构建 mysq1 容器
(1)创建工作目录

(2)创建dockerfile 文件
(3)编写mysql初始化脚本
(4)生成镜像
(5)创建容器


4:案例 4--构建 php
(1)创建工作目录

(2)创建dockerfile(yum 安装安装)
(3)生成镜像
(4)启动容器

四:Dockerfile 语法注意事项
在编写 Dockerfile 时,掌握基础语法的注意事项能够帮助你构建出高效、可靠且易于维护的Docker 镜像。以下是一些关键的注意事项:
| 类别 | 要点 | 详细说明/示例 | 
|---|---|---|
| 指令规范 | 大小写 | 建议使用大写(如 FROM,RUN)增强可读性 | 
| 顺序 | 将不常变动的指令(如基础包安装)放在前面,利用缓存;频繁变动的指令(如源码复制)放在后面 | |
| 注释 | 使用 #解释复杂步骤,如# Install core dependencies | |
| 基础镜像 | 稳定性与安全性 | 优先选择官方镜像(如 ubuntu:22.04,alpine:3.18) | 
| 镜像大小 | 轻量级场景用 Alpine(体积小),完整功能用 Debian/Ubuntu | |
| 文件操作 | COPYvsADD | 优先用 COPY(如COPY app.py /app/);仅需解压或远程下载时用ADD(如ADD https://example.com/file.tar.gz /tmp/) | 
| 文件路径 | 确保路径在构建上下文中,如 docker build -t myapp .中的.是上下文根目录 | |
| 命令执行 | RUN优化 | 合并命令减少层数: RUN apt-get update && apt-get install -y python3 && rm -rf /var/lib/apt/lists/* | 
| 清理缓存 | 删除临时文件: RUN yum clean all && rm -rf /tmp/* | |
| CMD&ENTRYPOINT | ENTRYPOINT ["python3"]+CMD ["app.py"]:运行时可通过docker run myapp --debug覆盖CMD | |
| 环境变量 | ENVvsARG | ENV持久化(如ENV APP_PORT=8080);ARG仅构建时有效(如ARG VERSION=1.0,需--build-arg传递) | 
| 安全性 | 敏感信息通过运行时传入: docker run -e DB_PASSWORD=123 myapp | |
| 网络与端口 | EXPOSE | 声明容器端口(如 EXPOSE 80),实际映射需docker run -p 8080:80 | 
| 缓存管理 | 利用缓存 | 不变的内容(如 WORKDIR /app)放前面,变动的(如COPY . /app)放后面 | 
| 清理缓存 | 强制重新构建: docker build --no-cache -t myapp . | 






