🐳 Docker

Multilingual DevOps cheat sheet: Linux, Docker, Git, Kubernetes, Helm, Terraform, practical scenarios & templates.
发布于

2025年8月31日

Docker 是一个在隔离容器中运行应用的平台。本速查表包含用于操作镜像、容器、网络、卷,以及 Docker Compose 和 Swarm 的命令。

📦 基本命令

命令

示例

描述

docker 主要的 Docker CLI 命令,用于运行子命令并管理容器、镜像、网络和卷
docker version 显示已安装的 Docker 版本(客户端和服务器)。用于验证安装
docker version --format '{{.Client.APIVersion}}'

仅显示 Docker 客户端 API 版本

docker version --format '{{.Server.Version}}'

仅显示 Docker 服务器(引擎)版本

docker version --format '{{json .}}'

以 JSON 格式输出完整版本信息

docker system info 显示 Docker 系统信息:容器数、镜像数、资源
docker info

显示 Docker 数据:版本、网络、容器数和镜像数

docker info --format '{{json .}}'

以 JSON 格式输出信息 — 适用于自动化

docker info --format '{{.NCPU}} CPUs, {{.MemTotal}} bytes RAM'

显示 CPU 数量和总内存

docker info --format '{{.Driver}}'

显示 Docker 使用的存储驱动

docker image pull 从 Docker Hub 或其他注册表下载镜像。容器必须依赖镜像才能运行
docker pull ubuntu

下载最新的 Ubuntu 镜像

docker pull nginx:alpine

下载基于 Alpine Linux 的轻量级 Nginx 镜像

docker pull redis:7

下载 Redis 7 版本镜像

docker container run 基于镜像创建并运行新容器
docker run -it ubuntu bash

运行 Ubuntu 并打开交互式 Bash 终端

docker run -d nginx

后台模式运行 Nginx

docker run -p 8080:80 nginx

运行 Nginx 并将容器端口 80 绑定到主机端口 8080

docker container ls 列出正在运行的容器
docker ps

仅显示运行中的容器

docker ps -a

显示所有容器,包括已停止的

docker ps --format '{{.Names}}'

仅输出容器名称

docker container start 启动一个或多个已停止的容器
docker start container_name

按名称启动容器

docker start $(docker ps -aq)

启动所有容器

docker start -ai container_name

启动容器并附加交互式终端

docker container stop 停止正在运行的容器
docker stop container_name

按名称停止容器

docker stop $(docker ps -q)

停止所有运行中的容器

docker stop -t 5 container_name

停止容器并给予 5 秒完成进程

docker container restart 重启容器
docker restart container_name

重启指定容器

docker restart $(docker ps -q)

重启所有运行中的容器

docker restart -t 10 container_name

延迟 10 秒后重启容器

docker container rm 删除容器
docker rm container_name

删除指定的已停止容器

docker rm $(docker ps -aq)

删除所有已停止的容器

docker rm -f container_name

强制删除运行中的容器

docker image ls 列出已下载的镜像
docker images

显示主机上的所有镜像

docker images -a

显示所有镜像,包括中间层

docker images --format '{{.Repository}}:{{.Tag}}'

仅输出镜像名称和标签

docker image rm 从本地存储中删除一个或多个镜像
docker rmi test1:latest

删除仓库 test1 中标签为 latest 的镜像

docker rmi 1a2b3c4d5e6f

按镜像 ID 删除镜像

docker rmi $(docker images -q)

删除所有镜像(谨慎使用!)

🔁 容器管理

命令

示例

描述

docker container exec 在运行中的容器内执行命令
docker exec -it container bash

在名为 container 的容器内启动交互式 bash shell

docker exec container ls /app

在容器 /app 目录中执行 ls 命令

docker exec -d container touch /tmp/testfile

以分离模式运行命令(无需等待)

docker container logs 查看容器日志
docker logs container

显示容器 container 的所有日志

docker logs -f container

实时跟踪容器日志

docker logs --tail 50 container

显示最后 50 行日志

docker inspect 获取容器或镜像的详细 JSON 信息
docker inspect container

显示容器 container 的详细信息

docker inspect --format '{{.NetworkSettings.IPAddress}}' container

显示容器的 IP 地址

docker container stats 显示容器实时资源使用情况
docker stats

显示所有容器的 CPU、内存、网络和磁盘使用情况

docker stats container_name

仅显示指定容器的统计信息

docker stats --no-stream

显示一次快照并退出

docker container rename 重命名容器
docker rename old_name new_name

将容器从 old_name 重命名为 new_name

docker container cp 在容器与主机之间复制文件
docker cp container:/src/file.txt ./file.txt

将文件从容器复制到当前主机目录

docker cp ./config.yaml container:/app/config.yaml

将文件从主机复制到容器

docker cp CONTAINER:/var/logs/app.log - | tar x -O | grep "ERROR"

从容器流式传输日志文件并过滤 “ERROR” 行,不保存到磁盘

docker container top 显示容器内运行的进程
docker top container

显示名为 container 的容器的进程

docker container pause 暂停容器中的所有进程
docker pause container

暂停容器 container

docker container unpause 恢复已暂停的容器
docker unpause container

恢复容器 container

docker container update 在不重启的情况下更新容器设置
docker update --memory 500m container

限制容器内存使用为 500 MB

🧱 镜像与 Dockerfile

命令

示例

描述

docker buildx build 基于 Dockerfile 构建 Docker 镜像
docker build -t my_image .

从当前目录构建并打上标签 my_image

docker build -t my_image:1.0 .

构建并打上版本标签 1.0

docker build --no-cache -t my_image .

不使用缓存进行全新构建

docker container commit 从容器当前状态创建镜像
docker commit container my_img:v1

从容器 container 创建标签为 v1 的镜像 my_img

docker commit -m "Added config" container my_img:v2

创建带提交消息的镜像

docker commit -a "John Doe" container my_img:latest

创建时指定作者信息

docker image tag 添加或修改镜像标签
docker tag my_image myrepo/my_image:latest

为推送到仓库 myrepo 添加标签

docker tag my_image:1.0 my_image:stable

为标签为 1.0 的镜像创建标签 stable

docker tag my_image my_image:backup

为本地镜像添加 backup 标签

docker image push 将镜像推送到 Docker Hub 或其他注册表
docker push myrepo/my_image:latest

推送标签为 latest 的镜像到仓库 myrepo

docker push myrepo/my_image:1.0

推送标签为 1.0 的镜像

docker push myrepo/my_image

推送使用默认标签 latest 的镜像

docker login 登录 Docker Hub 或其他注册表
docker login

交互式输入用户名和密码登录 Docker Hub

docker login myregistry.local:5000

登录私有注册表

docker login -u username -p password

使用用户名和密码登录(不推荐)

docker logout 退出 Docker Hub 或其他注册表
docker logout

退出 Docker Hub

docker logout myregistry.local:5000

退出私有注册表

HEALTHCHECK Dockerfile 指令,用于自动检查容器健康状态
HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD curl -f http://localhost/ || exit 1

添加健康检查,每 30 秒验证一次服务可用性

docker inspect --format='{{json .State.Health}}' container_name

检查运行中容器的健康状态

🔌 网络与卷

命令

示例

描述

docker network ls 列出所有 Docker 网络
docker network ls

显示所有已创建的 Docker 网络

docker network ls --filter driver=bridge

仅显示驱动为 bridge 的网络

docker network ls --format '{{.Name}}'

仅输出网络名称

docker network create 创建新的 Docker 网络
docker network create my_net

创建名为 my_net 的网络(默认设置)

docker network create --driver bridge my_bridge_net

创建一个使用 bridge 驱动的网络

docker network create --subnet=192.168.10.0/24 my_custom_net

创建指定子网的网络

docker network connect 将容器连接到网络
docker network connect my_net container

将容器 container 连接到网络 my_net

docker network connect --alias db_net my_net container

使用别名 db_net 进行连接

docker network disconnect 将容器从网络断开
docker network disconnect my_net container

将容器 container 从网络 my_net 中断开

docker volume ls 列出所有 Docker 卷
docker volume ls

显示所有 Docker 卷

docker volume ls --filter dangling=true

显示未使用的卷

docker volume create 创建新的 Docker 卷
docker volume create my_vol

创建名为 my_vol 的卷

docker volume create --driver local --opt type=tmpfs my_tmp_vol

使用 tmpfs 创建临时卷

docker volume inspect 显示卷的详细信息
docker volume inspect my_vol

以 JSON 格式显示卷 my_vol 的详细信息

docker volume rm 删除一个或多个卷
docker volume rm my_vol

删除名为 my_vol 的卷

docker volume rm $(docker volume ls -qf dangling=true)

删除所有未使用的卷

🧩 Docker 插件

命令

示例

描述

docker plugin ls 列出已安装的 Docker 插件
docker plugin ls

显示所有插件及其状态

docker plugin install 从注册表安装 Docker 插件
docker plugin install vieux/sshfs

安装 SSHFS 卷插件

docker plugin install store/weaveworks/net-plugin:latest_release

安装 Weave 网络插件

docker plugin disable 禁用已安装的插件
docker plugin disable vieux/sshfs

禁用 SSHFS 插件

docker plugin enable 启用之前禁用的插件
docker plugin enable vieux/sshfs

启用 SSHFS 插件

docker plugin rm 删除 Docker 插件
docker plugin rm vieux/sshfs

删除 SSHFS 插件

📋 Docker Compose

命令

示例

描述

docker compose up 启动 docker-compose.yml 中定义的容器
docker compose up

在当前目录以交互模式启动所有服务

docker compose up -d

以后台模式启动服务

docker compose up --build

在启动服务前先构建镜像

docker compose down 停止并删除由 up 创建的容器、网络和卷
docker compose down

停止所有运行的服务并删除相关资源

docker compose down --volumes

同时删除 Compose 创建的卷

docker compose down --rmi all

同时删除 Compose 创建的镜像

docker compose logs 查看所有或指定服务的日志
docker compose logs

显示所有服务的日志

docker compose logs -f

实时跟踪日志

docker compose logs web

仅显示 web 服务的日志

docker compose exec 在运行中的服务容器内执行命令
docker compose exec web bash

进入 web 服务容器中的交互式 bash shell

docker compose exec db ls /var/lib/postgresql

在数据库容器中运行 ls 命令

docker compose exec -d worker touch /tmp/done

worker 容器中以分离模式运行命令

docker compose build 构建或重建服务镜像
docker compose build

构建 docker-compose.yml 中定义的所有镜像

docker compose build web

仅构建 web 服务的镜像

docker compose build --no-cache

构建镜像时不使用缓存

docker compose ps 显示所有服务和容器的状态
docker compose ps -a

显示所有容器,包括已停止的

docker compose ps --services

仅显示服务名称

docker compose pull 从注册表下载/更新服务镜像
docker compose pull web

仅拉取 web 服务的镜像

docker compose pull --ignore-pull-failures

即使部分镜像失败也继续拉取

docker compose restart 重启所有或指定服务
docker compose restart db

仅重启 db 服务

docker compose restart -t 10

在 10 秒超时内重启服务

docker compose config 以 YAML 格式显示最终 Compose 配置
docker compose config --services

列出配置中的所有服务

docker compose config --volumes

列出配置中定义的所有卷

docker compose start 启动已停止的服务而不重新创建容器
docker compose start web

启动 web 服务

docker compose start db api

一次启动多个服务

docker compose stop 停止服务而不删除容器
docker compose stop web

停止 web 服务

docker compose stop -t 5

在 5 秒超时内停止服务

📤 导出与导入

命令

示例

描述

docker image save 将一个或多个 Docker 镜像保存为 tar 归档文件,以便导入或传输
docker save -o image.tar my_img:tag

将 Docker 镜像保存为 tar 文件

docker save my_image > my_image.tar

另一种保存镜像到文件的方法

docker save -o redis_latest.tar redis:latest

将特定的 Redis 镜像保存为文件

docker image load 从之前保存的 tar 归档中加载 Docker 镜像
docker load < image.tar

从 tar 文件加载 Docker 镜像

docker load --input redis_latest.tar

通过参数指定文件加载镜像

docker load --quiet < my_image.tar

加载镜像时不显示进度

docker container export 将容器文件系统导出为 tar 归档,不包含镜像历史或元数据
docker export container > file.tar

将容器文件系统导出为归档文件

docker export my_container > my_container_fs.tar

按容器名称导出

docker export -o container_fs.tar container_id

使用 -o 标志按容器 ID 导出

docker image import 从文件系统 tar 归档创建新镜像
docker import file.tar new_img

将归档文件导入为新的 Docker 镜像

docker import https://example.com/image.tar my_new_image

直接从 URL 导入镜像

docker import - my_image < file.tar

从标准输入导入

🧹 清理与诊断

命令

示例

描述

docker system df 显示 Docker 磁盘使用情况:卷、镜像、容器和构建缓存
docker system df -v

详细输出每个镜像、容器和卷的信息

docker system df --format '{{json .}}'

以 JSON 格式输出信息

docker system prune 删除所有未使用的 Docker 数据:已停止的容器、未使用的网络、悬挂镜像和构建缓存
docker system prune -a

删除未使用的镜像,包括中间层

docker system prune --volumes

同时删除未使用的卷及其他资源

docker image prune 删除未使用的 Docker 镜像,包括悬挂层
docker image prune -a

删除所有未使用的镜像,包括悬挂的

docker image prune --filter "until=24h"

删除超过 24 小时的镜像

docker container prune 删除符合过滤条件的已停止容器,若未指定则删除所有
docker container prune --filter "until=24h"

删除超过 24 小时的已停止容器

docker container prune --force

不提示确认直接删除

🐝 Docker Swarm

命令

示例

描述

docker swarm init 在当前节点初始化新的 Docker Swarm 集群
docker swarm init --advertise-addr 192.168.1.100

初始化集群并指定 IP 地址

docker swarm init --listen-addr 0.0.0.0:2377

初始化时指定监听端口

docker service create 在 Swarm 集群中创建新服务
docker service create --name nginx nginx

在 Swarm 中创建 Nginx 服务

docker service create --replicas 3 --name web webserver

创建一个包含 3 个副本的服务

docker service create --name redis --publish 6379:6379 redis

创建带端口映射的服务

docker stack deploy 基于 Compose 文件将一组服务部署到 Swarm 集群
docker stack deploy -c docker-compose.yml mystack

从 compose 文件部署 stack

docker stack deploy --with-registry-auth -c compose.yml mystack

部署时启用注册表认证转发

docker stack deploy -c swarm-compose.yml mystack

使用备用 compose 文件部署 stack

docker stack rm 从 Swarm 集群中删除一个或多个 stack
docker stack rm mystack

删除 mystack stack

docker stack rm

删除所有 stack(不推荐)

docker stack rm mystack && docker swarm leave --force

删除 stack 并退出 Swarm

💼 高级 Docker 用法

🚀 专业级 Docker 命令

命令

示例

描述

docker buildx 高级镜像构建工具,取代 docker build。支持多平台、缓存、并行构建和导出到多种格式。适用于 CI/CD 和跨平台开发
docker buildx build --platform linux/arm64,linux/amd64 -t myimg:multi .

构建多平台镜像(同时支持 ARM 和 x86)

docker buildx build --load -t localimg .

构建镜像并加载到本地 Docker 引擎缓存

docker buildx build --push --platform linux/amd64,linux/arm64 -t repo/app:latest .

构建并推送多平台镜像到注册表

docker context 管理 Docker 上下文,用于远程或多环境工作。可快速切换本地与远程 Docker 引擎
docker context create myremote --docker "host=ssh://user@host"

创建一个连接远程 Docker 主机的上下文

docker context use myremote

切换到远程上下文

docker context ls

列出可用的上下文及当前激活的

docker system events 实时监听 Docker 事件,并可按事件类型过滤(如容器启动)。适用于监控与自动化
docker events --filter 'event=start'

仅显示容器启动事件

docker events --since 1h --until 10m

显示从一小时前到 10 分钟前的事件

docker events --filter 'type=network'

仅显示与网络相关的事件

docker events --filter 'image=nginx'

仅显示与 nginx 镜像相关的事件

docker container update 在不重启的情况下修改运行中容器的资源限制和设置
docker update --cpus 2 --memory 1g my_container

限制为 2 个 CPU 和 1 GB 内存

docker update --restart unless-stopped my_container

设置自动重启策略为 unless-stopped

docker update --pids-limit 200 my_container

限制进程数为 200

docker container diff 显示容器与其原始镜像之间的文件系统变化。适用于调试和审计
docker diff my_container

显示容器的所有文件系统更改

docker diff my_container | grep '^A'

仅显示新增文件(A — Added)

docker image history 显示镜像层的历史:构建命令、每层大小和创建时间。适用于优化和审计
docker history my_image

显示镜像的层历史

docker history --no-trunc my_image

显示完整构建命令,不截断

docker history --format "{{.CreatedBy}}: {{.Size}}" my_image

仅输出构建命令和层大小

🛠 实用的 Docker 实践与自动化

  • 最小化镜像大小
    使用 alpinescratch 等基础镜像以减小体积。
    在构建时使用 --squash 压缩层(需要启用实验特性)。
    在单层中删除临时文件和缓存:

    RUN apk add --no-cache curl && rm -rf /var/cache/apk/*
  • 减少层数
    在一个 RUN 中合并命令以减少层数和最终镜像大小:

    RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
  • 优化 Dockerfile 构建
    使用多阶段构建,只保留最终镜像所需文件。
    先复制并安装依赖,再复制代码 — 提高缓存利用率,加快重建。

  • 分离机密与配置
    不要在镜像中存储 .env 文件、API 密钥或私有证书。
    配置可使用:

    • docker secret(Swarm 中)
    • 环境变量(-e VAR=value.env
    • 用于配置的外部卷

  • 构建时机密(BuildKit)
    在构建时安全传递机密,使用 --secret 参数:

    docker buildx build --secret id=mysecret,src=./secret.txt .

    在 Dockerfile 中,机密可在 /run/secrets/mysecret 使用:

    RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret

    🛡 这样可避免机密存储在镜像层中。

  • 无 Root 权限运行 Docker
    在无 Root 权限下运行 Docker 可提高安全性,降低宿主机被入侵的风险。
    启用方式:

    dockerd-rootless-setuptool.sh install
    export PATH=/usr/bin:$PATH

    检查:

    docker info | grep Rootless

    ⚠ 某些功能(如 <1024 端口转发)将不可用。

  • 扫描镜像漏洞
    使用内置工具:

    docker scan my_image

    或使用新 CLI:

    docker scout cves my_image

    有助于发现基础镜像和依赖中的漏洞。

  • 监控资源使用
    通过内存、CPU 和进程数限制容器:

    docker run --memory=512m --cpus="1.5" --pids-limit=200 myimage

    避免资源过度消耗。
    还可以限制 I/O:

    docker run --device-read-bps /dev/sda:1mb --device-write-bps /dev/sda:1mb myimage

    适用于不应过载磁盘子系统的容器。

  • 自动清理
    定期删除未使用的镜像、容器、卷和网络:

    docker system prune -af --volumes

    ⚠ 注意:该命令会删除所有未使用的资源。

    若需选择性清理,请使用:

    docker image prune --filter "until=24h"
  • CI/CD 集成
    将构建、测试和部署集成到 GitHub Actions、GitLab CI、Jenkins 流水线中。
    示例 GitHub Actions 步骤:

    - run: docker build -t myapp:${GITHUB_SHA} .
    - run: docker push myapp:${GITHUB_SHA}
  • 日志与监控
    将日志驱动(--log-driver)附加到集中式系统:ELK、Loki、Splunk。
    使用 Prometheus + cAdvisor 进行容器指标监控。

  • 生产环境部署
    使用 docker-compose.override.yml 区分开发与生产配置。
    高可用与扩展可使用:

    • Docker Swarm
    • Kubernetes

🐞 Docker 容器调试与分析

命令

示例

描述

docker container exec 在运行中的容器内执行命令,提供交互式访问或在隔离环境中运行进程
docker exec -it my_container bash

在运行中的容器内启动交互式终端 (bash)

docker exec -it my_container sh

在容器中启动最小化 shell(如果 bash 不可用)

docker exec my_container ls /app

在容器中运行命令(非交互模式)

docker container logs 显示指定容器的日志,用于诊断和监控其运行输出和事件
docker logs -f --tail 100 my_container

实时查看最后 100 行日志

docker logs my_container

显示容器的所有可用日志

docker logs --since 1h my_container

显示最近一小时的日志

docker inspect 以 JSON 格式输出 Docker 对象(容器、镜像、网络等)的详细信息,包括配置和状态
docker inspect my_container

获取容器的完整 JSON 信息

docker inspect --format '{{.State.Pid}}' my_container

获取容器主进程在宿主机上的 PID

docker inspect --format '{{.NetworkSettings.IPAddress}}' my_container

显示容器的 IP 地址

nsenter (with strace) Linux 工具,用于进入其他进程的命名空间(此处为容器)。可结合 strace 在容器内跟踪系统调用以进行调试
nsenter --target $(docker inspect --format '{{.State.Pid}}' my_container) --mount --uts --ipc --net --pid strace -p 1

进入容器命名空间并跟踪进程 1 的系统调用

nsenter --target $(docker inspect --format '{{.State.Pid}}' my_container) --mount --uts --ipc --net --pid bash

在容器命名空间内打开 bash shell

nsenter --target $(docker inspect --format '{{.State.Pid}}' my_container) --net netstat -tulnp

查看容器内的开放端口

tcpdump (inside container) 命令行工具,用于捕获和分析网络流量。在容器内可诊断网络问题、分析数据包并监控连接
docker exec -it my_container tcpdump -i any

在容器内捕获并分析网络流量

docker exec -it my_container tcpdump -nn port 80

仅捕获 80 端口的流量

docker exec -it my_container tcpdump -w /tmp/dump.pcap

将流量保存到文件以供后续分析

docker container stats 实时显示一个或多个容器的资源使用指标(CPU、内存、网络、磁盘)
docker stats my_container

显示容器的实时 CPU、内存、网络和磁盘使用情况

docker stats

显示所有容器的统计信息

docker stats --no-stream

仅输出一次统计信息后退出

docker container top 显示容器中运行的进程列表,类似 Linux 中的 ps,用于分析容器活动
docker top my_container

显示容器内正在运行的进程

docker top my_container aux

使用替代输出格式,如 ps aux

docker top my_container -eo pid,cmd

仅显示进程 PID 和命令

docker diff 显示容器文件系统相较于基础镜像的更改,包括新增、修改或删除的文件
docker diff my_container

显示容器与基础镜像相比的文件系统更改

docker diff my_container | grep '^A'

仅显示新增文件 (A — Added)

docker diff my_container | grep '^C'

仅显示修改过的文件 (C — Changed)

docker cp 在容器与宿主机之间复制文件和目录,用于数据交换和备份
docker cp my_container:/path/to/file ./file

从容器复制文件到宿主机

docker cp ./config.yaml my_container:/app/config.yaml

从宿主机复制文件到容器

docker cp my_container:/var/log/app.log - | tar x -O | grep "ERROR"

复制日志文件并过滤错误行而不保存到磁盘

💡 高级调试可使用 nsenterstracetcpdumpgdb 等底层工具。

💼 高级 Docker Compose 用法

🚀 专业级 Docker Compose 命令

命令

示例

描述

docker compose up 从 docker-compose.yml 文件启动并管理指定服务生命周期,可在后台运行
docker compose up -d web db

仅以分离模式运行 webdb 服务

docker compose up --build

在启动服务前重建镜像

docker compose up --remove-orphans

删除当前 compose 文件中未定义的容器

docker compose build 根据 compose 文件为服务构建镜像,支持缓存控制和并行构建
docker compose build --no-cache

完全不使用缓存重建镜像

docker compose build --parallel

并行构建所有服务以加快速度

docker compose build web

仅构建 web 服务的镜像

docker compose pull 为所有或指定服务从注册表下载最新镜像
docker compose pull

为所有服务拉取镜像

docker compose pull db

仅为 db 服务拉取镜像

docker compose pull --ignore-pull-failures

忽略错误继续拉取镜像

docker compose restart 重启所有或指定服务而不重新创建容器
docker compose restart

重启当前项目的所有服务

docker compose restart worker

仅重启 worker 服务

docker compose restart web db

一次重启多个服务

docker compose exec 在运行的服务容器内执行命令,可选择交互模式
docker compose exec db psql -U user -d database

db 服务容器内运行 psql

docker compose exec web sh

web 容器内打开 shell

docker compose exec api curl http://localhost:8080

api 服务容器中执行 curl 请求

docker compose config 输出考虑所有文件和环境变量的最终 Compose 配置
docker compose config

以 YAML 格式显示合并后的配置

docker compose config --services

列出所有服务

docker compose config --environment

显示所有服务使用的环境变量

docker compose watch 在源文件更改时自动重启服务,适合开发
docker compose watch

启动文件监控并在更改时重启服务

docker compose events 流式获取 Compose 事件:服务启动、停止、更新
docker compose events --json

以 JSON 格式接收事件

docker compose rm 删除已停止的服务容器
docker compose rm web db

删除 webdb 服务的容器

docker compose pause 暂停服务运行
docker compose pause api

暂停 api 服务

docker compose unpause 恢复暂停的服务
docker compose unpause api

恢复 api 服务

docker compose create 创建容器但不启动
docker compose create web db

webdb 创建容器但不启动

docker compose images 显示服务使用的镜像列表
docker compose images

显示所有服务的镜像

docker compose top 显示服务容器中运行的进程
docker compose top web

显示 web 服务容器中的进程

🛠 Docker Compose 实践与自动化

  • 环境分离
    为不同环境(开发、测试、生产)使用单独的 docker-compose.override.yml 文件,以避免配置冲突。
    也可以使用 -f 参数组合多个配置文件:

    docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

    使用不同的 .env 文件(如 .env.dev, .env.prod)管理环境变量。

  • 安全存储机密
    不要将敏感数据(密码、令牌)直接写入 Compose 文件。应使用:

    • .env 文件存储环境变量(注意:.env 文件不加密,不能提交到公共仓库)
    • docker secretdocker config(在 Docker Swarm 中)用于安全管理机密和配置
    • 外部卷存放包含机密的配置文件
    • 外部机密管理系统(如 HashiCorp Vault、AWS Secrets Manager)

  • 使用 depends_onhealthcheck 的启动顺序
    确保服务在依赖项就绪后再启动:

    services:
      db:
        image: postgres
        healthcheck:
          test: ["CMD-SHELL", "pg_isready -U postgres"]
          interval: 10s
          retries: 5
      api:
        image: my_api
        depends_on:
          db:
            condition: service_healthy
  • 更新时最小化停机
    更新服务前运行:

    docker compose pull && docker compose up -d --remove-orphans

    -d 参数让容器后台运行,--remove-orphans 移除未在当前配置中定义的容器。
    如需完全停止并删除旧容器:

    docker compose down --remove-orphans

    确保加载新镜像并删除未使用的容器,避免停机。

  • 开发中的热加载 (volumes)
    使用 volumes 将本地目录挂载到容器中。这样代码更改能即时生效,无需重建镜像。
    注意文件权限和文件系统缓存问题,尤其在 Windows 和 macOS 上。

  • 无 volume 的热加载 (Compose 2.22+)

    develop:
      watch:
        - path: ./src
          action: sync
          target: /app
  • 服务集中式日志
    将容器日志重定向到 ELK、Loki、Prometheus、Fluentd 等监控和日志系统。
    使用 Docker 日志驱动 (--log-driver) 启用集中日志收集。
    在 Compose 中为容器配置日志驱动:

    services:
      api:
        image: my_api
        logging:
          driver: "json-file"
          options:
            max-size: "10m"
            max-file: "3"
  • 服务自动重启
    docker-compose.yml 中配置重启策略:

    restart: unless-stopped

    常见策略包括:

    • no — 不自动重启(默认)
    • always — 始终重启容器
    • on-failure — 仅在失败时重启(可带重试次数)

    生产环境推荐使用 unless-stopped,保证服务稳定。
    这样服务可在故障或宿主机重启后自动恢复。

  • 服务配置集 (Profiles)
    允许仅运行特定分组的服务:

    services:
      db:
        image: postgres
        profiles: ["backend"]
      web:
        image: nginx
        profiles: ["frontend"]

    仅运行 frontend 配置集:

    docker compose --profile frontend up

🐞 Docker Compose 服务调试与分析

命令

示例

描述

docker compose exec 在运行中的服务容器内执行命令,可访问容器或运行进程
docker compose exec web sh

web 服务容器内打开 shell

docker compose exec db psql -U user -d database

db 服务容器中运行 psql 命令

docker compose logs 查看服务日志,用于诊断与监控
docker compose logs -f db

实时查看 db 服务日志

docker compose logs --tail=50 api

显示 api 服务的最后 50 行日志

docker compose logs --since=1h web

显示 web 服务最近一小时的日志

docker inspect 查看运行服务的容器的详细信息
docker inspect $(docker compose ps -q web)

获取 web 服务容器的 JSON 详细信息

docker container stats 监控运行服务容器的资源使用情况
docker stats $(docker compose ps -q worker)

跟踪 worker 服务容器的 CPU、内存等使用情况

docker compose run --rm 使用服务配置运行临时容器,便于调试
docker compose run --rm web sh

web 服务启动一个交互式的一次性容器

docker container cp 在主机与容器间复制文件
docker cp $(docker compose ps -q db):/dump.sql ./dump.sql

db 服务容器复制文件到主机

💡 对复杂多服务调试,可用 docker compose run --rm 启动单独容器并挂载网络和卷,不影响主服务。

📚 附加资源

🚫 使用 .dockerignore 忽略文件

将不应包含在镜像中的文件和目录添加到 .dockerignore,以减小体积并加快构建:

node_modules/
*.log
.env

⚡ 使用别名简化命令

可为常用命令创建别名以加快执行:

alias dcu="docker compose up -d"
alias dcd="docker compose down"
alias dcb="docker compose build"

🧠 提示:Docker 使用建议

  • 不要死记硬背 — 使用 docker --helpdocker <command> --help 查看命令说明。
  • 经常练习并尝试简单项目。
  • 关注镜像大小,并通过 .dockerignore 删除不必要的文件。

🌐 有用的链接

📘 Docker 官方文档 — 涵盖所有 Docker 主题的完整指南和参考:
https://docs.docker.com/

📙 Docker 速查表 — 官方完整 Docker 速查表:
https://dockerlabs.collabnix.com/docker/cheatsheet/

📗 Docker Hub — 镜像与注册表:
https://hub.docker.com/