Docker 必知必会(1)

举报
剑指南天 发表于 2026/09/16 13:19:27 2026/09/16
【摘要】 Docker 把"环境"变成了代码制品,把"部署"变成了拉镜像+跑容器,把"运维操作"变成了声明式配置。

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 解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。