Docker 必知必会(1)
1.概述
Docker 把"环境"变成了代码制品,把"部署"变成了拉镜像+跑容器,把"运维操作"变成了声明式配置。

2. Docker 数据卷
数据卷是 Docker 专为容器数据持久化、共享设计的独立存储目录 / 文件,它与容器生命周期解耦,独立于容器存在,本质是宿主机上的一个真实目录 / 文件,专门用来存放容器产生 / 需要持久化的数据,避免数据随容器删除而丢失。
2.1 分类
| 挂载方式 | 核心定义 | 典型语法 | 宿主机路径管理 | 适用场景 |
|---|---|---|---|---|
|
绑定挂载 |
直接将宿主机自定义绝对路径(目录 / 文件)挂载到容器内指定路径 |
-v 宿主机绝对路径:容器内路径 --mount type=bind,src=宿主机路径,target=容器内路径 |
完全由用户自定义、管理 |
开发调试(实时同步代码)、挂载宿主机配置 / 已有数据、固定路径持久化(Nginx 静态页面) |
|
具名卷 (命名卷) |
Docker 统一管理的有自定义名称的标准数据卷,路径由 Docker 自动分配 |
-v 自定义卷名:容器内路径 --mount type=volume,src=卷名,target=容器内路径 |
Docker 统一管理 (默认路径: /var/lib/docker/volumes/卷名/_data) |
生产环境持久化、多容器数据共享(如数据库数据、多个服务共享配置) |
|
匿名卷 |
Docker 自动创建的无自定义名称(随机 ID 命名)的标准数据卷 |
-v 容器内路径 --mount type=volume,target=容器内路径 |
Docker 统一管理 (默认路径:/var/lib/docker/volumes/随机ID/_data) |
容器临时持久化、非关键数据存储(无需手动管理,用完可清理) |
2.2 绑定挂载
docker run -d -v /root/nginx/html:/usr/share/nginx/html -p 91:80 --name nginx99 f0b8a9a54136
查看挂载状态:docker inspect <容器名或ID> --format='{{json .Mounts}}' | python3 -m json.tool
2.3 具名挂载



docker volume rm 数据卷名称 # 删除指定的数据卷
docker volume prune # 清理本地没有被任何容器使用的卷
数据卷创建后,在创建容器的时候就可以通过 -v 参数(格式: -v 数据卷名称:容器目录),将创建好的数据卷挂载到容器中的某一个目录下。
2.4 匿名卷
不指定卷名,仅指定容器内路径或不指定,Docker会自动创建匿名卷



3. 制作镜像
3.1 commit 将容器提交为一个镜像





3.2 save 和 load



3.3 export 和 import
docker export 是把一个运行中(或停止)的容器的文件系统打包成 tar 包,这个 tar 包里只有容器的文件、目录等数据,不包含任何镜像元数据(比如仓库名、标签、构建历史、环境变量、启动命令等)。

4. Dockerfile
Dockerfile 是一个文本文件,使用 Docker 提供的指令来指定构建镜像的细节。
4.1 常用命令
4.1.1 Dockerfile 开头部分指令表
| 指令 | 核心含义 | 应用示例 | 使用建议 |
|---|---|---|---|
|
FROM |
指定构建镜像的基础镜像,所有 Dockerfile 必须以 FROM 开头 |
FROM ubuntu:20.04 |
尽量指定精确版本(如 ubuntu:20.04),保证镜像构建的一致性. |
|
LABEL |
为镜像添加自定义属性(如作者、联系方式、镜像说明等) |
LABEL maintainer="atguigu@qq.com" |
推荐使用 LABEL 替代 MAINTAINER,可添加多组属性,更灵活 |
|
ENV |
定义 Dockerfile 构建过程中可复用的环境变量,也可在容器运行时生效 |
ENV JAVA_HOME /usr/local/jdk8 |
适合将软件版本、路径等可变信息定义为变量,便于后续修改和维护 |
4.1.2 Dockerfile 中间处理部分指令表
| 指令 | 核心含义 | 应用示例 | 使用建议 |
|---|---|---|---|
|
RUN |
构建镜像过程中执行系统命令(如安装软件、配置环境),每一个 RUN 会生成一个镜像分层 |
RUN apt update && apt install -y nginx |
避免连续写多个 RUN,建议用 && 合并命令(如 RUN apt update && apt install -y nginx && rm -rf /var/lib/apt/lists/*),减少镜像分层;禁止执行阻塞终端的命令(如 tail -f /dev/null) |
|
ADD |
将本地文件 / 目录拷贝到容器指定路径,支持自动解压压缩包(如 .tar.gz/.zip) |
ADD restart.tar.gz /app/code/restart |
仅在需要自动解压压缩包时使用;拷贝普通文件 / 目录优先用 COPY |
|
COPY |
将本地文件 / 目录拷贝到容器指定路径,仅做文件拷贝,不支持自动解压 |
COPY nginx.conf /etc/nginx/nginx.conf |
拷贝普通文件 / 目录的首选指令,语义更清晰,兼容性更好 |
|
WORKDIR |
指定容器的默认工作目录(后续指令如 RUN/ADD/COPY 均基于此路径操作) |
WORKDIR /usr/local/nginx |
配合 ADD/COPY 使用,可简化容器内路径书写(支持相对路径) |
|
VOLUME |
定义容器的默认数据卷挂载目录(启动容器时自动创建匿名数据卷) |
VOLUME /usr/share/nginx/html |
不推荐在 Dockerfile 中固定定义,建议运行容器时通过 docker run -v 手动指定数据卷(更灵活,便于管理) |
4.1.3 Dockerfile 结尾部分指令表
| 指令 | 核心含义 | 应用示例 | 使用建议 |
|---|---|---|---|
|
EXPOSE |
声明容器运行时对外暴露的端口(仅为 “声明”,不自动映射到宿主机) |
EXPOSE 80 443 |
用于标注镜像的核心端口,运行容器时可通过 -P(大写)自动映射宿主机随机端口到声明的端口;仅为说明性指令,不影响容器实际端口监听 |
|
CMD |
指定容器启动时的默认入口命令,运行容器时可通过 docker run 后的命令覆盖 |
CMD ["nginx", "-g", "daemon off;"] |
绝大部分场景优先使用 CMD;建议用数组格式(["命令","参数"]),避免 shell 解析问题; 确保指令是 “常驻进程”,防止容器启动后立即退出 |
|
ENTRYPOINT |
指定容器的固定入口命令(无法被 docker run 覆盖,docker run 后接的参数会作为该命令的参数) |
ENTRYPOINT ["nginx", "-g"] |
使用场景较少,仅适用于 “命令固定、参数可变” 的场景(如封装工具类镜像);若需灵活替换启动命令,优先用 CMD |
4.2 CMD vs ENTRYPOINT
|
对比维度 |
CMD 指令 |
ENTRYPOINT 指令 |
|---|---|---|
|
核心作用 |
为容器设置默认的执行命令 / 参数,可被覆盖 |
为容器配置固定的入口程序,命令本身不可被覆盖(仅能追加参数) |
|
参数覆盖方式 |
docker run 时直接跟命令即可覆盖(如 docker run 镜像 ls 会替换原 CMD) |
需通过 docker run --entrypoint 显式指定才能覆盖(如 docker run --entrypoint ls 镜像) |
|
参数传递逻辑 |
若与 ENTRYPOINT 配合,CMD 内容会作为 ENTRYPOINT 的默认参数 |
若与 CMD 配合,会接收 CMD 的内容作为参数;docker run 后跟的参数会替换 CMD 作为其参数 |
|
语法形式 |
1. 可执行文件形式(推荐):CMD ["executable", "param1"] 2. shell 形式:CMD command param1 3. 参数形式:CMD ["param1", "param2"](仅配合 ENTRYPOINT 使用) |
1. 可执行文件形式(推荐):ENTRYPOINT ["executable", "param1"] 2. shell 形式:ENTRYPOINT command param1(会屏蔽 CMD 和 run 参数) |
|
是否可省略 |
可以省略,容器启动后无默认命令(可能直接退出) |
可以省略,效果等同于仅用 CMD |
|
典型使用场景 |
给容器设置 “可替换” 的默认命令 / 参数,适合启动命令需灵活调整的场景 |
定义容器的 “核心启动程序”,适合启动逻辑固定、仅参数需调整的场景 |
示例1:仅用 CMD(命令可被覆盖)
编写dockerfile



示例2:仅用 ENTRYPOINT(命令不可被覆盖,仅能追加参数)
编写dockerfile



示例3:ENTRYPOINT + CMD(最常用组合,固定程序 + 默认参数)

4.3 centos7 安装 jdk17
编写dockerfile




退出 命令行窗口,容器关闭
5. 总结
Docker 解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
- 点赞
- 收藏
- 关注作者



评论(0)