Docker、Docker Compose相关操作
一、Docker 核心命令
1. 镜像管理
# 拉取镜像
docker pull <镜像名>:<标签>
# 示例:拉取最新的 nginx 官方镜像
docker pull nginx:latest
# 列出本地所有镜像
docker images
# 删除镜像
docker rmi <镜像ID或镜像名>:<标签>
# 强制删除(会同时删除依赖此镜像的容器)
docker rmi -f <镜像ID>
# 将镜像导出为 tar
# 语法:docker save -o <输出文件名>.tar <镜像名>:<标签>
docker save -o myapp_1.0.tar myuser/myapp:1.0
# 从 tar 文件加载镜像
# 语法:docker load -i <输入文件名>.tar
docker load -i myapp_1.0.tar
2. 容器管理
# 创建并启动容器
docker run -d --name <容器名> -p <宿主端口>:<容器端口> <镜像名>:<标签>
# 示例:后台启动一个 nginx,映射宿主机 8080 到容器 80
docker run -d --name mynginx -p 8080:80 nginx:latest
# 列出运行中的容器
docker ps
# 列出所有容器(包括停止的)
docker ps -a
# 停止容器
docker stop <容器名或容器ID>
# 启动已停止的容器
docker start <容器名或容器ID>
# 重启容器
docker restart <容器名或容器ID>
# 删除已停止的容器
docker rm <容器名或容器ID>
# 查看容器日志
docker logs <容器名或容器ID>
# 实时跟踪日志
docker logs -f <容器名>
# 进入容器交互式终端
docker exec -it <容器名> /bin/bash
# 或者 sh
docker exec -it <容器名> sh
# 进入正在运行的容器(attach 会带来日志输出,需要配合 Ctrl-P Ctrl-Q 退出)
docker attach <容器名>
3. 网络与数据卷
# 列出网络
docker network ls
# 创建自定义网络
docker network create --driver bridge <网络名>
# 网络详情
docker network inspect <网络名>
# 列出数据卷
docker volume ls
# 创建数据卷
docker volume create <卷名>
# 删除数据卷
docker volume rm <卷名>
4. 查看和调试
# 查看容器/镜像详情(JSON 格式)
docker inspect <容器名或镜像名>
# 查看资源使用情况(CPU/内存/网络 I/O)
docker stats [容器名...]
# 从容器复制文件到宿主机
docker cp <容器名>:/容器/路径 /宿主机/路径
# 从宿主机复制文件到容器
docker cp /宿主机/路径 <容器名>:/容器/路径
二、Docker Compose YAML 文件的语法规则
下面是 Docker Compose YAML 文件的语法规则和常用字段的详细说明,分为四大部分:YAML 基础、顶层结构、各模块字段详解,以及进阶特性。
YAML 基础
- 缩进
- 使用空格(推荐 2 或 4 个),千万不要使用 Tab。
- 同一级别的键必须对齐,子项比父项多两个空格(或四个空格)。
- 注释
- 使用
#
开头,如:# 这是一个注释 services: web: image: nginx # 指定镜像
- 使用
- 数据类型
- 映射(Mapping / 对象):
key: value
- 序列(Sequence / 列表):
- item
- 标量(Scalar):字符串、数字、布尔值等
- 多行字符串:
description: | 这是多行字符串, 每行都会保留换行符。
- 映射(Mapping / 对象):
- 锚点与别名
- 可定义复用配置:
x-common: &common restart: always services: web: <<: *common image: nginx db: <<: *common image: mysql
- 可定义复用配置:
- 环境变量替换
- 支持
${VAR}
,${VAR:-default}
语法,从环境或.env
文件读取:services: web: image: "${MY_IMAGE:-nginx:latest}"
- 支持
顶层结构
version: "3.9" # 可选,推荐使用最新版本或直接省略
services: # 必需,定义容器服务
...
networks: # 可选,定义网络
...
volumes: # 可选,定义持久化卷
...
configs: # 可选,仅 Swarm 模式
...
secrets: # 可选,仅 Swarm 模式
...
- version
- 指定 Compose 文件版本号(如
3.8
,3.9
)。 - 最新 Compose 规范可以省略
version
,由 Docker Compose 自动识别。
- 指定 Compose 文件版本号(如
- services
- 定义一组容器服务,每个服务对应一个容器或一组同构容器。
- networks、volumes
- 定义自定义网络和卷,供 services 使用。
- configs、secrets
- 仅在 Docker Swarm 中生效,用于配置和机密管理。
各模块字段详解
1. services
services:
<service_name>:
image: nginx:latest # 镜像
build: # 构建
context: ./app
dockerfile: Dockerfile.dev
args:
- NODE_ENV=production
container_name: my-nginx # 容器名称
command: ["nginx", "-g", "daemon off;"] # 启动命令
entrypoint: /docker-entrypoint.sh # 入口点
ports: # 端口映射
- "80:80" # 主机 80 映射到容器 80
- "127.0.0.1:8080:80" # 指定主机 IP
environment: # 环境变量
- DEBUG=1
API_URL: "https://api.example.com"
env_file: # 外部环境文件
- .env
volumes: # 卷挂载
- ./data:/var/lib/data
- logs:/var/log/nginx
networks: # 网络
- frontend
- backend
depends_on: # 依赖服务启动顺序(并不保证健康检查完成)
- db
healthcheck: # 健康检查(v2.1+)
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
restart: "always" # 容器重启策略:no, on-failure, always, unless-stopped
deploy: # Swarm 部署(仅 v3+)
replicas: 3
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
max_attempts: 5
window: 120s
resources:
limits:
cpus: "0.5"
memory: "512M"
reservations:
cpus: "0.25"
memory: "256M"
logging: # 日志驱动
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
2. volumes
volumes:
data: # 命名卷
driver: local
driver_opts:
o: bind
type: none
device: "/path/on/host"
cache:
external: true # 使用外部已创建卷
3. networks
networks:
frontend:
driver: bridge # 默认桥接网络
driver_opts:
com.docker.network.bridge.enable_icc: "true"
backend:
driver: overlay # Swarm 覆盖网络
attachable: true
Compose 项目准备两种网络:
frontend
用于同主机容器间通信的桥接网络,打开了容器互通选项;backend
用于跨主机、Swarm 集群场景的覆盖网络,并且对普通容器开放了加入权限。这样你可以根据服务的需求,选择让它们挂载到不同的网络中,实现隔离与互通的灵活组合。
4. configs 与 secrets(Swarm)
configs:
app_config:
file: ./config/app.conf
secrets:
db_password:
file: ./secrets/db_password.txt
services:
web:
...
configs:
- source: app_config
target: /etc/app/app.conf
secrets:
- db_password
进阶特性
- 多 Compose 文件叠加
docker-compose -f docker-compose.yml -f docker-compose.override.yml up
可用来覆盖默认配置。 - Profiles(Compose 1.28+)
根据 profile 启用/禁用服务:services: debug: image: alpine command: ["sleep", "infinity"] profiles: ["dev"]
启动时使用--profile dev
。 - 扩展字段(x- 前缀)
用于自定义共用配置:x-logging: &default-logging driver: "json-file" options: max-size: "5m" services: a: image: alpine logging: *default-logging
- 环境变量文件(.env)
- 默认会加载同目录下的
.env
,也可通过--env-file
指定。
- 默认会加载同目录下的
- 多项目部署
- 使用
-p
或COMPOSE_PROJECT_NAME
指定项目名前缀,避免命名冲突。
- 使用
三、Docker Compose 命令
假设当前目录下有 docker-compose.yml
,常见操作如下:
# 启动并后台运行所有服务(首次会自动 build)
docker-compose up -d
# 构建或重新构建镜像
docker-compose build
# 查看服务状态
docker-compose ps
# 查看某个服务日志
docker-compose logs <服务名>
# 实时跟踪所有服务日志
docker-compose logs -f
# 停止所有服务
docker-compose stop
# 停止并删除容器、网络、数据卷(除非在 yml 中声明 external)
docker-compose down
# 删除并重建容器(清理旧数据)
docker-compose down --volumes
docker-compose up -d --build
# 扩缩容:指定某个服务的实例数(仅适用于 replicable 服务)
docker-compose up -d --scale <服务名>=<实例数>
# 运行一次性命令,不会启动所有服务
docker-compose run --rm <服务名> <命令>
# 示例:在 web 服务容器中执行 shell
docker-compose run --rm web /bin/bash
Tip:在 Docker Compose v2 中,也可用
docker compose
(空格)替代docker-compose
(减号):docker compose up -d docker compose down
三、常用组合示例
- 构建、启动、查看日志
docker-compose build docker-compose up -d docker-compose logs -f
- 一键重启清洁环境
docker-compose down --volumes --remove-orphans docker-compose up -d --build
- 进入某服务的终端
docker-compose exec <服务名> /bin/bash