一、Docker 核心专有名词解释
| 专有名词 | 详细解释 | 补充说明 | ||
|---|---|---|---|---|
| 镜像(Image) | 只读的模板,包含运行应用所需的文件、代码、运行时、依赖、环境变量和配置,是创建容器的基础,采用分层存储(UnionFS),层可复用。 | 镜像无状态,不能修改,只能通过构建新层生成新镜像;latest 标签不代表最新版本,仅为默认标签。 |
||
| 容器(Container) | 镜像的运行实例,在镜像只读层之上添加可写层,拥有独立的文件系统、网络栈和进程空间,可启停、读写、删除。 | 容器生命周期结束后(如停止),可写层数据默认保留,除非指定 --rm。 |
||
| TAG | 镜像的版本标签(如 nginx:1.28.1 中的 1.28.1),用于区分同一仓库下的不同版本,未指定时默认 latest。 |
同一镜像可打多个 TAG;TAG 可被覆盖,如需精准拉取可使用镜像摘要(DIGEST)。 | ||
| 悬空镜像(Dangling Image) | 名称和 TAG 均为 <none> 的镜像,因构建新镜像覆盖原有标签、或删除镜像引用后产生,无实际引用价值。 |
悬空镜像占用磁盘空间,需定期清理(docker image prune)。 |
||
| 容器 ID | 容器的唯一标识(如 6242066cddca),由 64 位十六进制字符组成,可简写前几位(如 6242066)用于命令操作。 |
容器名称(如 strange_wescoff)是 ID 的别名,可自定义(--name),更易记忆。 |
||
| 宿主机(Host) | 运行 Docker 引擎的物理机 / 虚拟机,容器运行于宿主机之上,通过 Docker 引擎实现资源隔离与调度。 | 容器的资源(CPU / 内存)受宿主机限制,端口映射需占用宿主机端口。 | ||
| 端口映射(Port Mapping) | 将宿主机端口映射到容器端口(如 -p 3306:3306),使外部网络能访问容器内的服务。 |
原理:Docker 基于 iptables 实现端口转发,-P 会随机映射所有暴露的端口。 |
||
| 环境变量(ENV) | 容器内的键值对配置(如 -e MYSQL_ROOT_PASSWORD=123456),用于动态配置容器应用。 |
镜像可预设环境变量,运行容器时可覆盖;可通过 --env-file 批量导入。 |
||
| Cgroup(Control Group) | Linux 内核特性,Docker 利用其限制、记录、隔离容器的资源使用(CPU、内存、IO 等)。 | 如 --cpus 2 限制容器使用 2 核 CPU,-m 1G 限制内存为 1GB。 |
||
| Namespace | Linux 内核特性,Docker 利用其隔离容器的系统资源(PID、NET、UTS、IPC、USER、Mount),使容器拥有独立运行环境。 | 例如 PID Namespace 让容器内的进程 PID 从 1 开始,NET Namespace 让容器有独立网卡。 | ||
| 退出码(Exit Code) | 容器停止后的状态码:0 表示正常退出,非 0 表示异常(如 137 表示被 SIGKILL 强制终止,1 表示应用错误)。 | docker ps -a 可查看容器退出码,结合 docker logs 可排查异常原因。 |
||
| 健康检查(HEALTHCHECK) | 检测容器内应用是否正常运行的机制,Docker 根据检查结果更新容器状态(healthy/unhealthy)。 | 可通过 --health-cmd 自定义检查命令(如 `curl -f localhost:80 |
exit 1`)。 | |
| 卷(Volume) | Docker 提供的持久化存储机制,独立于容器生命周期,可在容器间共享,分为命名卷、匿名卷。 | -v 宿主机路径:容器路径 为绑定挂载,-v 卷名:容器路径 为命名卷。 |
||
| SIGTERM/SIGKILL | Linux 信号:SIGTERM(15)是 docker stop 默认发送的优雅终止信号(应用可收尾);SIGKILL(9)是 docker kill 发送的强制终止信号。 |
docker stop -t 10 可指定等待时间,超时后自动发送 SIGKILL。 |
||
| 镜像摘要(DIGEST) | 镜像的 SHA256 哈希值,唯一标识镜像版本,避免 TAG 覆盖导致的版本混乱。 | 可通过 docker pull 镜像名@摘要 拉取精准版本,如 docker pull nginx@sha256:0a1f2fb3231e。 |
二、镜像管理(Image Management)
2.1 搜索镜像(docker search)
命令作用
从 Docker Hub / 私有镜像仓库搜索符合条件的镜像。
完整语法
docker search [OPTIONS] TERM
参数解释(补充笔记遗漏参数)
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-f, --filter |
filter | 按条件过滤结果(如 stars=3 星级≥3、is-official=true 官方镜像) |
docker search -f is-official=true nginx |
--limit |
limit | 限制返回结果数量(默认 25) | docker search --limit 10 mysql |
--no-trunc |
no-trunc | 不截断镜像描述(默认截断) | docker search --no-trunc nginx |
--format |
format | 自定义输出格式(如 table {``{.Name}}\t{``{.Stars}} 或 json) |
docker search --format json nginx |
示例
# 搜索官方且星级≥1000的nginx镜像
docker search -f is-official=true -f stars=1000 nginx
补充知识点
- 私有仓库需先配置仓库地址,否则默认搜索 Docker Hub;
- 非官方镜像需谨慎使用,优先选择官方 / 高星级镜像。
2.2 拉取镜像(docker pull)
命令作用
从镜像仓库拉取指定镜像到本地,未指定 TAG 时默认拉取 latest。
完整语法
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
参数解释
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-a, --all-tags |
all-tags | 拉取仓库下所有标签的镜像(慎用,占用大量磁盘) | docker pull -a mysql |
--platform |
platform | 指定镜像平台(如 linux/arm64、linux/amd64) |
docker pull --platform linux/arm64 ubuntu:22.04 |
-q, --quiet |
quiet | 静默输出,仅显示镜像 ID,不显示拉取进度 | docker pull -q nginx:1.28.1 |
示例
# 拉取指定版本的nginx镜像
docker pull nginx:1.28.1
# 拉取指定摘要的镜像(精准版本)
docker pull nginx@sha256:0a1f2fb3231e1c0c1360ba383a2d02728b5912bb13eb87406839e2002e472fae
补充知识点
- 镜像分层复用:已下载的层无需重复拉取,国内可配置阿里云 / 网易云镜像加速提升拉取速度;
latest标签无版本约束,生产环境建议指定具体 TAG(如1.28.1)。
2.3 查看镜像信息
2.3.1 查看镜像分层历史(docker history)
命令作用
查看镜像每层的构建记录(创建命令、大小、时间),可排查镜像构建过程。
完整语法
docker history [OPTIONS] IMAGE[:TAG]
参数解释
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
--no-trunc |
no-trunc | 不截断构建命令(默认截断,仅显示部分) | docker history --no-trunc nginx:1.28.1 |
-f, --format |
format | 自定义输出格式(如 {``{.Size}}\t{``{.CreatedBy}}) |
docker history --format "{``{.Size}}\t{``{.CreatedBy}}" nginx:1.28.1 |
示例
# 查看nginx镜像的完整构建历史
docker history --no-trunc nginx:1.28.1
2.3.2 查看镜像底层元数据(docker inspect)
命令作用
以 JSON 格式查看镜像 / 容器的所有底层元数据(架构、分层、环境变量、配置等)。
完整语法
docker inspect [OPTIONS] IMAGE/CONTAINER [IMAGE/CONTAINER...]
参数解释
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-f, --format |
format | 提取指定字段,无需解析完整 JSON | docker inspect --format "{``{.Architecture}}" nginx:1.28.1 |
--type |
type | 限定对象类型(如 image/container),避免同名冲突 |
docker inspect --type image nginx:1.28.1 |
-s, --size |
size | 若对象是容器,额外显示总文件大小 | docker inspect -s 6242066cddca |
示例
# 提取nginx镜像的默认端口
docker inspect --format "{{.Config.ExposedPorts}}" nginx:1.28.1
# 查看镜像的完整元数据(JSON格式)
docker inspect nginx:1.28.1
2.4 镜像标签(docker tag)
命令作用
为本地镜像添加新标签(版本管理 / 推送私有仓库),仅添加引用,不复制镜像内容。
完整语法
docker tag 源镜像[:TAG] 目标镜像[:TAG]
示例
# 为nginx镜像添加私有仓库标签(用于推送)
docker tag nginx:1.28.1 harbor.example.com/my-nginx:1.28.1
# 为镜像添加别名标签
docker tag nginx:1.28.1 nginx:latest
补充知识点
- 标签覆盖:若目标标签已存在,会直接覆盖原有引用;
- 推送私有仓库前,需先给镜像打仓库地址前缀的标签。
2.5 查看本地镜像(docker images/docker image ls)
命令作用
列出本地已下载的镜像,docker image ls 是更规范的写法(推荐)。
完整语法
docker images [OPTIONS] [REPOSITORY[:TAG]]
参数解释
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-a, --all |
all | 显示所有镜像(含构建过程的中间层镜像,默认隐藏) | docker images -a |
-f, --filter |
filter | 过滤结果(如 dangling=true 查看悬空镜像、reference=nginx* 匹配 nginx 镜像) |
docker images -f "dangling=true" |
--no-trunc |
no-trunc | 显示完整的镜像 ID(默认显示前 12 位) | docker images --no-trunc |
-q, --quiet |
quiet | 仅显示镜像 ID,常用于批量操作(如删除) | docker images -q nginx* |
示例
# 查看所有nginx相关镜像
docker images nginx
# 仅显示所有镜像的ID
docker images -q
补充知识点
- 中间层镜像:构建镜像时产生的临时层,无标签,
-a参数才会显示,不可直接使用; - 镜像大小显示:分层复用导致总大小可能小于各镜像大小之和(共享层只计算一次)。
2.6 导出镜像(docker save)
命令作用
将一个 / 多个镜像打包为 tar 文件(保留分层、元数据),用于离线传输、备份。
完整语法
docker save [OPTIONS] IMAGE [IMAGE...]
参数解释
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-o, --output |
output | 指定导出文件的路径和名称(必选) | docker save -o /opt/nginx-mysql.tar nginx:1.28.1 mysql:8.4.3 |
示例
# 导出单个镜像
docker save -o /opt/nginx-1.28.1.tar nginx:1.28.1
# 导出多个镜像到同一个文件
docker save -o /opt/images.tar nginx:1.28.1 mysql:8.4.3
补充知识点
docker savevsdocker export:save针对镜像(保留分层),export针对容器(扁平化,丢失分层);- 导出的 tar 文件可通过
docker load导入,跨平台传输需注意镜像架构。
2.7 导入镜像(docker load)
命令作用
从 docker save 生成的 tar 文件导入镜像,恢复分层和元数据。
完整语法
docker load [OPTIONS]
参数解释
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-i, --input |
input | 指定导入的 tar 文件路径(必选) | docker load -i /opt/nginx-1.28.1.tar |
-q, --quiet |
quiet | 静默输出,仅显示导入的镜像 ID | docker load -q -i /opt/images.tar |
示例
# 导入镜像文件
docker load -i /opt/nginx-1.28.1.tar
补充知识点
- 导入后镜像标签与导出时一致,无需重新打标签;
- 若本地已有同名标签镜像,导入后会覆盖。
2.8 查看悬空镜像(docker images -f "dangling=true")
命令作用
筛选出所有名称 / TAG 为 <none> 的悬空镜像,确认需清理的镜像。
完整语法
docker images -f "dangling=true" [OPTIONS]
示例
# 查看所有悬空镜像(显示完整ID)
docker images -f "dangling=true" --no-trunc
2.9 删除悬空镜像(docker image prune)
命令作用
自动删除所有悬空镜像,释放磁盘空间。
完整语法
docker image prune [OPTIONS]
参数解释
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-f, --force |
force | 强制删除,无需手动确认 | docker image prune -f |
--all |
all | 不仅删除悬空镜像,还删除所有未被容器引用的镜像(慎用) | docker image prune -a -f |
示例
# 强制删除所有悬空镜像
docker image prune -f
补充知识点
- 执行前建议确认无重要镜像被标记为悬空;
--all参数会删除所有未使用的镜像,生产环境需谨慎。
2.10 删除镜像(docker rmi)
命令作用
删除本地一个 / 多个镜像,需确保镜像无运行 / 停止的容器引用。
完整语法
docker rmi [OPTIONS] IMAGE [IMAGE...]
参数解释
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-f, --force |
force | 强制删除镜像(即使有容器引用,需先停止 / 删除容器) | docker rmi -f nginx:1.28.1 |
--no-prune |
no-prune | 不删除镜像的中间层(默认会删除) | docker rmi --no-prune nginx:1.28.1 |
示例
# 删除指定标签的镜像
docker rmi nginx:latest
# 批量删除所有nginx镜像(通过镜像ID)
docker rmi $(docker images -q nginx*)
补充知识点
- 若镜像被容器引用,需先删除容器(
docker rm)再删除镜像; - 批量删除可结合
docker images -q实现(如删除所有未使用镜像:docker rmi $(docker images -f "dangling=true" -q))。
三、容器管理(Container Management)
3.1 查看容器(docker ps/docker container ls)
命令作用
列出本地容器,默认仅显示运行中的容器,docker container ls 是规范写法。
完整语法
docker ps [OPTIONS]
参数解释
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-a, --all |
all | 显示所有容器(运行中 + 已停止) | docker ps -a |
-f, --filter |
filter | 按条件过滤(如 status=running 运行中、name=mysql 容器名) |
docker ps -f status=exited |
--format |
format | 自定义输出格式(如 table {``{.ID}}\t{``{.Names}}\t{``{.Status}}) |
docker ps --format json |
-n, --last int |
last | 显示最近创建的 n 个容器(含所有状态) | docker ps -n 5 |
-l, --latest |
latest | 显示最近创建的 1 个容器(含所有状态) | docker ps -l |
--no-trunc |
no-trunc | 不截断容器 ID / 命令(默认截断) | docker ps --no-trunc |
-q, --quiet |
quiet | 仅显示容器 ID,用于批量操作 | docker ps -aq |
-s, --size |
size | 显示容器占用的磁盘大小 | docker ps -s |
示例
# 查看所有已停止的容器
docker ps -a -f status=exited
# 查看最近创建的3个容器(显示大小)
docker ps -n 3 -s
补充知识点
- 容器状态:
Created(已创建)、Up(运行中)、Exited(已停止)、Paused(已暂停); docker ps -aq可获取所有容器 ID,用于批量删除(docker rm $(docker ps -aq))。
3.2 创建容器(docker create)
命令作用
创建一个新容器,但不启动(仅生成容器实例,状态为 Created)。
完整语法
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
核心参数解释(全量参数见笔记,以下为高频参数)
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
--rm |
- | 容器停止后自动删除(适合一次性任务) | docker create --rm nginx:1.28.1 |
-i, --interactive |
interactive | 保持 STDIN 打开(即使未附加) | docker create -i nginx:1.28.1 |
-t, --tty |
tty | 分配伪终端(与 -i 配合使用,进入容器交互) |
docker create -it nginx:1.28.1 |
--name string |
name | 自定义容器名称(默认随机生成) | docker create --name my-nginx nginx:1.28.1 |
-e, --env list |
env | 设置容器内环境变量 | docker create -e MYSQL_ROOT_PASSWORD=123456 mysql:8.4.3 |
-p, --publish list |
publish | 端口映射(宿主机端口:容器端口) | docker create -p 8080:80 nginx:1.28.1 |
-v, --volume list |
volume | 挂载卷 / 绑定目录(宿主机路径:容器路径) | docker create -v /opt/nginx/html:/usr/share/nginx/html nginx:1.28.1 |
--restart string |
restart | 容器重启策略(no/always/unless-stopped/on-failure) | docker create --restart always nginx:1.28.1 |
-w, --workdir string |
workdir | 容器内默认工作目录 | docker create -w /usr/share/nginx/html nginx:1.28.1 |
示例
# 创建交互式nginx容器(自定义名称)
docker create --name my-nginx -it nginx:1.28.1
# 创建带环境变量的mysql容器(停止后自动删除)
docker create --rm -e MYSQL_ROOT_PASSWORD=123456 mysql:8.4.3
补充知识点
create仅创建容器,需配合docker start启动;--rm不会删除挂载的命名卷,仅删除匿名卷。
3.3 启动容器(docker start)
命令作用
启动一个已创建(状态为 Created/Exited)的容器。
完整语法
docker start [OPTIONS] CONTAINER [CONTAINER...]
参数解释
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-a, --attach |
attach | 附加到容器的 STDOUT/STDERR,并转发信号 | docker start -a my-nginx |
-i, --interactive |
interactive | 附加到容器的 STDIN(交互模式) | docker start -i my-nginx |
--detach-keys string |
detach-keys | 自定义脱离容器的快捷键(默认 Ctrl+P+Q) | docker start --detach-keys "ctrl-d" my-nginx |
示例
# 启动单个容器(通过名称)
docker start my-nginx
# 启动多个容器(通过ID)
docker start 6242066cddca c6109c3eccbb
# 启动容器并附加到输出(查看日志)
docker start -a my-nginx
补充知识点
- 启动后容器状态变为
Up; - 若容器启动失败,可通过
docker logs排查原因。
3.4 进入容器(docker exec)
命令作用
在运行中的容器内执行命令(如进入交互终端、执行脚本)。
完整语法
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
参数解释
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-d, --detach |
detach | 后台执行命令(不进入容器) | docker exec -d my-nginx touch /tmp/test.txt |
-i, --interactive |
interactive | 保持 STDIN 打开 | docker exec -i my-nginx cat /etc/nginx/nginx.conf |
-t, --tty |
tty | 分配伪终端(与 -i 配合进入交互终端) |
docker exec -it my-nginx /bin/bash |
-u, --user string |
user | 指定执行命令的用户(如 root、1000) |
docker exec -u nginx my-nginx whoami |
-w, --workdir string |
workdir | 指定容器内工作目录 | docker exec -w /usr/share/nginx/html my-nginx ls |
-e, --env list |
env | 设置执行命令时的环境变量 | docker exec -e "PATH=/usr/local/sbin" my-nginx echo $PATH |
示例
# 进入容器交互终端(bash)
docker exec -it my-nginx /bin/bash
# 后台执行命令(创建文件)
docker exec -d my-nginx mkdir /opt/test
# 以nginx用户执行命令
docker exec -u nginx my-nginx id
补充知识点
- 优先使用
exec进入容器,避免attach(attach退出会终止容器); - 若容器无
/bin/bash,可尝试/bin/sh(如 Alpine 镜像)。
3.5 停止容器(docker stop)
命令作用
优雅停止运行中的容器(发送 SIGTERM 信号,应用可收尾),超时后发送 SIGKILL 强制终止。
完整语法
docker stop [OPTIONS] CONTAINER [CONTAINER...]
参数解释
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-s, --signal string |
signal | 指定停止容器的信号(默认 SIGTERM) | docker stop -s SIGINT my-nginx |
-t, --timeout int |
timeout | 等待容器停止的超时时间(秒,默认 10) | docker stop -t 20 my-nginx |
示例
# 停止单个容器
docker stop my-nginx
# 停止多个容器(ID+名称)
docker stop 6242066cddca mysql
# 强制快速停止(超时1秒)
docker stop -t 1 my-nginx
补充知识点
docker kill直接发送 SIGKILL 强制终止容器(不等待),紧急情况使用;- 容器停止后状态变为
Exited,若创建时指定--rm,则自动删除。
3.6 暂停容器(docker pause)
命令作用
暂停容器内所有进程(资源仍占用,仅暂停执行),状态变为 Up (Paused)。
完整语法
docker pause CONTAINER [CONTAINER...]
示例
# 暂停单个容器
docker pause my-nginx
# 暂停多个容器
docker pause my-nginx mysql
补充知识点
- 暂停后容器无法响应请求,适合临时维护(如备份);
- 暂停不释放 CPU / 内存资源,仅冻结进程。
3.7 恢复暂停的容器(docker unpause)
命令作用
恢复被暂停的容器,进程继续执行,状态回到 Up。
完整语法
docker unpause CONTAINER [CONTAINER...]
示例
# 恢复单个容器
docker unpause my-nginx
# 恢复多个容器
docker unpause my-nginx mysql
3.8 运行容器(docker run)
命令作用
创建并启动容器(create + start 的组合命令),本地无镜像时自动拉取。
完整语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
核心参数解释(与 docker create 大部分一致,新增高频参数)
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-d, --detach |
detach | 后台运行容器(守护进程模式) | docker run -d nginx:1.28.1 |
-P, --publish-all |
publish-all | 随机映射所有暴露的端口到宿主机 | docker run -P nginx:1.28.1 |
--pull string |
pull | 运行前拉取镜像策略(always/missing/never) | docker run --pull always nginx:1.28.1 |
--privileged |
privileged | 赋予容器特权(接近宿主机 root 权限,慎用) | docker run --privileged -d nginx:1.28.1 |
--read-only |
read-only | 将容器根文件系统设为只读 | docker run --read-only -d nginx:1.28.1 |
示例(生产级 MySQL 容器)
docker run \
--name mysql \
-d \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
--restart unless-stopped \
mysql:8.4.3 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
补充知识点
--restart策略:no:默认,容器退出不重启;always:始终重启(即使手动停止,重启 Docker 后仍启动);unless-stopped:除非手动停止,否则始终重启;on-failure:n:容器异常退出(退出码非 0)时重启,最多 n 次;
- 端口冲突:若宿主机端口已被占用,容器启动失败,需更换端口(如
-p 3307:3306)。
3.9 查看容器日志(docker logs)
命令作用
查看容器的日志输出(应用日志、启动日志等),用于排查容器异常。
完整语法
docker logs [OPTIONS] CONTAINER
参数解释
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-f, --follow |
follow | 实时跟踪日志(类似 tail -f) |
docker logs -f mysql |
--details |
details | 显示日志的额外详情 | docker logs --details mysql |
--since string |
since | 显示指定时间后的日志(如 2026-01-25、10m) |
docker logs --since 10m mysql |
-n, --tail string |
tail | 显示最后 n 行日志(默认 all) |
docker logs -n 50 mysql |
-t, --timestamps |
timestamps | 显示日志时间戳 | docker logs -t mysql |
--until string |
until | 显示指定时间前的日志 | docker logs --until 5m mysql |
示例
# 实时跟踪mysql容器日志(带时间戳)
docker logs -ft mysql
# 查看mysql容器最后100行日志
docker logs -n 100 mysql
# 查看2026-01-25之后的日志
docker logs --since 2026-01-25 mysql
补充知识点
- 日志仅包含容器内标准输出 / 标准错误,若应用日志写入文件,需进入容器查看;
- 可通过
--log-driver指定日志驱动(如json-file、syslog),实现日志集中管理。
3.10 删除容器(docker rm)
命令作用
删除一个 / 多个已停止的容器,运行中的容器需先停止或强制删除。
完整语法
docker rm [OPTIONS] CONTAINER [CONTAINER...]
参数解释
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-f, --force |
force | 强制删除运行中的容器(发送 SIGKILL) | docker rm -f my-nginx |
-l, --link |
link | 删除容器的链接(不删除容器本身) | docker rm -l my-link |
-v, --volumes |
volumes | 删除容器关联的匿名卷(命名卷需手动删除) | docker rm -v my-nginx |
示例
# 删除已停止的容器
docker rm mysql
# 强制删除运行中的容器
docker rm -f my-nginx
# 批量删除所有已停止的容器
docker rm $(docker ps -aq -f status=exited)
补充知识点
- 命名卷不会随容器删除,需通过
docker volume rm删除; - 强制删除运行中的容器可能导致数据丢失,需谨慎。
3.11 查看容器信息(docker inspect)
命令作用
以 JSON 格式查看容器的所有底层元数据(网络、存储、环境变量、资源限制等)。
完整语法
docker inspect [OPTIONS] CONTAINER [CONTAINER...]
参数解释(与镜像 inspect 一致,新增容器专属)
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-s, --size |
size | 额外显示容器的磁盘使用大小 | docker inspect -s my-nginx |
示例
# 提取容器的IP地址
docker inspect --format "{{.NetworkSettings.IPAddress}}" my-nginx
# 查看容器的资源限制
docker inspect --format "{{.HostConfig.Resources}}" my-nginx
3.12 查看容器资源状态(docker stats)
命令作用
实时查看容器的资源使用情况(CPU、内存、IO、网络),默认持续输出。
完整语法
docker stats [OPTIONS] [CONTAINER...]
参数解释
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-a, --all |
all | 显示所有容器(默认仅运行中) | docker stats -a |
--format string |
format | 自定义输出格式 | docker stats --format "{``{.Name}}\t{``{.CPUPerc}}\t{``{.MemUsage}}" |
--no-stream |
no-stream | 仅输出一次统计结果,不持续刷新 | docker stats --no-stream my-nginx |
示例
# 实时查看所有运行中容器的资源状态
docker stats
# 仅查看mysql容器的资源状态(非实时)
docker stats --no-stream mysql
# 自定义格式输出(名称+CPU使用率+内存使用率)
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemPerc}}"
补充知识点
- 输出字段说明:
CPUPerc:CPU 使用率;MemUsage:内存使用量 / 限制;NetIO:网络 IO(入 / 出);BlockIO:磁盘 IO(读 / 写);
- 可通过
docker update动态调整容器的 CPU / 内存限制(如docker update --cpus 2 my-nginx)。
4.1 镜像与容器的关系(细化补充)
底层存储逻辑
镜像由多层只读的 "镜像层" 组成,每层对应 Dockerfile 中的一条指令(如 RUN、COPY),层通过 UnionFS(联合文件系统)叠加;容器启动时,会在镜像只读层之上添加可写层(容器层),容器内的所有写操作(如创建文件、修改配置)仅作用于该层。
资源复用特性
多个容器基于同一镜像运行时,共享所有镜像层,仅各自维护独立的可写层,大幅节省磁盘空间。例如:10 个 nginx 容器仅占用 1 份 nginx 镜像层空间 + 10 份微小的可写层空间。
镜像 / 容器操作关联约束
- 删除镜像前,必须删除所有基于该镜像创建的容器(运行中 / 已停止),否则需加
-f强制删除(不推荐,可能导致容器异常); - 修改容器内文件不会影响镜像,若需固化修改,需通过
docker commit生成新镜像(生产环境不推荐,建议用 Dockerfile 构建)。
4.2 容器数据持久化(深度补充)
容器默认的可写层随容器删除而丢失,需通过以下方式实现数据持久化,按推荐优先级排序:
4.2.1 命名卷(推荐,Docker 管理)
核心特性
- 卷由 Docker 统一管理,存储路径为
/var/lib/docker/volumes/卷名/_data(宿主机); - 跨容器共享、容器删除后卷数据保留、支持权限配置、无需关注宿主机路径。
完整语法 & 示例
# 1. 创建命名卷(可选,运行容器时会自动创建)
docker volume create nginx-html
# 2. 运行容器挂载命名卷
docker run -d \
--name my-nginx \
-v nginx-html:/usr/share/nginx/html \
nginx:1.28.1
# 3. 查看卷信息(路径、挂载容器)
docker volume inspect nginx-html
# 4. 删除卷(需先删除关联容器)
docker volume rm nginx-html
4.2.2 绑定挂载(灵活,手动管理)
核心特性
- 直接映射宿主机任意路径到容器内,数据双向同步;
- 宿主机路径需手动创建,权限易出问题(如容器内用户无读写权限)。
完整语法 & 示例
# 1. 宿主机创建目录并设置权限(避免权限问题)
mkdir -p /opt/nginx/html && chmod 777 /opt/nginx/html
# 2. 运行容器绑定挂载
docker run -d \
--name my-nginx \
-v /opt/nginx/html:/usr/share/nginx/html \
nginx:1.28.1
# 补充:指定挂载权限(只读)
docker run -d \
-v /opt/nginx/conf:/etc/nginx/conf.d:ro \
nginx:1.28.1
4.2.3 匿名卷(不推荐,易管理混乱)
核心特性
- 无自定义卷名,Docker 自动生成随机名称,存储路径
/var/lib/docker/volumes/随机ID/_data; - 容器删除时,若加
-v参数则匿名卷被删除,否则保留(易产生冗余卷)。
示例
# 运行容器挂载匿名卷(仅指定容器路径)
docker run -d \
--name my-nginx \
-v /usr/share/nginx/html \
nginx:1.28.1
# 查看匿名卷(无名称,仅显示ID)
docker volume ls
4.2.4 三种持久化方式对比
| 类型 | 管理方 | 存储路径 | 容器删除后数据 | 跨容器共享 | 推荐场景 |
|---|---|---|---|---|---|
| 命名卷 | Docker | /var/lib/docker/volumes/ 卷名 /_data | 保留 | 支持 | 生产环境、数据持久化 |
| 绑定挂载 | 手动 | 宿主机任意路径 | 保留 | 支持 | 开发调试、配置文件挂载 |
| 匿名卷 | Docker | /var/lib/docker/volumes/ 随机 ID/_data | 可选保留 | 不推荐 | 临时数据、无需持久化 |
4.3 容器网络基础(全面补充)
4.3.1 Docker 默认网络模式
Docker 安装后自动创建 3 种网络,可通过docker network ls查看:
| 网络模式 | 作用 | 容器通信方式 | 访问外部网络 |
|---|---|---|---|
| bridge | 默认网络,容器接入桥接网络(docker0 网桥) | 容器 IP / 自定义网络别名 | 需端口映射 |
| host | 容器共享宿主机网络命名空间,无独立 IP | 直接使用宿主机 IP + 端口 | 无需映射 |
| none | 容器无网络(仅 lo 回环接口) | 无法通信 | 无法访问 |
示例:指定网络模式运行容器
# 1. host模式(容器80端口直接映射到宿主机80,无需-p)
docker run -d --net host nginx:1.28.1
# 2. none模式(仅用于无网络需求的容器)
docker run -d --net none busybox:latest
4.3.2 自定义网络(推荐,生产环境)
核心优势
- 容器间可通过容器名称通信(无需记 IP),IP 变化不影响;
- 支持网段自定义、DNS 解析、隔离不同业务容器。
完整操作示例
# 1. 创建自定义桥接网络(指定网段)
docker network create --driver bridge --subnet 172.20.0.0/16 my-network
# 2. 运行容器加入自定义网络
docker run -d --name nginx-1 --net my-network nginx:1.28.1
docker run -d --name nginx-2 --net my-network nginx:1.28.1
# 3. 容器间通过名称通信(在nginx-1内ping nginx-2)
docker exec -it nginx-1 ping nginx-2
# 4. 容器加入多个网络(新增网络连接)
docker network connect bridge nginx-1
4.3.3 端口映射底层原理
Docker 基于 Linux iptables的 DNAT(目标地址转换)实现端口映射,例如-p 8080:80:
# 查看iptables规则(验证端口映射)
iptables -t nat -L DOCKER --line-numbers
注意:宿主机防火墙需放行映射的端口(如 8080),否则外部无法访问。
4.4 容器资源限制(生产环境必备)
Docker 通过 Linux Cgroup 实现容器 CPU、内存、IO 等资源限制,避免单个容器占用宿主机全部资源。
4.4.1 CPU 限制
| 参数 | 作用 | 示例 |
|---|---|---|
| --cpus decimal | 限制容器使用的 CPU 核心数(如 1.5 表示 1.5 核) | docker run -d --cpus 2 nginx:1.28.1 |
| --cpu-shares int | CPU 权重(相对值,默认 1024,值越高优先级越高) | docker run -d --cpu-shares 2048 nginx |
| --cpuset-cpus string | 指定容器使用的 CPU 核心(如 0-1 表示仅用 0、1 核) | docker run -d --cpuset-cpus 0,1 nginx |
4.4.2 内存限制
| 参数 | 作用 | 示例 |
|---|---|---|
| -m / --memory bytes | 限制容器最大内存(如 1G、512M),超出则触发 OOM Killer | docker run -d -m 1G nginx:1.28.1 |
| --memory-reservation | 内存软限制(仅当宿主机内存不足时生效,优先级低于 - m) | docker run -d -m 2G --memory-reservation 1G nginx |
| --memory-swap bytes | 内存 + 交换分区总限制(-1 表示无限制) | docker run -d -m 1G --memory-swap 2G nginx |
4.4.3 IO 限制(可选)
# 限制容器对宿主机/dev/sda磁盘的写速度为10MB/s
docker run -d \
--device-write-bps /dev/sda:10MB \
nginx:1.28.1
4.4.4 动态调整资源限制
运行中的容器可通过docker update调整资源限制(无需重启):
# 将nginx容器的CPU核心数调整为1核,内存调整为512M
docker update --cpus 1 --memory 512M nginx
4.5 容器完整生命周期管理
4.5.1 生命周期状态流转
镜像(Image) → docker create → 容器(Created) → docker start → 容器(Up)
↑ ↓
docker commit docker stop → 容器(Exited) → docker rm → 销毁
↓
docker pause → 容器(Paused) → docker unpause → 容器(Up)
4.5.2 生命周期关键操作对比
| 操作 | 命令 | 容器状态变化 | 数据影响 |
|---|---|---|---|
| 创建 | docker create | 无 → Created | 仅生成容器实例,无数据写入 |
| 启动 | docker start | Created/Exited → Up | 加载镜像层,创建可写层 |
| 暂停 | docker pause | Up → Up (Paused) | 进程冻结,数据不写入 |
| 恢复 | docker unpause | Up (Paused) → Up | 进程恢复,可正常读写 |
| 停止 | docker stop | Up → Exited | 可写层数据保留(除非 --rm) |
| 删除 | docker rm | Exited → 销毁 | 可写层 / 匿名卷删除(命名卷保留) |
| 强制终止 | docker kill | Up → Exited | 强制停止进程,可能数据丢失 |
4.6 镜像构建基础(Dockerfile 核心)
4.6.1 Dockerfile 核心指令(高频)
| 指令 | 作用 | 示例 |
|---|---|---|
| FROM | 指定基础镜像(必选,第一行) | FROM nginx:1.28.1 |
| RUN | 构建镜像时执行的命令(分层构建) | RUN apt update && apt install -y curl |
| COPY | 从宿主机复制文件到镜像内 | COPY index.html /usr/share/nginx/html |
| ADD | 类似 COPY,支持解压压缩包、下载远程文件 | ADD app.tar.gz /opt/app |
| ENV | 设置镜像内环境变量(容器运行时可覆盖) | ENV MYSQL_ROOT_PASSWORD=123456 |
| EXPOSE | 声明容器暴露的端口(仅文档作用,需 - p 映射) | EXPOSE 80 443 |
| VOLUME | 声明匿名卷(运行容器时自动创建) | VOLUME /usr/share/nginx/html |
| CMD | 容器启动时执行的命令(可被 docker run 后参数覆盖) | CMD ["nginx", "-g", "daemon off;"] |
| ENTRYPOINT | 容器启动时的入口命令(不可覆盖,需 --entrypoint 参数修改) | ENTRYPOINT ["nginx"] |
| WORKDIR | 设置容器工作目录(后续指令的默认路径) | WORKDIR /usr/share/nginx/html |
4.6.2 构建镜像示例(自定义 nginx)
1. 编写 Dockerfile
# 基础镜像
FROM nginx:1.28.1
# 设置工作目录
WORKDIR /usr/share/nginx/html
# 复制自定义页面
COPY index.html .
# 声明暴露端口
EXPOSE 80
# 启动命令
CMD ["nginx", "-g", "daemon off;"]
2. 构建镜像
# 语法:docker build [OPTIONS] 上下文路径
docker build -t my-nginx:v1 .
# 参数解释:
# -t:打标签(名称:版本)
# .:构建上下文(Dockerfile所在目录)
3. 运行自定义镜像
docker run -d -p 8080:80 my-nginx:v1
4.6.3 构建优化技巧
- 分层缓存:将不变的指令(如 FROM、RUN apt update)放在前面,频繁修改的(如 COPY 代码)放在后面,复用缓存层;
- 减少层数:合并 RUN 指令(用 && 连接),避免过多镜像层;
- 清理冗余:RUN 指令最后清理缓存(如
apt clean && rm -rf /var/lib/apt/lists/*),减小镜像体积。
4.7 生产环境最佳实践(细化补充)
4.7.1 镜像规范
- 版本管控:禁止使用 latest 标签,指定具体版本(如 nginx:1.28.1),或使用镜像摘要(SHA256)确保版本唯一;
- 镜像来源:优先使用 Docker Hub 官方镜像,私有仓库需配置镜像扫描(如 Trivy),避免恶意镜像;
- 镜像瘦身:使用多阶段构建(Multi-stage Build),仅保留运行时依赖,剔除构建工具(如 Go、Maven)。
4.7.2 容器运行规范
- 运行模式:后台运行(
-d),避免前台运行导致终端关闭容器终止; - 重启策略:生产环境指定
--restart unless-stopped,Docker 重启 / 宿主机重启后容器自动恢复; - 资源限制:必加
--cpus、-m限制 CPU / 内存,避免容器抢占资源; - 权限最小化:
- 避免
--privileged特权模式; - 指定非 root 用户运行容器(如
-u nginx);
- 避免
- 日志管理:
- 配置日志驱动(如
--log-driver json-file --log-opt max-size=100m --log-opt max-file=3),限制日志大小; - 对接集中式日志平台(ELK、Loki),避免日志存储在容器内。
- 配置日志驱动(如
4.7.3 数据管理规范
- 数据持久化:优先使用命名卷,避免绑定挂载的权限问题;
- 定期备份:对命名卷数据定期备份(
docker run --rm -v 卷名:/data -v 宿主机备份路径:/backup busybox tar -zcvf /backup/volume-backup.tar.gz /data); - 避免数据混写:将配置文件、静态资源、业务数据分别挂载不同卷,便于管理。
4.7.4 安全规范
- 网络隔离:不同业务的容器加入不同自定义网络,避免跨业务通信;
- 镜像扫描:定期扫描镜像漏洞(
trivy image nginx:1.28.1),及时更新基础镜像; - 容器监控:部署监控工具(如 cAdvisor、Prometheus+Grafana),监控容器资源、状态、日志。
4.8 常见问题排查技巧
4.8.1 容器启动失败
- 查看容器日志:
docker logs 容器ID/名称(核心手段,定位启动命令、配置错误); - 检查端口冲突:
netstat -tulpn | grep 端口号(宿主机端口被占用); - 验证镜像完整性:
docker inspect 镜像名(查看镜像元数据是否正常); - 手动执行启动命令:
docker run -it --rm 镜像名 启动命令(交互模式排查命令错误)。
4.8.2 容器内服务无法访问
- 检查端口映射:
docker ps(确认-p参数正确,容器端口暴露); - 检查容器网络:
docker inspect 容器ID | grep IPAddress(验证容器 IP,宿主机 ping 容器 IP); - 检查容器内服务状态:
docker exec -it 容器ID 服务状态命令(如nginx -t、mysql -uroot -p123456); - 检查宿主机防火墙:
firewall-cmd --list-ports(放行映射端口)。
4.8.3 数据持久化异常
- 查看卷挂载状态:
docker inspect 容器ID | grep Mounts(验证卷挂载路径、类型); - 检查权限:
docker exec -it 容器ID ls -l 挂载路径(容器内路径权限是否可读写); - 查看卷数据:
docker run --rm -v 卷名:/data busybox ls /data(直接查看卷内数据)。
4.8.4 磁盘空间不足
-
清理无用资源:
# 清理悬空镜像 docker image prune -f # 清理已停止容器、无用卷、网络 docker system prune -af # 清理指定卷(确认无数据后) docker volume prune -f -
查看磁盘占用:
# 查看Docker资源占用 docker system df # 查看宿主机磁盘 df -h
五、常用命令速查表(便捷查阅)
| 操作类型 | 核心命令 | 高频参数 |
|---|---|---|
| 镜像搜索 | docker search 镜像名 | -f is-official=true、--limit |
| 镜像拉取 | docker pull 镜像名:TAG | -a、--platform |
| 镜像查看 | docker images / docker image ls | -a、-f dangling=true、-q |
| 镜像删除 | docker rmi 镜像 ID / 名称 | -f |
| 容器创建 | docker create 镜像名 | --name、-it、--rm、-e、-p、-v |
| 容器启动 | docker start 容器 ID / 名称 | -a、-i |
| 容器运行 | docker run 镜像名 | -d、--name、-e、-p、-v、--restart |
| 容器进入 | docker exec 容器 ID / 名称 命令 | -it、-u、-w |
| 容器停止 | docker stop 容器 ID / 名称 | -t、-s |
| 容器删除 | docker rm 容器 ID / 名称 | -f、-v |
| 容器查看 | docker ps | -a、-f、-q、-s |
| 资源监控 | docker stats 容器 ID / 名称 | --no-stream、--format |
| 日志查看 | docker logs 容器 ID / 名称 | -f、-t、-n、--since |
| 数据卷管理 | docker volume [create/ls/inspect/rm/prune] | -f |
| 网络管理 | docker network [create/ls/connect/disconnect/rm] | --subnet、--driver |
| 构建镜像 | docker build -t 镜像名:TAG 上下文 | -f(指定 Dockerfile)、--no-cache |
| 资源清理 | docker system prune | -a、-f |