Docker Compose 快速参考 - 最有用的命令及示例
顺便说一下,docker-compose 与 docker compose 是不同的……
目录
以下是 Docker Compose 快速参考 ,包含注释示例,帮助您快速掌握 Compose 文件和命令。
Compose 文件参考:docker-compose.yml
核心结构:
version: '3' # Compose 文件格式版本
services:
web:
image: nginx:latest
ports:
- "8080:80" # 主机端口 8080:容器端口 80
db:
image: postgres
environment: # 环境变量
POSTGRES_PASSWORD: example
volumes:
- db_data:/var/lib/postgresql/data
networks: # 自定义网络
appnet:
driver: bridge
volumes: # 命名卷
db_data:
- services:您多容器应用中的每个容器。在上面的例子中,我们有两个服务:
web
和db
。 - networks & volumes:定义隔离网络和持久存储 - 我们在这里有
appnet
网络和db_data
卷。
示例
单服务与端口映射
services:
app:
build: .
ports:
- "8000:80" # 主机端口 8000:容器端口 80
在主机端口 8000 上暴露应用,并从当前目录中的 Dockerfile 构建。
多服务,共享卷和自定义网络
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- type: bind
source: ./app
target: /app
networks:
- mynet
db:
image: postgres
volumes:
- db_data:/var/lib/postgresql/data
networks:
- mynet
networks:
mynet:
volumes:
db_data:
Web 和 DB 在同一个网络上;DB 使用持久化命名卷 - db_data
。
使用构建上下文和 Dockerfile 路径
您可以根据在 docker-compose.yml 中指定的 Dockerfile 构建 docker 镜像。
services:
app:
build:
context: .
dockerfile: docker/MyDockerfile
服务间共享数据
services:
web:
image: nginx
volumes:
- shared_data:/usr/share/nginx/html
worker:
image: myworker
volumes:
- shared_data:/usr/src/app/data
volumes:
shared_data:
两个服务访问相同的卷(用于静态文件或数据交换)- shared_data
。
高级 Compose 文件选项
- environment:为容器设置环境变量。
- depends_on:控制服务启动顺序。
- deploy.replicas:在 Swarm 模式下扩展服务。
示例:
services:
web:
image: nginx
deploy:
replicas: 3
depends_on:
- db
启动 3 个 web 实例;仅控制启动顺序(不控制就绪状态)。
Docker Compose 必备命令
命令 | 描述 | 示例用法 |
---|---|---|
docker-compose up |
创建并启动容器 | docker-compose up |
docker-compose up -d |
在后台运行 | docker-compose up -d |
docker-compose exec |
在运行的容器中执行命令 | docker-compose exec web bash |
docker-compose build |
构建/重新构建镜像 | docker-compose build |
docker-compose down |
停止并删除容器、网络、卷和镜像 | docker-compose down |
docker-compose logs -f |
查看并跟踪日志 | docker-compose logs -f |
docker-compose ps |
列出正在运行的容器 | docker-compose ps |
docker-compose run |
运行一次性命令(绕过 Compose 文件中的命令) | docker-compose run web python manage.py migrate |
docker-compose stop |
停止运行中的容器(可以使用 start 重新启动) |
docker-compose stop |
docker-compose restart |
重启服务 | docker-compose restart web |
docker-compose pull |
拉取服务镜像 | docker-compose pull |
docker-compose rm |
删除已停止的服务容器 | docker-compose rm web |
docker-compose config |
验证并查看 Compose 文件 | docker-compose config |
docker-compose up --scale web=3 |
启动服务的多个实例 | docker-compose up --scale web=3 |
常见 Compose 模式
-
带有持久数据的数据库
services: mysql: image: mysql environment: MYSQL_ROOT_PASSWORD: password volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:
DB 数据在
mysql_data
卷中持久化,即使容器重启也不会丢失。 -
开发时绑定挂载代码
services: app: build: . volumes: - .:/app
在主机上实时编辑代码,自动反映在容器中。
有用的标志
-d
:分离模式(在后台运行)。--build
:在启动前强制重新构建镜像。--force-recreate
:即使未更改,也重新创建容器。--remove-orphans
:删除 Compose 文件中未定义的容器。
定义和自定义服务
您可以通过利用 docker-compose.yml
文件来 定义和自定义服务、网络和卷,该文件集中了所有应用程序的配置和编排需求。
- 服务 在
services
键下定义。 - 每个服务代表一个容器配置,您可以设置:
- Image:从 Docker Hub 或其他注册表选择一个镜像。
- Ports:将容器端口映射到主机端口。
- Environment variables:传递配置值。
- Volumes:持久化数据或与主机或其他服务共享文件/文件夹。
- Networks:控制服务可以访问的网络。
示例:
services:
web:
image: nginx:latest
ports:
- "8080:80" # 主机端口 8080:容器端口 80
environment:
- NGINX_HOST=localhost
volumes:
- web_data:/usr/share/nginx/html
networks:
- frontend
db:
image: postgres:13
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: secret
volumes:
- db_data:/var/lib/postgresql/data
networks:
- backend
- 在这里,
web
服务使用了 nginx 镜像,设置了环境变量,挂载了卷,将容器的 80 端口映射到主机的 8080 端口,并连接到frontend
网络。db
服务对 PostgreSQL 做了类似的操作。
自定义网络
- 网络 控制哪些服务可以通信。Compose 会创建一个默认网络,但您可以定义更多,指定自定义驱动,设置选项,并确定哪个服务加入哪个网络以实现细粒度的隔离。
- 在顶级的
networks
下定义网络,并在服务级别使用networks
键列出服务应连接的网络。
示例:
networks:
frontend:
driver: bridge
backend:
driver: bridge
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
- 将网络连接到服务:
services:
app:
networks:
- frontend
- backend
db:
networks:
- backend
- 此设置允许
app
服务访问frontend
和backend
网络上的用户,而db
服务只能在backend
网络上访问。
自定义卷
- 卷 在顶级的
volumes
键下定义。使用服务下的volumes
键将它们挂载到容器中。 - 卷可以命名,使用自定义驱动,并在多个服务之间共享以实现数据持久化和共享。
示例:
volumes:
web_data: # 用于网页内容的命名卷
db_data: # 用于数据库的命名卷
services:
web:
volumes:
- web_data:/usr/share/nginx/html
db:
volumes:
- db_data:/var/lib/postgresql/data
- 在这个示例中,
web_data
被持久化,并且对任何挂载它的容器都可用。db_data
确保数据库数据在容器重新创建时不会丢失。 - 您可以为高级情况定义带有自定义驱动选项的绑定挂载:
volumes:
db_data:
driver: local
driver_opts:
type: none
device: /data/db_data
o: bind
- 此配置将主机路径
/data/db_data
绑定挂载到容器中。
最佳实践总结:
- 使用服务名称作为 DNS 主机名进行服务间通信。
- 根据需要将服务连接到多个网络以控制访问。
- 使用命名卷进行持久存储和数据共享。
- 使用 YAML 定义所有内容,实现版本控制和易于部署脚本。
多个 Compose 文件
为了 组织复杂的多服务设置,在 Docker Compose 中,您可以使用 多个 Compose 文件和覆盖文件,实现模块化、环境特定和可扩展的配置。以下是其工作方式:
- 基础和覆盖文件结构
- 创建一个基础文件(
compose.yaml
或docker-compose.yml
),其中包含所有通用的默认服务定义。 - 添加环境特定的覆盖文件(例如,
docker-compose.override.yml
、docker-compose.dev.yml
、docker-compose.prod.yml
)。
示例文件结构:
/project-directory
|-- docker-compose.yml # 基础配置
|-- docker-compose.override.yml # 本地/开发覆盖(自动应用)
|-- docker-compose.prod.yml # 生产覆盖
|-- docker-compose.test.yml # 测试覆盖(如果需要)
基础配置定义核心服务,而每个覆盖文件为特定环境或情况自定义设置。
- 文件覆盖的工作方式
- 合并: 当您运行
docker compose up
时,Docker Compose 会按照顺序合并基础文件和任何覆盖文件;后续文件会覆盖、扩展或添加前面文件中的设置。 - 覆盖字段: 如果某个服务或字段在多个文件中定义,最后一个指定文件的值将被使用。新字段将被添加。
示例合并:
docker-compose.yml
:services: web: image: myapp ports: - "8000:80"
docker-compose.override.yml
:services: web: environment: - DEBUG=true
- 结果:
web
服务使用基础镜像和端口,以及覆盖的DEBUG
环境变量。
- 多个文件的命令使用
- 默认行为: 如果存在,Docker Compose 会自动加载
docker-compose.override.yml
与docker-compose.yml
一起运行任何命令。 - 手动指定文件: 使用
-f
标志控制合并哪些文件以及顺序:docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
- 这会忽略默认覆盖文件,使用生产特定的设置。
- 实用组织策略
- 环境分离: 每个环境使用一个覆盖文件:开发、测试、生产等。
- 微服务和团队: 将配置拆分为不同服务或团队的单独文件,并根据需要合并。
- 功能切换: 额外文件可以引入或移除临时需求的可选服务或配置(例如,一个
compose.debug.yml
用于额外日志)。
- 优势
- 清晰度: 保持单个文件小而专注。
- 可扩展性: 轻松添加新服务、环境或设置。
- 可维护性: 仅更改或审查特定部署的相关部分。
- 示例:切换环境
开发:
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
生产:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
每个环境仅获取其所需的配置,所有共享配置都在基础文件中。
使用多个文件组织复杂的 Compose 设置,并利用覆盖/合并系统,确保模块化、环境特定的自定义和大型多服务 Docker 应用程序的轻松扩展。