Docker 容器速查
Docker 命令、Dockerfile 与镜像构建、网络与存储、Compose 编排、资源限制与安全加固、容器排障:容器化工作全流程速查。
基础命令
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 只做临时兼容。