compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过一个 YAML 文件(通常命名为 docker-compose.yamlcompose.yaml),你可以配置所有服务、网络和卷,然后使用一条命令启动整个应用。

特性

增量更新

  • 当你修改 docker-compose.yaml 文件并重新启动应用时,Docker Compose 只会重新启动被修改的服务,其他服务不受影响。

数据持久化

  • 默认情况下,即使使用 docker-compose down 停止应用,挂载的卷也不会被删除,确保数据安全。

文件结构

Docker Compose 文件是一个 YAML 文件,通常包含以下部分:

version

指定 Docker Compose 文件的版本(可选)。

1version: '3.8'

services

定义所有需要运行的服务(容器)。每个服务可以配置镜像、端口、环境变量、卷等。

image

指定服务使用的镜像。

1services:
2  web:
3    image: nginx:latest

ports

映射主机端口到容器端口。

1services:
2  web:
3    ports:
4      - "8080:80"

environment

设置环境变量。

1services:
2  db:
3    environment:
4      MYSQL_ROOT_PASSWORD: my-secret-pw

volumes

挂载主机目录或 Docker 卷到容器内部。

1services:
2  web:
3    volumes:
4      - ./html:/usr/share/nginx/html

restart

设置容器的重启策略。

1services:
2  web:
3    restart: always

networks

指定服务加入的网络。

1services:
2  web:
3    networks:
4      - my-network

depends_on

指定服务之间的依赖关系。

1services:
2  web:
3    depends_on:
4      - db

volumes

定义数据卷,用于持久化数据。

1volumes:
2  my-data:

networks

定义自定义网络,用于容器之间的通信。

1networks:
2  my-network:
3    driver: bridge

使用

启动应用

使用以下命令启动应用:

1docker compose -f compose.yaml up -d

先创建网络

再创建卷

然后容器

1docker ps

停止应用

使用以下命令停止应用:

会移除所有容器和网络,但不会删除卷

1docker compose -f compose.yaml down

强制删除所有资源

如果需要删除卷和镜像,可以使用以下命令:

1docker compose -f compose.yaml down --rmi all -v

示例

1version: '3.8'
2
3services:
4  web:
5    image: nginx:latest
6    ports:
7      - "8080:80"
8    volumes:
9      - ./html:/usr/share/nginx/html
10    networks:
11      - my-network
12    depends_on:
13      - db
14
15  db:
16    image: mysql:5.7
17    environment:
18      MYSQL_ROOT_PASSWORD: my-secret-pw
19    volumes:
20      - my-data:/var/lib/mysql
21    networks:
22      - my-network
23
24volumes:
25  my-data:
26
27networks:
28  my-network:
29    driver: bridge