Docker 超详细全量笔记(含参数解释)

一、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/arm64linux/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 save vs docker exportsave 针对镜像(保留分层),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 指定执行命令的用户(如 root1000 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 进入容器,避免 attachattach 退出会终止容器);
  • 若容器无 /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-2510m 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-filesyslog),实现日志集中管理。

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 容器启动失败

  1. 查看容器日志:docker logs 容器ID/名称(核心手段,定位启动命令、配置错误);
  2. 检查端口冲突:netstat -tulpn | grep 端口号(宿主机端口被占用);
  3. 验证镜像完整性:docker inspect 镜像名(查看镜像元数据是否正常);
  4. 手动执行启动命令:docker run -it --rm 镜像名 启动命令(交互模式排查命令错误)。

4.8.2 容器内服务无法访问

  1. 检查端口映射:docker ps(确认-p参数正确,容器端口暴露);
  2. 检查容器网络:docker inspect 容器ID | grep IPAddress(验证容器 IP,宿主机 ping 容器 IP);
  3. 检查容器内服务状态:docker exec -it 容器ID 服务状态命令(如nginx -tmysql -uroot -p123456);
  4. 检查宿主机防火墙:firewall-cmd --list-ports(放行映射端口)。

4.8.3 数据持久化异常

  1. 查看卷挂载状态:docker inspect 容器ID | grep Mounts(验证卷挂载路径、类型);
  2. 检查权限:docker exec -it 容器ID ls -l 挂载路径(容器内路径权限是否可读写);
  3. 查看卷数据:docker run --rm -v 卷名:/data busybox ls /data(直接查看卷内数据)。

4.8.4 磁盘空间不足

  1. 清理无用资源:

    复制代码
    # 清理悬空镜像
    docker image prune -f
    # 清理已停止容器、无用卷、网络
    docker system prune -af
    # 清理指定卷(确认无数据后)
    docker volume prune -f
  2. 查看磁盘占用:

    复制代码
    # 查看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
相关推荐
小林up2 小时前
Ubuntu使用阿里云安装docker
ubuntu·阿里云·docker
重生之绝世牛码2 小时前
Linux软件安装 —— ClickHouse集群安装(集成Zookeeper)+ chproxy负载均衡
大数据·linux·数据库·clickhouse·软件安装·clickhouse集群安装·clickhouse负载均衡
信创天地2 小时前
信创运维核心技术:国产化软硬件适配与故障排查全解析
运维·人工智能·开源·dubbo·运维开发·risc-v
学烹饪的小胡桃2 小时前
WGCLOUD使用指南 - 如何监控交换机防火墙的数据
运维·服务器·网络
Howrun7772 小时前
Linux网络编程_常见API
linux·运维·网络
ShiLiu_mtx2 小时前
k8s - 4
云原生·容器·kubernetes
STCNXPARM2 小时前
Linux-ARM-Bootloader概述
linux·运维·arm开发·uboot·bootloader
weixin_440730502 小时前
04python编程笔记-04函数+05面向对象
笔记·python
林深现海2 小时前
宇树 Go2 + NaVILA 全栈导航系统详解 (新手入门版)
linux·vscode·yolo·ubuntu·机器人