首页/云/Docker 容器速查

Docker 容器速查

Docker 命令、Dockerfile 与镜像构建、网络与存储、Compose 编排、资源限制与安全加固、容器排障:容器化工作全流程速查。

共 366 条更新于 2026-10-12所属领域:云
共 366 条

基础命令

run/ps/exec/logs/inspect 等高频命令与参数

docker run 创建并启动容器热门

从镜像创建容器并启动进程的核心命令,把镜像、启动命令与运行参数组合在一次调用里;顺序为选项、镜像、命令。

docker ps 查看容器列表热门

列出容器状态的核心命令,默认仅显示运行中的容器;-a 看全部、-q 只取 ID、-s 附带磁盘占用,是日常巡检的起点。

docker logs 查看容器日志热门

查看容器主进程的 stdout/stderr 历史输出;注意它只覆盖容器标准流,应用自己写进文件的日志不在其中。

docker exec 进入容器执行命令热门

在运行中的容器里新开一个进程执行命令,用它开 shell 排查、跑检测命令、看进程;不会替换容器主进程。

docker inspect 查看对象详情热门

输出容器/镜像/网络/卷的完整 JSON 元数据,是排障与自动化取值的主力命令:状态、退出码、网络、挂载、资源配置都在里面。

docker run -d 后台运行容器热门

detach 模式让容器在后台运行并立即返回容器 ID;是否后台与容器能否长期运行无关,主进程退出容器就停止。

docker stats 实时资源占用热门

流式查看容器 CPU、内存、网络与磁盘 IO 占用;--no-stream 取单次数值,适合快速判断谁在吃资源。

docker run -it 交互式运行

-i 保持标准输入打开、-t 分配伪终端,两者组合后像 SSH 一样进入容器交互环境,常用于一次性调试与试跑镜像。

docker system df 磁盘占用总览

按镜像、容器、数据卷、构建缓存四类统计占用与可回收空间,是磁盘告警时第一眼要看的命令。

docker run 环境变量 -e 与 --env-file

用 -e 单个传入或 --env-file 批量注入环境变量;只写变量名时取宿主当前 shell 的同名值,是 12-factor 配置的常用做法。

docker stop 优雅停止容器

先发 SIGTERM 等待进程退出,超时(默认 10 秒)后 SIGKILL 强杀;-t 调整本次宽限时间。

docker rm 删除容器

删除已停止容器;-f 强杀并删除运行中的容器,-v 一并删除匿名数据卷;删除对象不可恢复,先确认日志与数据。

docker run --restart 重启策略

为容器配置退出后的自动拉起规则:on-failure/always/unless-stopped 三种常用策略,配合 docker update 可在线调整。

docker run --name 与 --rm

--name 给容器取稳定可读的名字便于后续操作,--rm 让一次性容器退出后自动删除,避免留下大量已停止对象。

docker inspect -f 模板取值

用 Go 模板从 inspect 结果里精确取字段:退出码、OOM 标记、挂载列表、网络地址等,一行命令完成判断,免去翻 JSON。

docker start 启动已停止容器

重新启动一个已存在(Exited 状态)的容器,沿用创建时固化的全部配置;-a 前台附着,-ai 交互进入。

docker cp 宿主与容器之间复制文件

在宿主机与容器之间双向复制文件/目录,支持已停止容器;临时改配置、导出产物、排查现场都用它。

docker restart 重启容器

等价于对同一容器先 stop 再 start,进程与临时状态重置,但容器配置与可写层保留;-t 控制停止宽限。

docker system prune 综合清理

清理已停止容器、未使用网络、悬空镜像与构建缓存;-a 扩展到全部未使用镜像,--volumes 再加未使用卷,属高风险清理。

docker run -u 与 -w 指定用户和目录

以指定 UID/GID 和初始工作目录运行容器进程,常用于让容器以非 root 身份写挂载目录,避免产出文件属主是 root。

docker ps --filter 筛选容器

按状态、退出码、名称、标签、镜像等维度过滤容器列表,退出码 137 过滤能快速找出被强杀或 OOM 的实例。

docker info 查看守护进程信息

输出引擎版本、存储驱动、日志驱动、数据根目录、资源与容器计数等宿主环境概况,是排障前的环境摸底命令。

docker run --entrypoint 覆盖入口点

临时替换镜像的 ENTRYPOINT 来调试镜像:改成 sh、cat、ls 等命令检查文件系统,不影响镜像本身。

docker logs 时间过滤 --since/--until

按时间窗口查看日志:--since 支持相对时长,--until 截断上界,配合 --tail 与 -t 时间戳,适合事故回溯。

docker kill 发送信号终止容器

直接向容器主进程发信号,默认 SIGKILL 立即终止不等退出;也支持 -s 发送应用自定义信号(如 HUP 触发重载)。

每容器日志驱动与轮转参数

创建容器时用 --log-driver 与 --log-opt 定义日志去向与轮转:max-size/max-file 控制单文件大小与份数,是防止日志写满磁盘的常规手段。

docker ps --format 定制输出

用 Go 模板自定义 ps 输出列,或直接输出 JSON 交给 jq 处理,适合脚本巡检与生成报表。

docker top 查看容器内进程

从宿主视角列出容器内的进程及其宿主 PID,用于确认主进程、排查多进程与 PID 映射关系。

docker version 查看客户端与引擎版本

分别显示 client 与 server(守护进程)版本及 API 版本;Server 段能否输出,也是判断本机 daemon 是否可达的快捷方式。

docker run --platform 指定架构

在多架构镜像(multi-arch manifest)里挑选目标平台运行,常见于 Apple Silicon 上跑 amd64 镜像或核对跨平台产物。

docker run 运行时健康检查参数

启动时用 --health-cmd 等参数为容器加健康检查,Docker 周期性执行该命令并记录状态,docker ps 的 STATUS 会显示 (healthy)。

docker exec 常用选项 -u/-w/-e/-d

exec 的四个常用开关:-u 指定用户、-w 指定工作目录、-e 临时注入变量、-d 后台执行;都可组合使用。

查询容器 IP 地址

用模板从 NetworkSettings 提取容器 IP;自定义网络里的地址要遍历 Networks 映射,直接取首层 IPAddress 会拿到空值。

docker container prune 清理停止容器

批量删除所有已停止容器,是定期清理的常规手段;--filter until= 只清超龄的,-f 跳过交互确认。

docker run --label 打标签

给容器附加 key=value 元数据:标记环境、团队、版本,配合 docker ps --filter label= 可以按维度筛选与统计。

docker run 停止信号与超时

定义 docker stop 先发什么信号、等待多久再强杀,用来给应用争取优雅退出的时间;不设置时默认 SIGTERM、10 秒超时。

docker events 观察 daemon 事件流

实时订阅 Docker 守护进程事件:容器创建、启动、退出、OOM、健康状态变化等,用来回答“为什么它又重启了”。

docker run --pull 拉取策略

控制 run 之前是否联网拉取镜像:missing 用本地优先,always 强制更新 tag,never 只允许使用本地已有镜像(离线环境)。

docker run --init 处理信号与僵尸进程

在容器里注入一个 init 进程(基于 tini 的 docker-init)作为 PID 1:转发信号、回收僵尸子进程,适合把普通程序直接当主进程跑的场景。

docker port 查看端口映射

查容器端口在宿主上的映射结果:不发布任何端口的容器输出为空,指定容器内端口可只看一条映射。

命令分组语法 container/image/network

Docker 1.13 起的命令分组写法:docker container ls、docker image ls、docker network ls 等与旧短命令等价,脚本里更清晰。

docker run --gpus 使用 GPU

把宿主 NVIDIA GPU 暴露给容器:--gpus all 用全部卡、--gpus 1 用一张;前提是宿主装好驱动与容器工具包。

docker attach 附着到容器主进程

占用当前终端直接连接容器的标准输入输出;与 exec 的关键区别是它连着主进程,按键信号会直接传给服务。

docker pause 挂起容器

用 cgroup freezer 冻结容器内全部进程:不消耗 CPU、内存照常占用;unpause 恢复运行,适合临时让出资源。

docker commit 容器保存为镜像

把容器的可写层固化成一个新镜像,用于临时保存现场或做快速原型;正规交付仍应回到 Dockerfile 重建。

docker diff 查看容器文件改动

列出容器可写层相对镜像的文件变化:A 新增、C 修改、D 删除;用于定位运行期间被写入或被改动的文件。

docker export 导出容器文件系统

把容器根文件系统打包成 tar(默认输出到 stdout),得到扁平化快照;与 save 导出的镜像包不是一回事。

docker wait 等待容器结束

阻塞等待指定容器退出并打印其退出码,脚本编排里用来同步等待一次性任务完成。

docker import 从 tar 导入镜像

把 rootfs tar 包导入成本地镜像,可用 --change 补 CMD/ENTRYPOINT 等配置;常用于迁移旧 rootfs 或恢复扁平快照。

docker rename 重命名容器

修改容器名称,运行中或已停止均可操作;名称是日常操作的主要引用方式,改名后要同步更新脚本与文档。

镜像与构建

Dockerfile 指令、多阶段构建、镜像瘦身与仓库管理

docker build 构建镜像热门

按 Dockerfile 构建镜像的核心命令:把上下文交给构建器,逐条执行指令后产出本地镜像;Docker 23 起默认使用 BuildKit 引擎。

Dockerfile 结构与构建流程热门

Dockerfile 是构建镜像的声明式脚本:docker build 按顺序执行指令,可执行类指令产出层,配置类指令写入元数据,最终打包成镜像。

FROM 指定基础镜像

每条 FROM 开启一个构建阶段并指定起点镜像;必需且至少一条,可带 AS 命名供其他阶段引用。

docker images 列出本地镜像

列出本地镜像及标签、镜像 ID、创建时间与体积;支持按仓库名、悬空状态、标签条件过滤,是排查本地镜像状态的第一步。

RUN 执行构建命令

构建期执行命令并产出层:shell 形式(默认 /bin/sh -c)便于用管道与变量,exec 形式不经过 shell、更可控。

docker tag 给镜像打标签

为已有镜像追加引用名:为推送私有仓库补全地址前缀,或同时维护版本标签与 latest;同一镜像的所有标签共享同一个镜像 ID。

docker pull 拉取镜像

从注册表拉取镜像与标签到本地:不指定标签默认 latest,支持按平台拉取与静默输出;生产环境建议固定具体版本号。

COPY 复制文件进镜像

从构建上下文把文件/目录复制进镜像:不自动解压、不支持远程 URL,是复制内容的首选指令。

多阶段构建组织镜像

多个 FROM 各自独立构建,用 COPY --from 把产物从构建阶段带到运行阶段;最终镜像只包含最后一个阶段的内容。

docker build -t 命名与多标签

给构建结果打名称与标签,可重复 -t 一次打多个;镜像引用格式为 [仓库地址/]命名空间/名称[:标签]。

docker push 推送镜像到仓库

把本地镜像推送到注册表:标签必须包含注册表地址(Docker Hub 用 用户名/仓库 形式),推送按层上传并返回内容摘要。

ENV 设置环境变量

定义镜像内持久环境变量:构建后续指令与容器运行时都可见,是配置镜像行为与固定时区/编码的常规手段。

CMD 默认启动命令

定义容器启动的默认命令或参数:用户 docker run 时另给命令会整体替换它;多条 CMD 只有最后一条生效。

层缓存原理与指令排序

每条指令按「文本 + 相关文件内容 + 父层」计算缓存键:命中就跳过执行;把低频变更放前面、高频变更放后面是加速构建的核心。

RUN 合并命令减少层体积

把安装、配置、清理合并到一条 RUN:层是增量存储,前一层删掉的文件仍占体积,安装与清理必须同层完成。

ENTRYPOINT 固定入口点

把镜像固定成某个可执行程序:docker run 追加的命令行参数会附加到 ENTRYPOINT 之后,适合做 CLI 型镜像。

.dockerignore 排除构建上下文

列出不发送给构建器的文件与目录:加快上下文传输、防止敏感文件被 COPY 带入、让缓存哈希更稳定。

docker rmi 删除本地镜像

按标签或镜像 ID 删除本地镜像;删除前先确认没有容器(含已停止容器)仍引用目标,被引用的镜像会拒绝删除。

docker login 登录镜像仓库

登录注册表以获取拉取与推送权限:密码通过 --password-stdin 传入可避免泄漏到命令历史,凭据默认写入 ~/.docker/config.json。

WORKDIR 设置工作目录

为后续 RUN/COPY/CMD/ENTRYPOINT 设定工作目录,目录不存在会自动创建;相对路径基于上一条 WORKDIR 解析。

ENTRYPOINT 与 CMD 组合用法

镜像参数模型的核心组合:ENTRYPOINT 固定程序、CMD 提供默认可覆盖的参数;理解覆盖规则才能让镜像按预期接收 run 参数。

docker build --build-arg 传递构建参数

把外部值传给 Dockerfile 里声明的 ARG:版本号、镜像变体、环境标识等;CI 里常与流水线变量组合。

docker image inspect 查看镜像元数据

查看镜像的完整结构:架构与操作系统、环境变量、入口点、暴露端口、层摘要与标签;配合 --format 可脚本化提取字段。

ARG 构建期变量与 --build-arg

声明只在构建期存在的变量,用 --build-arg 传入值或使用默认值;不会进入运行环境,适合版本号、下载地址等构建参数。

USER 指定运行用户

切换后续指令与容器启动进程的用户/组;配合提前创建的专用账号实现非 root 运行,是容器安全加固的基础动作。

HEALTHCHECK 容器健康检查

在镜像里内置健康检查:Docker 周期执行检查命令,按退出码标记 healthy/unhealthy,docker ps 的 STATUS 列会显示状态。

Debian/Ubuntu 镜像中的 apt 安装

apt 安装的常规写法:更新索引、安装、马上清理索引,全部放进同一条 RUN;--no-install-recommends 控制多余包。

镜像非 root 运行实践

容器内以非 root 身份运行应用:配合专用账号、文件属主与目录权限,让漏洞利用的影响面收敛在可管范围内。

构建期密钥:ARG 的风险与 secret 替代

用 ARG/ENV 携带 token 会进入构建历史与层缓存,存在泄漏风险;BuildKit 的 --secret 只在挂载点临时可见,不进层。

EXPOSE 声明端口

在镜像里声明服务监听的端口(文档性质):为使用者提示,配合 -P 随机映射或编排读取;它本身不会打开或发布端口。

RUN --mount=type=cache 构建缓存挂载

把包管理器的下载缓存挂载进构建步骤:缓存不写入镜像层,多次构建之间可复用,显著减少重复下载。

Node 镜像中的 npm 安装

Node 依赖安装用 npm ci 严格按 lockfile 安装,--omit=dev 控制生产依赖,安装后清理缓存减小镜像。

docker build -f 指定 Dockerfile

默认读取上下文根目录的 Dockerfile;多环境场景用 -f 指向子目录里的其他 Dockerfile 文件。

buildx build 构建与导出规则

buildx build 的产物去向由导出选项决定:--load 导入本地镜像库、--push 推仓库、两者不提则留在构建缓存里。

多架构镜像构建与推送

一条命令产出 amd64/arm64 等多平台镜像并推送仓库,拉取端按自身架构自动选择;CI 发布标准流程。

docker image prune 清理未使用镜像

清理未被任何容器使用的镜像:默认只删悬空(dangling)镜像,加 -a 删除所有未被引用镜像,可用时间过滤控制影响面。

COPY --chown 设置属主

复制时直接指定属主属组(可写数字 UID:GID),避免先复制再 RUN chown 造成的额外层与体积翻倍。

COPY --from 引用外部镜像文件

--from 不仅可引用本文件内的构建阶段,也能直接引用任意镜像(含远程),用来提取工具、配置或运行时组件。

Node 多阶段构建示例

Node 项目常见两段式:构建阶段装全量依赖编译前端,运行阶段只装生产依赖 + 拷贝构建产物。

RUN --mount=type=secret 构建期机密

在单条 RUN 期间临时挂载机密文件(npmrc、证书、token),用完即撤,不会写进镜像层或构建历史。

Python 镜像中的 pip 安装

Python 依赖安装的常规写法:先复制 requirements 再安装,默认用 --no-cache-dir 避免 wheel 缓存写进镜像。

docker build --no-cache 全量重建

跳过所有层缓存重新执行每条指令,用于排除缓存干扰;与 --pull 组合可同时刷新基础镜像。

docker history 查看镜像构建历史

按层列出镜像的构建历史(对应 Dockerfile 指令)与每层大小变化,用于确认层来源、定位异常层与审计镜像内容。

FROM 结合 ARG 参数化基础镜像

在 FROM 之前声明 ARG 并把基础镜像写成 ${变量},构建时用 --build-arg 切换镜像或版本,便于多环境复用同一份 Dockerfile。

RUN 两种形式的语义差异

shell 形式实际执行 /bin/sh -c "命令串",exec 形式直接执行可执行文件;默认 /bin/sh 往往不是 bash,语法差异要留心。

COPY 通配符与多源复制

一次复制多个文件或通配匹配,目标必须是目录;目录源复制的是其内容,不包含目录本身。

VOLUME 声明数据卷挂载点

把路径标记为数据卷:运行未显式挂载时自动创建匿名卷;声明后不要再在构建期写该目录内容,文档明确这些改动会被丢弃。

Go 多阶段构建示例

Go 静态编译的典型流水线:构建阶段带工具链,运行阶段用 distroless/scratch;配合交叉编译参数产出目标架构二进制。

构建上下文与传输

docker build 最后的路径就是构建上下文:目录内容(除 .dockerignore 排除项)会打包发送给构建器,COPY/ADD 只能引用其中文件。

Alpine 基础镜像的取舍

Alpine 以体积小著称,但使用 musl libc:依赖 glibc 的预编译产物、部分原生模块与 DNS 行为需要额外验证。

完整示例:前端构建 + Nginx 运行镜像

前端静态站的常见两段式 Dockerfile:Node 构建产物,Nginx 提供静态服务;把配置、健康检查与启动命令一并固化。

docker build --target 只建到指定阶段

多阶段构建里用 --target 停在某个阶段:适合调试中间产物、为 CI 单独构建测试阶段,或产出台账类中间镜像。

按平台构建与 --load 导出

指定构建目标平台(linux/amd64、linux/arm64 等);输出到本地镜像库的方式随构建驱动而不同。

buildx 构建器实例管理

buildx 是内置的构建 CLI 插件:默认 docker 驱动与 docker build 等价;用 docker-container 驱动可获得多平台与缓存导入导出能力。

用 registry:2 搭建私有镜像仓库

用官方 registry 镜像在服务器上运行轻量私有仓库:打标签、推送、验证目录接口,适合内网镜像分发与缓存。

FROM --platform 多架构构建选择

配合 BuildKit 的预定义变量选择构建与目标平台:编译阶段跑本机架构(BUILDPLATFORM),产出目标架构(TARGETPLATFORM)的二进制。

JSON 数组形式的写法细节

exec 形式必须用双引号 JSON 数组,单引号或拼接字符串都会解析失败;数组形式不做变量展开,参数原样传递。

基础镜像版本固定策略

把基础镜像固定到具体 patch 或摘要:node:20.18.0-alpine3.20 这类写法保证可复现,升级成为显式动作。

docker build --pull 刷新基础镜像

构建前尝试拉取基础镜像的新版本:tag 未变但内容更新(常见于 latest)时,只有加 --pull 才能拿到。

docker save 导出镜像为 tar

把镜像连同标签、层与历史记录导出为 tar 归档,用于离线分发与备份;可直接管道加 gzip 压缩后传输。

Dockerfile 语法声明 # syntax

文件首行的 # syntax=docker/dockerfile:1 声明使用哪个前端解析器版本,启用 heredoc、RUN --mount 等较新的构建语法。

ADD 与 COPY 的差异

ADD 在 COPY 基础上多两个能力:远程 URL 下载与本地 tar 自动解压;因为行为隐式,官方建议默认使用 COPY。

统一 UID/GID 数字避免权限错位

跨镜像与跨机器共享挂载目录时,权限按数字 UID 匹配:预先规划固定数字(如 10001)并全链路使用。

registry-mirrors 配置镜像加速

配置镜像加速器缓解 Docker Hub 拉取慢或受限的问题:加速只对 Docker Hub 生效,自建仓库与其他注册表不受影响。

COPY --link 独立层复制

让复制的文件生成独立层:源文件变化时只失效该层,不牵连前面指令的缓存,适合在 CI 里配合外部缓存提速。

COPY 源与目标的路径语义

源按构建上下文解析,目标相对 WORKDIR;目录源复制的是内容,文件源到不存在的目标路径会被当作重命名。

docker build --progress 构建日志形态

控制构建日志展示:tty(默认交互)与 plain(完整文本);CI 或无终端环境用 plain 更稳定。

构建缓存导出导入(registry 缓存)

把构建缓存推送到镜像仓库并在后续构建拉取,实现跨机器(CI)缓存复用;配合 buildx 使用。

docker images --format 定制输出

用 Go 模板自定义镜像列表字段(仓库、标签、ID、摘要、体积),适合脚本统计与报表;-q 只输出镜像 ID。

docker load 导入镜像归档

从 docker save 生成的 tar 载入镜像:-i 指定文件、-q 静默输出;还原后标签与镜像 ID 均与导出源一致。

LABEL 镜像元数据标签

为镜像添加 key=value 元数据,OCI 推荐 org.opencontainers.image.* 系列;取代已废弃的 MAINTAINER 指令。

STOPSIGNAL 声明停止信号

指定 docker stop 发送的停止信号(不写时默认 SIGTERM);nginx 等应用用 SIGQUIT 触发平滑关闭。

Dockerfile heredoc 多行写法

dockerfile 1.4+ 支持 heredoc:RUN <<EOF 内嵌多行脚本、COPY <<EOF 直接写配置文件,告别反斜杠续行。

distroless 运行镜像

只包含应用与其运行时依赖、没有包管理器与 shell 的镜像(Google 维护);减少工具面降低风险,也压缩体积。

ENV 与 RUN export 的区别

RUN 里的 export 只是当条命令的 shell 变量,下一条指令就消失;需要跨层、跨运行期的持久变量使用 ENV。

buildx imagetools 查看清单

读取仓库中镜像的多平台清单:列出各平台条目、digest 与大小,用于核对多架构发布结果。

镜像瘦身手段与验收

镜像体积优化的常见组合:换精简基础镜像、多阶段构建、安装与清理同层完成、.dockerignore 排除无关内容,并以体积对比验收。

SHELL 指令切换构建 shell

改变 shell 形式指令使用的默认 shell(Linux 默认 ["/bin/sh", "-c"]);需要 bash、pipefail 等特性时显式声明。

ARG 作用域与重新声明

FROM 之前声明的 ARG 只对 FROM 行生效;要在阶段内部使用同名值,必须在 FROM 之后重新写一条不带赋值的 ARG。

docker build 构建期网络模式

--network 选择构建容器网络:host 直接用宿主网络、none 完全断网、default 走 NAT;用于解决拉包网络问题或验证离线构建。

docker build --check 构建检查

构建前的静态检查(BuildKit Build Checks):识别 Dockerfile 里的反模式与错误并给出建议,例如使用 latest 基础镜像、缺少 WORKDIR 等。

悬空镜像 dangling 的成因与处理

悬空(dangling)镜像指失去全部标签引用的旧顶层镜像,常见于反复用同名标签重建的场景,<none>:<none> 是它的典型标识。

RUN --mount=type=ssh 转发 SSH 代理

构建阶段通过 SSH 代理访问私有 Git 仓库,密钥不落盘进镜像;构建命令加 --ssh default 启用。

scratch 空镜像构建

scratch 是保留字:从完全空的文件系统开始构建,只适合放静态链接的产物;CA 证书、时区等要自行复制。

ENTRYPOINT 结合 tini 做 PID1

在镜像里把 tini 作为入口:它负责信号转发与子进程回收,与 docker run --init 等效但写进镜像、随处生效。

docker build -q 安静模式

只输出最终镜像 ID、不打印构建过程,适合脚本里取 ID 或降低 CI 日志量。

docker history 定位体积大头

把每层大小按数值排序,快速找出版本体积的主要贡献层;配合镜像总大小对比可以验证瘦身改动是否真正生效。

insecure-registries 配置(内网 HTTP 仓库)

让 Docker 客户端信任 HTTP 或无证书的内部注册表:写入 daemon.json 的 insecure-registries 并重启守护进程后生效。

buildx bake 多目标构建

用一份 bake 文件(HCL/JSON)声明多个构建目标与公共配置,一条命令并行构建多镜像,适合多服务仓库。

内联缓存 BUILDKIT_INLINE_CACHE

把缓存元数据写进镜像本身:推送的镜像即缓存来源,后续构建用 --cache-from 指向同一镜像即可复用层。

docker push --all-tags 批量推送标签

把同一仓库下的多个本地标签一次性推送到远端,适合 CI 同时发布精确版本号、次版本号与 latest 的组合。

按 digest 引用镜像内容

digest 是镜像内容摘要:标签可以移动,digest 固定不变;部署引用 digest 可保证每次拿到完全相同的内容。

ONBUILD 延迟触发指令

把指令登记为触发器,在下游镜像 FROM 本镜像时自动执行;做基础镜像时能统一注入构建步骤,但行为对下游是隐式的。

从 stdin 提供 Dockerfile 或上下文

构建输入可以来自标准输入:-f- 从管道读 Dockerfile,上下文也可以传 tar 流,适合生成式构建与远程流水线。

~/.docker/config.json 认证与客户端配置

Docker 客户端的个人配置文件:保存 auths 认证条目、credHelpers、proxies 等;列出 auths 键名即可自查登录过哪些仓库。

docker manifest inspect 查看多架构清单

查看镜像在注册表中的多架构清单:列出各平台的子摘要、操作系统与架构变体,用于确认 arm64/amd64 支持情况。

docker logout 退出仓库登录

退出注册表并删除本地保存的对应认证信息:可指定注册表地址,不指定时默认退出 Docker Hub;退出只清本地凭据。

镜像标签规范与回滚策略

标签管理的实践建议:精确版本标签不可变、latest 只做便捷入口、附提交号标签用于回溯,回滚不靠猜旧包。

Docker Hub 拉取限流的识别与缓解

Docker Hub 对匿名拉取有限流:触发时报 toomanyrequests;登录账号、使用加速器或私有仓库缓存镜像可缓解。

docker save 一次导出多个镜像

把多个镜像打包进同一个归档:适合基础镜像加应用镜像的离线交付,目标机一次 load 即可得到全部标签。

docker buildx du 查看构建缓存占用

统计 BuildKit 构建缓存的磁盘占用,并按保留时长或全量清理;构建机磁盘水位管理用它替代手工删目录。

镜像 OCI 标签与元数据

通过构建参数或 Dockerfile 的 LABEL 写入 OCI 标准元数据(版本、来源、修订号等),便于资产盘点与供应链信息记录。

离线环境镜像搬运流程

隔离网络搬运镜像的标准做法:save 打包并压缩、记录校验值、介质传输、目标机校验后 load,全程不依赖外网仓库。

save/load 与 export/import 的区别

save/load 面向镜像、保留层与标签;export/import 面向容器、只导出合并后的文件系统。两组命令对象与产物不同,不能混用。

docker search 检索 Docker Hub 镜像

在 Docker Hub 按关键字检索镜像:列出仓库名、描述、星标数与官方标记,用于选型前的快速初筛。

buildx 输出到本地目录或 OCI 归档

buildx 可以把构建结果直接输出为本地文件或 OCI layout:拿编译产物、生成离线归档、交给扫描工具,不必先进本地镜像库。

构建溯源声明与 SBOM 附加信息

buildx 支持随镜像推送构建溯源(provenance)与依赖清单(SBOM)声明,用于供应链审计与镜像来源追踪。

网络与存储

网络模式、端口映射、数据卷与绑定挂载

docker run -v 挂载数据卷与宿主目录

最常用的挂载写法:-v 源:目标[:选项],源是名称时用卷、是路径时用绑定挂载;冒号后半段为容器内路径。

docker run -p 端口映射基础语法

把宿主机端口映射到容器端口:-p 宿主:容器 是常用形式,默认监听全部地址;容器间同网络直接通信时不需要映射。

docker network create 创建自定义网络

创建用户自定义 bridge 网络并指定网段、网关或 internal 隔离属性;容器接入自定义网络后才能用名称互相解析。

docker run --network 选择网络

启动容器时指定接入的网络:可选预置网络、自定义网络、host/none,或直接复用另一个容器的网络命名空间。

docker volume create 创建数据卷

创建由 Docker 管理的命名卷:卷数据落在宿主机 Docker 数据目录下,由守护进程维护,适合数据库、上传目录等持久化场景。

docker network ls 列出网络

列出主机上的 Docker 网络(bridge/host/none 三个预置网络加用户自建网络),确认容器该接入哪个网络时先看这张表。

host 模式:共享宿主机网络栈

容器直接使用宿主机的网络命名空间:监听端口即宿主机端口,无需 -p 映射,性能路径与宿主进程一致,但端口冲突面也相同。

docker network inspect 查看网络详情

查看网络驱动、子网与网关、接入的容器列表及各自 IP;排查容器间连通性时用它确认双方是否在同一网络。

bridge 模式:默认桥接网络

容器默认接入的桥接网络(docker0,通常 172.17.0.0/16):容器经 NAT 访问外部,默认桥接上容器之间只能用 IP 互访。

卷(volume)与绑定挂载(bind)的选择

卷由 Docker 管理,便于备份迁移与跨平台;绑定挂载直接映射宿主路径,适合与宿主工具链协作。选型看数据归属与运维方式。

容器内 DNS 解析机制

自定义网络上的容器通过内嵌 DNS(127.0.0.11)解析同网容器名;默认 bridge 网络没有该能力,只能靠 IP 或 /etc/hosts。

绑定挂载权限与属主问题

宿主目录权限与容器内进程 UID 不匹配是最常见的挂载故障:容器内写文件失败、宿主看到 root 属主文件,都源于 UID 映射。

docker run --mount 显式挂载写法

以 key=value 形式显式声明挂载类型与源:type=bind/volume/tmpfs 一目了然,源不存在时的行为也与 -v 不同。

docker volume ls 列出卷

列出所有卷及驱动:确认卷命名、排查遗留匿名卷、按名称或标签检索目标卷。

绑定指定 IP 发布端口(含仅本机)

用 -p IP:宿主端口:容器端口 限定监听地址:绑定 127.0.0.1 时只有本机能访问,适合数据库与内部管理口。

EXPOSE 与 -p 的区别

EXPOSE 只是镜像的端口声明(文档 + -P 依据),不产生宿主机监听;-p 才是真正建立映射。两者常被混为一谈。

docker volume rm / prune 清理卷

删除不再需要的卷:被容器占用时删除会被拒绝;prune 批量清理未使用卷,默认只清匿名卷,-a 扩展到具名卷(Docker 23+)。

docker network connect 接入与断开网络

把运行中的容器接入另一个网络或从中断开:常用于给容器临时接入调试网络,或让同一容器同时处于多个网络。

docker volume inspect 查看卷详情

查看卷的挂载点、驱动、选项与标签:卷在宿主机的实际位置(Mountpoint)在这里,备份与容量核查都从这里开始。

数据卷的打包备份与恢复

用临时容器把卷内容打成 tar 到宿主目录:不依赖业务容器停机状态,恢复时反向解包;数据库类建议先做逻辑导出再打包。

docker run --add-host 注入 hosts 记录

把额外的 名称→IP 映射写进容器 /etc/hosts:适合指向宿主机服务或外部固定地址,host-gateway 是代表宿主的特殊值。

Docker 与 iptables 规则的关系

Docker 通过 iptables 的 DOCKER 链实现端口发布与出网 NAT;DOCKER-USER 链是留给使用者的过滤入口,排端口不通先看这两条链。

存储驱动与运行时信息核对

用 docker info 核对存储驱动、根目录、容器运行时与数据空间基础状态:环境异常时这是排查的第一屏信息。

overlay 模式:跨主机容器网络

overlay 网络基于 VXLAN 把多台主机的容器接入同一虚拟网络,是 Swarm 集群服务间通信的基础;单机场景一般用不上。

自定义子网 --subnet 规划与冲突排查

为自定义网络指定子网与网关,避开办公网/VPN 网段;发生地址冲突时容器访问内网服务会异常或直接不通。

单文件绑定挂载的注意事项

把宿主上的单个文件挂进容器(如配置文件):文件必须已存在,且宿主侧编辑方式会影响到容器能否看到更新。

overlay2 存储驱动与数据目录

多数 Linux 上 Docker 使用 overlay2 驱动:镜像层与容器读写层落在 /var/lib/docker/overlay2,容器里改文件不污染镜像层。

网络别名 --network-alias 与容器名解析

给容器在指定网络上追加可解析的名称:其他容器用别名访问即可,适合在副本间做无差别调用的场景。

复用其他容器网络栈排查

通过 --network container:目标 让工具容器共享目标容器的网络命名空间,用它的视角检查端口、连通性与抓包。

匿名卷的由来与清理

匿名卷是容器创建时自动生成、名字为随机哈希的卷:Dockerfile 的 VOLUME 指令与 -v 不带源路径都会产生,容易在磁盘上悄悄堆积。

Docker Desktop 文件共享与挂载注意点

桌面版 Docker 运行在虚拟机中,绑定挂载需要宿主的共享路径配置:项目放在共享目录内、数据库负载用卷,能避开多数性能与权限问题。

docker network rm 删除与清理网络

删除不再使用的自定义网络;有容器(含已停止容器)仍接入时删除会被拒绝,批量清理用 network prune。

internal 网络:无外网出口的隔离网络

创建时加 --internal 的网络没有默认路由到外网:容器之间可互通,访问互联网被阻断,常用于数据库等不接触外网的服务。

绑定挂载路径写法与常见坑

挂载源写法的歧义来源:不带斜杠的名称会被当成卷名,相对路径与 Windows 盘符写法容易出错,先明确表达绝对路径再挂载。

多容器共享同一数据卷

把同一个具名卷挂载进多个容器:常用于构建容器写静态文件、运行容器提供访问,或Sidecar 与主容器共享数据目录。

macvlan 模式:容器直连物理网段

给容器分配物理网络中的独立 MAC 与 IP,使容器像同网段物理机一样被外部直接访问;需要指定父接口与网段。

容器 DNS 参数 --dns / --dns-search 配置

自定义容器的 DNS 上游服务器与搜索域:隧道、内网域名环境下需要显式指定 DNS,否则新环境里域名解析会异常。

UDP 端口与多协议映射

默认映射按 TCP 处理:UDP 服务要在端口后加 /udp,同一端口同时提供两种协议时写两条 -p。

空卷首次挂载的初始化行为

具名卷首次挂载到有内容的镜像目录时,Docker 会把镜像目录内容复制进空卷;已有数据的卷不会被覆盖,绑定挂载则完全不复制。

卷与挂载的只读选项

给挂载加只读后缀:配置、静态资源等不需要写入的目录用 :ro 或 readonly,容器内进程即使被攻破也难以篡改内容。

自定义网络内指定静态 IP

在划分了子网的网络内给容器指定固定地址:--ip 需落在网络子网内且未被占用,仅用户自定义网络支持。

随机端口 -P 与自动分配

用 -P 把镜像 EXPOSE 的端口全部随机映射到宿主,或用 -p 0:端口 / 只写容器端口的方式让 Docker 分配宿主端口;结果用 docker port 查询。

卷占用统计与使用方反查

统计卷实际占用并反查哪些容器在用:docker system df -v 给出卷清单,容量精确值直接对 Mountpoint 做 du。

tmpfs 挂载:内存临时文件系统

把目录挂成内存态文件系统:读写快、停止即消失、内容不落盘;适合临时缓存、敏感中间数据与高 IO 小文件场景。

none 模式:无网络接口

容器只有回环接口,没有任何对外网络:适合纯计算、离线批处理,或需要手工配置网络命名空间的场景。

local 卷驱动与自定义挂载选项

local 驱动通过 --opt type/device/o 组合把宿主目录或其他文件系统包装成卷:可以让卷落在指定磁盘路径上而不移动 Docker 数据目录。

网络 MTU 问题与调整

Docker 网络默认 MTU 1500:叠加 VXLAN、VPN 或特殊链路时有效 MTU 变小,大包被丢弃的典型表现是小请求正常、大响应卡死。

NFS 共享存储作为数据卷

把远端 NFS 目录挂成 Docker 卷:多主机共享同一份数据,适合无状态服务读取共享配置或集群化文件存储。

ipvlan 模式:共享 MAC 的 L2/L3 接入

ipvlan 让容器共享父接口 MAC、按 IP 区分流量,相比 macvlan 减少交换机 MAC 表压力;默认 l2 模式,l3 需要额外路由配置。

docker run --volumes-from 复用容器卷

新容器直接继承另一个容器声明的全部卷(含匿名卷):不需要知道卷名即可拿到同一份数据,也常用于备份容器。

遗留的 --link 用法与其局限

--link 是早期给默认 bridge 容器提供通信与 hosts 记录的手段,自定义网络出现后已不作为推荐方式,新部署应避免继续使用。

卷标签与按标签管理

给卷打标签并在列表、清理时按标签过滤:用标签区分项目、环境与保留策略,批量运维时目标更清晰。

Compose 编排

compose 文件结构与常用操作

docker compose up 拉起服务

按 compose 文件创建并启动全部服务:-d 后台运行、--build 先重建镜像、--force-recreate 强制重建容器,是最常用的入口命令。

Docker Compose 概览与 v1/v2 差异

Compose 用一份 YAML 描述多容器应用并统一拉起:现代用法是 docker compose 子命令(v2 插件),旧的 docker-compose 独立二进制属 v1 且已停止维护。

compose 文件顶层结构

一份 compose.yaml 通常包含 services、networks、volumes 三个顶层节:定义服务、声明网络与具名卷,再按需加 secrets、configs、include。

compose ports 字段写法

端口映射的短语法与长语法:可为端口指定绑定 IP、协议与发布模式;与 docker run -p 的规则一致,写错则服务只在内网可达。

docker compose logs 聚合日志

按服务聚合容器日志:-f 持续跟踪、--tail 限行数、-t 加时间戳,排障时配合服务名过滤快速定位异常来源。

services 定义与容器命名规则

services 是 compose 文件的主体:每个键是一个服务名,容器默认命名为 项目_服务_序号,服务名也是 exec/logs 等命令的定位参数。

compose environment 字段两种形式

为服务设置环境变量:列表形式(含仅写键名从宿主透传)与映射形式;它优先于 env_file 中的同名变量。

docker compose ps 查看服务状态

列出项目内服务容器的状态、端口与健康情况:-a 含已停止服务,--format 定制输出,是核对部署结果的第一条命令。

compose volumes 字段写法

服务级卷挂载:短语法写 源:目标[:ro],长语法用 type/source/target 显式声明;相对路径按项目目录解析。

compose depends_on 启动依赖

声明服务启动顺序:短语法只保证容器启动先后,长语法配 condition: service_healthy 才能真正等待依赖就绪。

docker compose down 停止并清理

停止并删除本项目容器与网络:默认保留具名卷;-v 连卷一起删,--rmi 按需删除镜像,属清理类操作先看清楚参数。

image 与 build 字段的配合

image 指定镜像名(拉取或命名构建产物),build 指定构建上下文;两者共存时构建出的镜像以 image 命名,方便直接 push。

compose restart 策略字段

为服务设置自动重启策略:no/always/on-failure/unless-stopped,生产常配 unless-stopped 或 on-failure,并注意 YAML 引号。

docker compose exec 进入服务容器

在运行中的服务容器里执行命令:进 shell、跑调试脚本、查看文件;默认分配 TTY,可指定用户与工作目录。

docker compose config 校验与展开

渲染并输出最终生效的 compose 配置:校验语法、展开变量、合并多文件结果,部署前跑一遍能提前发现大部分配置错误。

compose healthcheck 字段

在 compose 文件里给服务定义健康检查:test 命令、间隔、超时、重试与启动宽限期;健康状态也是 up --wait 与依赖等待的依据。

docker compose run 一次性任务

为服务启动一次性容器跑指定命令(如数据库迁移、初始化脚本):默认不发布服务端口,可用 --rm 用完即删。

compose networks 字段与网络别名

服务级 networks 决定接入哪些网络:同一项目服务默认进 <项目名>_default 网络按服务名互访,可用 aliases 追加解析名。

compose 顶层 volumes 与驱动配置

在顶层声明具名卷并配置驱动与标签:数据库等状态数据用它统一管理,external: true 引用项目外已存在的卷。

项目级 .env 文件与变量来源优先级

项目目录下的 .env 供 Compose 文件做变量插值:宿主环境变量优先于 .env,可用 --env-file 指定其他文件。

compose 资源限制字段

在 compose 文件里限制服务资源:deploy.resources.limits 的 cpus/memory 会被 docker compose 应用;旧字段 cpus/mem_limit 仍可用但不推荐继续扩展。

docker compose build 构建服务镜像

按 compose 文件里 build 节构建服务镜像:可指定服务、--no-cache 全量重建、--pull 拉取新基础镜像、透传 build-arg。

compose 多文件合并与 override 约定

默认文件与覆盖文件自动叠加:docker-compose.override.yml 在开发习惯上用于本地差异,生产用显式 -f 列表组合并核对结果。

compose start/stop/restart/pause 语义

这组命令只做启停不动配置:stop 停容器、start 启已建容器、restart 重启进程、pause/unpause 冻结与恢复,配置变更要用 up。

compose env_file 字段

把变量文件注入容器:适合为数据库连接等成组配置集中取值,可指定多个文件,后面的文件优先级更高。

compose command 与 entrypoint 覆盖

运行时覆盖镜像的启动命令:command 替换 CMD,entrypoint 替换 ENTRYPOINT;清空入口点用 entrypoint: []。

compose logging 日志驱动与截断

为服务配置日志驱动与选项:限制单文件大小与保留数量,避免长跑服务的日志文件把磁盘占满。

docker compose up --wait 等待健康

up 加 --wait 会等到所有服务达到 running/healthy 才返回:适合 CI 与发布脚本,避免服务没就绪就开始后续步骤。

compose 变量插值语法与转义

文件值里的 ${VAR} 在解析阶段被替换:支持 :- 默认值与 :? 必填校验,字面量美元符要写 $$。

compose 文件的 version 字段已废弃

早期教程里的 version: "3.8" 等字段在 Compose 规范中已经废弃:现代写法直接省略,出现时会在命令输出里收到 obsolete 警告。

docker compose pull / push 镜像流转

按 compose 文件批量拉取或推送服务镜像:部署前 pull 保证拿到远端最新镜像,发布后 push 把本地构建推回仓库。

compose 扩容 --scale 与副本数

把服务扩到多个副本:up --scale 服务=N 临时扩容,deploy.replicas 固化副本数;固定宿主端口与固定容器名会阻止扩容。

compose 项目名与资源命名

项目名决定容器/网络/卷的前缀:默认取目录名,可用 -p、COMPOSE_PROJECT_NAME 或顶层 name 字段覆盖;改名前先评估资源重建影响。

docker-compose v1 到 compose v2 对照

从 v1 迁移到 v2 主要是命令形态变化:独立二进制换成 docker compose 子命令,多数参数名保持一致,行为差异点集中在构建与配置解析。

compose profiles 分组启动

给服务打 profiles 标签实现按需启动:up 默认只起无 profile 的服务,需要时用 --profile 或 COMPOSE_PROFILES 激活整组服务。

compose labels 与自动标签

为服务容器写自定义标签,同时每个容器自带 compose 自动标签(项目、服务、配置哈希等),可用来做筛选与审计。

compose 默认文件名与查找顺序

Compose 默认按固定顺序查找编排文件:compose.yaml / compose.yml 优先于 docker-compose.yml / docker-compose.yaml;同目录存在多个候选会直接报错。

compose container_name 固定容器名

为服务指定固定容器名替代默认的 项目_服务_序号 命名:方便外部脚本引用,但会阻止该服务使用 --scale 扩容。

docker compose ls 列出项目

列出本机已有 Compose 项目及其状态与使用的文件:接手环境或清理资源前,先用它盘点有哪些项目在跑。

compose 停服信号与宽限期

控制停容器时发送的信号与等待时长:配置 stop_signal 与 stop_grace_period,让应用有机会优雅退出、完成在途请求。

compose secrets 注入敏感文件

把敏感内容以文件形式注入容器:适用本地 compose 的文件型 secret 挂载在 /run/secrets 下,避免把口令写进环境变量与镜像。

compose 项目资源清理核对

down 之后核对残留:用项目标签反查容器、网络、卷、镜像,确认没有未清理资源,避免端口与磁盘被长期占用。

docker compose port 查询端口映射

查看某个服务端口映射到宿主机后的实际地址与端口:随机端口或端口冲突排查时用它确认最终结果。

docker compose images 列出服务镜像

列出项目各服务容器实际使用的镜像与大小:核对版本是否与预期一致、排查镜像错用与体积异常时很方便。

compose shm_size 调整共享内存

调整容器 /dev/shm 大小:默认为 64MB,浏览器内核、PostgreSQL 并行查询等场景需要调大,否则会因共享内存不足异常退出。

compose extra_hosts 注入 hosts 记录

在 compose 文件里为服务追加 /etc/hosts 记录:常用 host-gateway 指向宿主机,或把内部系统域名解析到固定地址。

compose 网络的 internal 与 external

网络声明上的两个特殊开关:internal 让该网络无外网出口;external 复用项目外已存在的网络,不进项目生命周期管理。

docker compose cp 与容器互拷文件

在服务容器与宿主机之间复制文件:取日志、放配置文件、导出数据都用它,支持指定服务与容器内路径。

docker compose watch 开发热更新

监视源码变化并按规则同步进容器或重建:开发期替代手工反复 up,配合 develop.watch 配置 path 与 action 更精细。

compose init 字段启用 init 进程

init: true 让容器 PID 1 使用 init 进程转发信号并回收僵尸进程:适合直接跑脚本类、不停 fork 子进程的应用。

compose ulimits 调整进程资源限制

设置容器内进程的资源上限:no file 描述符、进程数等。高并发服务与运行大量文件的场景需要显式放宽默认值。

compose configs 挂载配置文件

把配置文件按名声明并注入服务:与 secrets 类似的声明方式,适合 nginx 配置、应用参数文件等只读内容的分发。

compose config --hash 检测配置变化

输出服务的配置哈希:对比两次哈希即可判断服务定义是否变化,适合在发布脚本里决定哪些服务需要重建。

compose include 复用其他文件

较新的 Compose v2 支持顶层 include:把网络、监控等公共定义拆成独立文件后引入,多个项目可以共享同一份基础编排。

docker compose top 查看服务进程

展示项目内服务容器中的进程列表(PID、命令):确认应用是否真正拉起、有没有多进程或异常守护进程。

资源与安全

CPU/内存限制、权限收敛与安全实践

docker run --memory 内存硬限制

限制容器可用的物理内存:达到硬限触发 OOM 终止;配合 --memory-reservation 设置软限,是资源限制里应优先设置的项。

docker run --cpus 限制 CPU

限制容器可使用的 CPU 时间上限:--cpus=1.5 表示可用一个半核的时间片,多核机器上按秒分配,适合防单容器吃满整机。

容器内使用非 root 用户运行

镜像尽量以内置非 root 用户启动(USER 指令或 --user 指定):缩小应用被攻破后可触达的权限面,是容器安全的基础动作。

用 docker stats 验证限额生效

对照限制值与实时用量:MEM LIMIT 列显示容器内存上限、PIDS 列显示进程数、CPU% 反映配额占用,是按压测试后的验收工具。

容器 OOM 的识别与处理

容器内存超限被内核终止时:退出码 137、inspect 的 OOMKilled 为 true;处理顺序是先确认限制值与峰值,再决定调限额或降内存。

daemon.json 常用加固项

以配置基线加固守护进程:打开 live-restore 与 no-new-privileges、统一日志轮转、按需关闭默认桥接互通,改完做 JSON 校验再重启。

容器默认没有资源限制

容器默认可使用宿主全部 CPU 与内存:不显式限制时,单个异常进程就可能拖垮整机,上线前应按服务画像设置限制基线。

--privileged 的影响与替代方案

特权容器获得近乎宿主 root 的能力面(全部能力、设备访问、关闭默认隔离策略):仅在明确受控场景使用,优先按需放权替代。

内核能力收敛 --cap-drop / --cap-add

默认容器持有约十余项 Linux capabilities:用 --cap-drop=ALL 清空后按需 --cap-add 单个能力,比 --privileged 精确得多。

加固运行基线组合命令

把常用加固项组合成一个起点:非 root 用户 + 只读根文件系统 + tmpfs 可写目录 + 丢弃全部能力 + no-new-privileges + 资源与 PID 上限。

docker update 动态调整资源限制

不重建容器调整部分资源限制:CPU、内存、PID 上限等可在运行中更新,适合应急收紧或放宽,但要评估应用是否感知不到。

挂载 docker.sock 的风险与控制

把 /var/run/docker.sock 挂进容器等于把守护进程控制权交给它:可创建特权容器并访问宿主资源,属高危配置,需严格限定场景。

环境变量传密钥的泄露面

环境变量不是密钥保管箱:docker inspect、宿主 /proc/<pid>/environ 与异常转储都可能带出全部 Env,密码与令牌优先用文件挂载或 secrets 机制。

docker run --pids-limit 限制进程数

限制容器内可创建的进程/线程总数:防止单个服务异常 fork 或线程失控把宿主调度资源耗尽。

seccomp 系统调用过滤

seccomp 按白名单限制容器可调用的系统调用:Docker 默认 profile 已挡下部分高风险调用,可按业务定制或临时关闭(不推荐)。

批量审计高危容器配置

一行 inspect 格式化把运行中容器的高危开关拉成清单:特权模式、宿主网络、宿主 PID、附加能力与 socket 挂载,先看见再收敛。

inspect 核对容器资源限额

从 HostConfig 读取资源相关配置:内存、CPU、PID、设备与安全选项都在这里,审计与容差核对的第一手数据。

只读根文件系统 --read-only

把容器根文件系统挂成只读:进程无法改写自身文件,缩小篡改与持久化空间;需要写入的目录用 tmpfs 或卷单独放开。

docker run --ulimit 设置进程资源上限

设置容器内资源上限:文件句柄、进程数、核心转储等,软硬限制用 软:硬 格式;取值 -1 表示不限制。

按 digest 固定部署镜像

tag 可以移动、digest 不会:部署与回滚写成 image@sha256:… 才能保证版本指向确定内容,配合镜像仓库的不变标签策略使用。

禁止权限提升 no-new-privileges

设置 no-new-privileges 后,容器内进程无法通过 setuid/setgid 程序获得更高权限:阻断借 SUID 二进制提权的常见路径。

远程 API 暴露与 TLS 保护

守护进程监听 TCP 时务必启用 TLS 且不裸露 2375:该端口无认证,任何人可控制 Docker;对外只保留加密的 2376 并配合证书校验。

docker run --cap-add 精细补能力

只补必要能力:先 --cap-drop=ALL 再按需 --cap-add(如 NET_BIND_SERVICE),比保留默认能力集再用特权收敛得多。

docker scout 官方漏洞扫描

docker scout 基于官方镜像安全数据:quickview 看摘要、cves 列漏洞与修复版本、recommendations 给基础镜像升级建议,适合接在构建与发布前。

docker run --cpuset-cpus 绑定 CPU 核

把容器固定到指定 CPU 核上运行:用于隔离敏感服务的调度抖动,或把实时性要求高的负载与噪声邻居错开。

用户命名空间映射 userns-remap

启用 userns-remap 后容器内 root 映射为宿主上的非特权用户:即使容器内以 root 运行,逃逸到宿主也不是真 root。

docker 组成员等效 root 的审计

加入 docker 组等于获得宿主等效权限:组成员可启动特权容器挂载宿主目录;用 getent 定期审计名单,能不用就不用。

Trivy 镜像漏洞扫描

Trivy 开源扫描器:一条命令输出系统包与应用依赖漏洞,支持严重级别过滤、忽略不可修复项与失败退出码,便于接 CI 门禁。

docker run --cpu-shares 相对权重

设置 CPU 争抢时的相对份额(默认 1024):仅在 CPU 饱和时按比例分配,是软性优先级而不是上限。

rootless 模式运行 Docker

rootless 模式让整个守护进程以普通用户身份运行:容器与运行时默认不具备宿主 root 权限,适合单机开发与多租户实验环境。

docker run --memory-reservation 内存软限制

内存软限制:设置 --memory-reservation 后容器日常可弹性使用内存,只有在宿主内存紧张时才被压回该水位,适合给带缓存的服务留缓冲。

确认 cgroup 版本与驱动

cgroup v1 与 v2 在内存、IO、swap 相关行为上不同:限制类问题先看 Cgroup Version 与 CgroupDriver,再谈参数。

AppArmor 与容器配置校验

Ubuntu/Debian 上 Docker 默认加载 docker-default 的 AppArmor 策略:限制文件与能力访问,可自定义策略或按容器覆盖。

docker run --shm-size 调整共享内存

设置容器 /dev/shm 大小(默认 64m):浏览器渲染、数据库与多进程服务常因共享内存不足失败,可显式放大并纳入内存预算。

docker run --memory-swap 交换空间控制

控制内存加交换的总量:--memory-swap 等于 --memory 时禁用交换;不设置时默认允许使用与内存等量的交换。

--pid=host 等宿主命名空间审计

共享宿主命名空间的容器不再是隔离单元:--pid=host 可看到并影响宿主进程,--ipc=host、--uts=host 同理,默认应保持各命名空间独立。

用 socket 代理收敛 Docker API

给 CI 或自动化收敛权限:socket 代理只放行必要的 API 端点(如容器只读查询),默认拒绝写操作,避免直接挂载 docker.sock。

Falco 运行时行为检测

运行时检测补上静态扫描看不到的行为面:Falco 通过 eBPF 或内核模块观测系统调用,按规则对容器内异常行为(起交互 shell、写敏感路径、提权迹象)告警。

docker run --oom-score-adj 调整 OOM 优先级

调整容器进程被 OOM killer 选中的倾向(-1000 到 1000):让核心容器比批量任务更不容易被杀,但它不阻止内存超用本身。

cosign 镜像签名验证

签名验证作为拉取前置检查:用 cosign 校验镜像签名与签发身份,确认制品来源与完整性,校验通过后再按 digest 拉取使用。

docker run --cpu-period / --cpu-quota 精确配额

用周期与配额组合描述 CPU 上限:周期默认 100000 微秒,quota 50000 表示每周期使用一半核时间,是 --cpus 的底层表达。

容器 swap 倾向 --memory-swappiness

控制容器匿名页换出倾向(0-100,越低越少用 swap):cgroup v2 环境该参数不生效,内存策略要以 --memory 与宿主 swap 配置为主。

docker run --device 最小设备授权

按最小必要原则把宿主设备节点映射进容器:默认权限 rwm,只读需求显式写 :r;动态设备用 --device-cgroup-rule 控制范围。

Docker Bench 基线自查

Docker Bench for Security 按 CIS 基线做主机级自查:覆盖宿主配置、daemon、容器与镜像的检查项,输出 pass/warn/info 与整改建议。

docker run --blkio-weight 块 IO 权重

按权重分配块设备带宽(10-1000):多个容器争抢同一块盘时按比例分配读写机会,属于竞争占比而不是绝对限速。

docker run --sysctl 内核参数(白名单)

在容器命名空间内调整内核参数:只允许 Docker 白名单中的命名空间化参数,未列入的会被拒绝,除非容器以特权运行。

容器内 sudo 的检查与清理

容器内装 sudo 把提权面搬进了镜像:任何能执行 sudo 的应用漏洞都可能放大为容器 root;除非场景明确,基础镜像里就不该带。

SELinux 卷标签 :z 与 :Z

在 SELinux 主机上修正卷标签::z 标记共享、:Z 标记私有并重打标签;标签不对时容器读写被拒并留下 avc denied 记录。

凭据助手 credential helper

把登录凭据交给系统密钥库:配置 credsStore 后 docker login 的密码不再明文进 ~/.docker/config.json,团队机器与 CI 都值得统一。

docker run --cgroup-parent 指定父 cgroup

把容器放进指定 cgroup(如 systemd slice 或自定义层级):与宿主既有的资源治理体系对接,便于统一限额与统计。

容器排障

启动失败、网络不通、磁盘占用与日志定位

容器退出码速查总览

退出码是排障第一线索:0 正常结束、1 应用错误、125/126/127 是 Docker 层失败、128+N 表示被信号 N 终止(如 137=128+9),255 多与应用自身约定有关。

退出码 137:SIGKILL 强杀

137 = 128+9,进程被 SIGKILL 杀掉:要么撞到内存上限被 OOM killer 处理,要么 docker stop 宽限期结束被强杀,要么有人 docker kill。

容器起不来的通用排查路径

五步法:看状态与退出码 → 看日志尾部 → 看 inspect 的 Error 字段 → 用同镜像交互复现 → 再回到 Dockerfile/参数层面修正。

Cannot connect to the Docker daemon 排查

报错指向守护进程不可达:按顺序查服务状态、套接字文件、context 指向与 DOCKER_HOST 环境变量,四步内可定位。

端口冲突 address already in use

绑定已占用端口时 docker run 报 bind: address already in use(或 userland proxy 报错):先找谁占了端口——其他容器或宿主进程。

no space left on device 定位

写不进去分空间与 inode 两类:df -h 看容量、df -i 看 inode;再用 du 从 /var/lib/docker 逐层下钻定位到日志、层或卷。

确认容器是否被 OOM 杀死

OOMKilled 字段是判定关键:State.OOMKilled=true 表示容器内存超限被内核杀掉,退出码通常为 137,但 137 不等于必然 OOM。

清理顺序与 prune 组合

按影响从小到大清理:容器 prune(已停)→ 镜像 prune(悬空/未用)→ builder prune(构建缓存)→ volume prune(未挂载卷,数据不可恢复)。

容器秒退:主进程结束

容器生命周期跟随主进程:起 bash 不带 -dit、脚本执行完没有前台进程、应用启动即失败,都会立即退出。

容器日志占盘与轮转

json-file 默认不轮转:容器持续输出会撑大 /var/lib/docker/containers 下的日志文件,用 max-size/max-file 控制或改 daemon 默认。

permission denied 访问 docker.sock

报错文本是 Got permission denied while trying to connect ... docker.sock:当前用户不在 docker 组或未授权访问该套接字;按最小授权处理。

重启循环的原因定位

三段证据拼图:inspect 的 RestartCount/ExitCode/OOMKilled、events 的 restart/die 流、logs 尾部错误;循环多为崩溃、健康检查失败或依赖未就绪。

容器内域名解析失败排查

Temporary failure in name resolution 类报错的排查链:容器 resolv.conf → --dns 显式指定 → daemon 级 DNS 配置 → 自定义网络的内嵌 DNS(127.0.0.11)。

unhealthy 健康检查失败定位

unhealthy 是健康检查命令失败:读 inspect 的 Health.Log 看最近几次输出与退出码,手动复现同一命令,再核对 start_period/interval/timeout。

发布的端口外部访问不通

宿主本机通、外部不通的三层排查:发布绑定地址(127.0.0.1)→ 宿主防火墙(含 DOCKER-USER 链)→ 云安全组。

docker system df 空间分析

镜像、容器可写层、卷、构建缓存四类分开看占用:docker system df 给总量,-v 展开到具体对象,先分清是谁占的空间。

退出码 143:SIGTERM 终止

143 = 128+15,进程收到 SIGTERM:docker stop 的正常信号就是 SIGTERM,应用没做捕获时以 143 退出属于预期现象。

pull access denied / 需要登录

pull access denied, repository does not exist or may require 'docker login':仓库或镜像名写错、私有仓库未登录、权限不足,三者报错文本相同要逐一排除。

stop 慢与超时强杀(-t 宽限期)

docker stop 先发 SIGTERM,等待宽限期(默认 10 秒)后发 SIGKILL;应用不处理信号或收尾慢时,数据可能来不及落盘,表现为日志截断与 137。

容器之间不通的排查

两个容器互访失败的常见原因:不在同一网络、默认 bridge 不支持按名解析、网络被设为 internal 或 icc 关闭;先看网络归属再谈其他。

dockerd 起不来:journalctl 定位

服务启动失败时先读日志:journalctl -u docker 里会给出根因(daemon.json 语法、存储驱动、地址占用、内核模块或 cgroup 配置)。

容器访问宿主服务:host-gateway

容器内 127.0.0.1 是容器自己:访问宿主服务要用网关地址;Linux 上用 --add-host=host.docker.internal:host-gateway 显式映射(Docker 20.10+)。

docker logs 为空的原因

logs 为空先分清三类:日志驱动不是 json-file/local、应用把日志写进容器内文件、进程在打印前就退出。

脚本批量读取退出码

批量拿退出码的两个姿势:docker wait 同步等待返回码、inspect 事后读取 ExitCode;配合循环可给一批任务出结果表。

exec: executable file not found in $PATH

docker exec 找不到命令:容器内没装、PATH 与预期不同,或命令依赖的环境变量只写在 entrypoint 脚本里(exec 不执行 entrypoint)。

容器里 127.0.0.1 的含义

容器内 127.0.0.1 指向容器自身而非宿主:连接被拒时先分清目标所在位置——同容器、兄弟容器、还是宿主上的进程。

日志驱动差异:docker logs 不可用

日志驱动决定 docker logs 是否可用:json-file 与 local 支持容器级日志查看与轮转;journald 等要看对应后端(journalctl),none 则无输出。

daemon.json 改坏与不生效

两种症状要分开:服务起不来(JSON 语法错误)与配置不生效(字段需重启而只做了 reload,或 config 路径不对)。

no such file or directory:CRLF 与动态库

standard_init_linux.go ... exec user process caused: no such file or directory:看似文件在但报不存在,典型原因是脚本 CRLF 换行、shebang 解释器缺失或动态链接库不全。

镜像与宿主架构/平台不符

no matching manifest for linux/amd64 或运行期 exec format error:镜像与宿主平台不符;多架构标签可自动选择,显式 --platform 时要保证执行侧有对应支持。

退出码 125:docker run 自身失败

125 表示 Docker 客户端/守护进程层失败,容器根本没跑起来:常见于 daemon 不可达、参数非法、端口占用、镜像不存在。

存储驱动报错:graphdriver/overlay2

error initializing graphdriver 或 error creating overlay mount:与内核版本、底层文件系统(d_type 支持)、磁盘空间与权限相关,先核对环境再改驱动。

exec format error 定位

exec format error:可执行文件与宿主 CPU 架构不符、脚本没有 shebang、或二进制被截断;先看架构再看文件格式。

容器时间与 UTC 时差

容器默认 UTC:日志与宿主差 8 小时是时区而非故障;用 TZ 环境变量设置时区,注意精简镜像可能缺时区数据。

构建期网络与代理问题

构建容器不继承宿主代理环境:需要在构建时显式传入代理或使用镜像源,凭据类代理要走 BuildKit secret 避免写进层与历史。

退出码 127:找不到命令

127 表示容器内找不到要执行的命令:镜像里没装、PATH 里没有、或 entrypoint 的 shebang 指向不存在的解释器。

Docker 链缺失导致网络异常

容器网络突然异常且 iptables 中 DOCKER/DOCKER-USER 链缺失:常见于防火墙工具重置规则、或 daemon 曾以禁用 iptables 模式运行。

构建上下文过大导致慢

上下文越大构建越慢(即使 COPY 少量文件也会打包传输):用 .dockerignore 排除依赖、版本库与产物目录,必要时拆分构建目录。

退出码 126:命令不可执行

126 表示容器内目标命令存在但无法执行:没有执行权限、格式不对(缺 shebang、二进制与架构不符),或挂载脚本权限位丢失。

ContainerConfig 报错:老 compose 读新镜像

老版 docker-compose(v1,Python 实现)读取较新构建工具产出的镜像元数据时会抛 KeyError: 'ContainerConfig';换用 Compose V2 或重拉镜像可解。

PID 1 信号与僵尸进程:--init

容器里 PID 1 承担信号转发与孤儿进程回收:shell 当 PID 1 时常把 SIGTERM 吞掉、留下僵尸;--init 注入轻量 init 解决。

容器子网与内网/VPN 冲突

docker0 默认 172.17.0.0/16 与办公网或 VPN 路由重叠时,特定目标不可达;用 ip route 对照容器网络子网,必要时规划独立地址池。

x509 / TLS handshake 镜像拉取报错

拉镜像报证书或握手错误:企业镜像源证书链不受信、中间设备拦截 HTTPS、私有仓库自签证书域名不匹配;先验证证书再决定收敛方式。

context 指错环境

命令发去了错误的环境:docker context 可能指向远端或 Desktop;用 context ls/show 确认当前指向,DOCKER_HOST 环境变量优先级更高。

退出码 139:段错误 SIGSEGV

139 = 128+11,进程收到 SIGSEGV:多为应用自身缺陷、JIT/native 库与平台不匹配、或内存越界;排查从崩溃栈与 dmesg 入手。

invalid reference format 定位

镜像名解析失败:命名含非法字符、变量为空导致 -t 后面缺值、参数顺序错误、Windows 路径写法混入等。

外部连接编程失败的两类报错

driver failed programming external connectivity 有两种常见尾巴:address already in use(端口冲突)与 iptables: No chain/target/match by that name(规则表丢了要重建)。

镜像删不掉:被容器引用

image is being used / has dependent child images:先处理引用它的容器(含已停止的),再删镜像;-f 只是解引用,不会回收底层数据。

MTU 不一致导致大包被丢

SSH 卡住、TLS 握手挂起而小请求正常:容器网卡与路径 MTU 不一致(overlay/VPN 常见),用逐级探测确认后调整网络 MTU。

容器删不掉:Removal In Progress

docker rm 卡住或提示 Removal In Progress / device busy:先 kill 再删,查挂载点占用;顽固情况重启 docker 让运行时清理状态。

退出码 255:应用约定错误

255 不是 Docker 定义的码:常见于应用以 exit(-1)、ssh 类工具错误退出等约定,属于应用层问题,按应用日志定位。

客户端与服务端 API 版本不匹配

client version is too new/old for API version:老客户端连新 daemon(或反向);升级客户端为正解,DOCKER_API_VERSION 只做临时兼容。

没有匹配的条目。换个关键词试试,或直接全站搜索。
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌