🐳 Docker
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 |
删除仓库 |
|
docker rmi 1a2b3c4d5e6f |
按镜像 ID 删除镜像 |
|
docker rmi $(docker images -q) |
删除所有镜像(谨慎使用!) |
🔁 容器管理
命令 |
示例 |
描述 |
|---|---|---|
docker container exec |
在运行中的容器内执行命令 | |
docker exec -it container bash |
在名为 |
|
docker exec container ls /app |
在容器 |
|
docker exec -d container touch /tmp/testfile |
以分离模式运行命令(无需等待) |
|
docker container logs |
查看容器日志 | |
docker logs container |
显示容器 |
|
docker logs -f container |
实时跟踪容器日志 |
|
docker logs --tail 50 container |
显示最后 50 行日志 |
|
docker inspect |
获取容器或镜像的详细 JSON 信息 | |
docker inspect 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 |
将容器从 |
|
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 |
显示名为 |
|
docker container pause |
暂停容器中的所有进程 | |
docker pause container |
暂停容器 |
|
docker container unpause |
恢复已暂停的容器 | |
docker unpause container |
恢复容器 |
|
docker container update |
在不重启的情况下更新容器设置 | |
docker update --memory 500m container |
限制容器内存使用为 500 MB |
🧱 镜像与 Dockerfile
命令 |
示例 |
描述 |
|---|---|---|
docker buildx build |
基于 Dockerfile 构建 Docker 镜像 | |
docker build -t my_image . |
从当前目录构建并打上标签 |
|
docker build -t my_image:1.0 . |
构建并打上版本标签 |
|
docker build --no-cache -t my_image . |
不使用缓存进行全新构建 |
|
docker container commit |
从容器当前状态创建镜像 | |
docker commit container my_img:v1 |
从容器 |
|
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 |
为推送到仓库 |
|
docker tag my_image:1.0 my_image:stable |
为标签为 |
|
docker tag my_image my_image:backup |
为本地镜像添加 |
|
docker image push |
将镜像推送到 Docker Hub 或其他注册表 | |
docker push myrepo/my_image:latest |
推送标签为 |
|
docker push myrepo/my_image:1.0 |
推送标签为 |
|
docker push myrepo/my_image |
推送使用默认标签 |
|
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 |
仅显示驱动为 |
|
docker network ls --format '{{.Name}}' |
仅输出网络名称 |
|
docker network create |
创建新的 Docker 网络 | |
docker network create my_net |
创建名为 |
|
docker network create --driver bridge my_bridge_net |
创建一个使用 |
|
docker network create --subnet=192.168.10.0/24 my_custom_net |
创建指定子网的网络 |
|
docker network connect |
将容器连接到网络 | |
docker network connect my_net container |
将容器 |
|
docker network connect --alias db_net my_net container |
使用别名 |
|
docker network disconnect |
将容器从网络断开 | |
docker network disconnect my_net container |
将容器 |
|
docker volume ls |
列出所有 Docker 卷 | |
docker volume ls |
显示所有 Docker 卷 |
|
docker volume ls --filter dangling=true |
显示未使用的卷 |
|
docker volume create |
创建新的 Docker 卷 | |
docker volume create my_vol |
创建名为 |
|
docker volume create --driver local --opt type=tmpfs my_tmp_vol |
使用 tmpfs 创建临时卷 |
|
docker volume inspect |
显示卷的详细信息 | |
docker volume inspect my_vol |
以 JSON 格式显示卷 |
|
docker volume rm |
删除一个或多个卷 | |
docker volume rm 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 |
仅显示 |
|
docker compose exec |
在运行中的服务容器内执行命令 | |
docker compose exec web bash |
进入 |
|
docker compose exec db ls /var/lib/postgresql |
在数据库容器中运行 |
|
docker compose exec -d worker touch /tmp/done |
在 |
|
docker compose build |
构建或重建服务镜像 | |
docker compose build |
构建 |
|
docker compose build web |
仅构建 |
|
docker compose build --no-cache |
构建镜像时不使用缓存 |
|
docker compose ps |
显示所有服务和容器的状态 | |
docker compose ps -a |
显示所有容器,包括已停止的 |
|
docker compose ps --services |
仅显示服务名称 |
|
docker compose pull |
从注册表下载/更新服务镜像 | |
docker compose pull web |
仅拉取 |
|
docker compose pull --ignore-pull-failures |
即使部分镜像失败也继续拉取 |
|
docker compose restart |
重启所有或指定服务 | |
docker compose restart 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 |
启动 |
|
docker compose start db api |
一次启动多个服务 |
|
docker compose stop |
停止服务而不删除容器 | |
docker compose stop 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 |
使用 |
|
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 |
删除 |
|
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' |
仅显示与 |
|
docker container update |
在不重启的情况下修改运行中容器的资源限制和设置 | |
docker update --cpus 2 --memory 1g my_container |
限制为 2 个 CPU 和 1 GB 内存 |
|
docker update --restart unless-stopped my_container |
设置自动重启策略为 |
|
docker update --pids-limit 200 my_container |
限制进程数为 200 |
|
docker container diff |
显示容器与其原始镜像之间的文件系统变化。适用于调试和审计 | |
docker diff my_container |
显示容器的所有文件系统更改 |
|
docker diff my_container | grep '^A' |
仅显示新增文件( |
|
docker image history |
显示镜像层的历史:构建命令、每层大小和创建时间。适用于优化和审计 | |
docker history my_image |
显示镜像的层历史 |
|
docker history --no-trunc my_image |
显示完整构建命令,不截断 |
|
docker history --format "{{.CreatedBy}}: {{.Size}}" my_image |
仅输出构建命令和层大小 |
🛠 实用的 Docker 实践与自动化
最小化镜像大小
使用alpine或scratch等基础镜像以减小体积。
在构建时使用--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 Swarm
🐞 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 |
使用替代输出格式,如 |
|
docker top my_container -eo pid,cmd |
仅显示进程 PID 和命令 |
|
docker diff |
显示容器文件系统相较于基础镜像的更改,包括新增、修改或删除的文件 | |
docker diff my_container |
显示容器与基础镜像相比的文件系统更改 |
|
docker diff my_container | grep '^A' |
仅显示新增文件 ( |
|
docker diff my_container | grep '^C' |
仅显示修改过的文件 ( |
|
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" |
复制日志文件并过滤错误行而不保存到磁盘 |
💡 高级调试可使用
nsenter、strace、tcpdump、gdb等底层工具。
💼 高级 Docker Compose 用法
🚀 专业级 Docker Compose 命令
命令 |
示例 |
描述 |
|---|---|---|
docker compose up |
从 docker-compose.yml 文件启动并管理指定服务生命周期,可在后台运行 | |
docker compose up -d web db |
仅以分离模式运行 |
|
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 |
仅构建 |
|
docker compose pull |
为所有或指定服务从注册表下载最新镜像 | |
docker compose pull |
为所有服务拉取镜像 |
|
docker compose pull db |
仅为 |
|
docker compose pull --ignore-pull-failures |
忽略错误继续拉取镜像 |
|
docker compose restart |
重启所有或指定服务而不重新创建容器 | |
docker compose restart |
重启当前项目的所有服务 |
|
docker compose restart worker |
仅重启 |
|
docker compose restart web db |
一次重启多个服务 |
|
docker compose exec |
在运行的服务容器内执行命令,可选择交互模式 | |
docker compose exec db psql -U user -d database |
在 |
|
docker compose exec web sh |
在 |
|
docker compose exec api curl http://localhost:8080 |
在 |
|
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 |
删除 |
|
docker compose pause |
暂停服务运行 | |
docker compose pause api |
暂停 |
|
docker compose unpause |
恢复暂停的服务 | |
docker compose unpause api |
恢复 |
|
docker compose create |
创建容器但不启动 | |
docker compose create web db |
为 |
|
docker compose images |
显示服务使用的镜像列表 | |
docker compose images |
显示所有服务的镜像 |
|
docker compose top |
显示服务容器中运行的进程 | |
docker compose top 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 secret和docker config(在 Docker Swarm 中)用于安全管理机密和配置
- 外部卷存放包含机密的配置文件
外部机密管理系统(如 HashiCorp Vault、AWS Secrets Manager)
使用
depends_on和healthcheck的启动顺序
确保服务在依赖项就绪后再启动: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 |
在 |
|
docker compose exec db psql -U user -d database |
在 |
|
docker compose logs |
查看服务日志,用于诊断与监控 | |
docker compose logs -f db |
实时查看 |
|
docker compose logs --tail=50 api |
显示 |
|
docker compose logs --since=1h web |
显示 |
|
docker inspect |
查看运行服务的容器的详细信息 | |
docker inspect $(docker compose ps -q web) |
获取 |
|
docker container stats |
监控运行服务容器的资源使用情况 | |
docker stats $(docker compose ps -q worker) |
跟踪 |
|
docker compose run --rm |
使用服务配置运行临时容器,便于调试 | |
docker compose run --rm web sh |
为 |
|
docker container cp |
在主机与容器间复制文件 | |
docker cp $(docker compose ps -q db):/dump.sql ./dump.sql |
从 |
💡 对复杂多服务调试,可用
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 --help或docker <command> --help查看命令说明。
- 经常练习并尝试简单项目。
关注镜像大小,并通过
.dockerignore删除不必要的文件。
🌐 有用的链接
📘 Docker 官方文档 — 涵盖所有 Docker 主题的完整指南和参考:
https://docs.docker.com/
📙 Docker 速查表 — 官方完整 Docker 速查表:
https://dockerlabs.collabnix.com/docker/cheatsheet/
📗 Docker Hub — 镜像与注册表:
https://hub.docker.com/