外观
Docker Compose
介绍
Docker Compose 是 Docker 提供的一个工具,用于定义和运行多容器 Docker 应用。通过 Docker Compose,可以使用一个 YAML 文件(docker-compose.yml)来定义多个容器的配置,并通过单一命令启动所有容器。Docker Compose 使得管理和编排多个 Docker 容器变得更简单,特别适合开发环境和微服务架构的应用。
在一个有 docker compose 文件的目录,可以执行以下命令。
| 指令 | 代码 |
|---|---|
| 上线 | docker compose up -d |
| 下线 | docker compose down |
| 启动部分容器 | docker compose start x1 x2 ... |
| 停止部分容器 | docker compose stop x1 x2 ... |
| 扩容 | docker compose scale x2=x3 |
我们以启动一个 WordPress 系统为例,如果使用命令的方式启动,需要输入下面的代码。
#创建网络
docker network create blog
#启动mysql
docker run -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=wordpress \
-v mysql-data:/var/lib/mysql \
-v /app/myconf:/etc/mysql/conf.d \
--restart always --name mysql \
--network blog \
mysql:8.0
#启动wordpress
docker run -d -p 8080:80 \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=123456 \
-e WORDPRESS_DB_NAME=wordpress \
-v wordpress:/var/www/html \
--restart always --name wordpress-app \
--network blog \
wordpress:latest接下来,我们手写一个 docker compose 文件,实现和上面一样的功能,并且可以便捷地管理和本项目相关的容器。
语法
前面已经介绍过了,docker compose 文件是 YAML 格式的,它的最顶层可以是以下元素:
| 符号 | 意义 |
|---|---|
services | 服务 |
networks | 网络 |
volumes | 卷 |
configs | 配置 |
secrets | 密钥 |
其中,前三项用的最多,后两项基本不用。
示例:
version: '3.8' # 设置 Docker Compose 的版本为 3.8
services:
wordpress:
image: wordpress:latest # 使用官方的最新版本的 WordPress 镜像
container_name: wordpress # 设置容器名称为 wordpress
restart: always # 设置容器始终重启,除非手动停止
ports:
- "8080:80" # 将本地的 8080 端口映射到容器的 80 端口,访问 WordPress 网站
environment: # 设置容器的环境变量
WORDPRESS_DB_HOST: db:3306 # 设置 WordPress 数据库主机为 db 服务,端口为 3306
WORDPRESS_DB_NAME: wordpress # 设置数据库名称为 wordpress
WORDPRESS_DB_USER: root # 设置 WordPress 数据库的用户名为 root
WORDPRESS_DB_PASSWORD: example # 设置 WordPress 数据库的密码为 example
volumes:
- wordpress_data:/var/www/html # 将名为 wordpress_data 的卷挂载到容器的 /var/www/html 目录,用于保存 WordPress 数据
networks:
- wordpress_network # 将容器连接到名为 wordpress_network 的网络
depends_on:
db: # 设置依赖关系,确保 db 服务处于健康状态才启动 wordpress 服务
condition: service_healthy # 仅在 db 服务健康时启动 wordpress
db:
image: mysql:8.0 # 使用 MySQL 8.0 官方镜像
container_name: mysql # 设置容器名称为 mysql
restart: always # 设置容器始终重启,除非手动停止
environment: # 设置 MySQL 容器的环境变量
MYSQL_ROOT_PASSWORD: example # 设置 MySQL root 用户的密码为 example
MYSQL_DATABASE: wordpress # 设置创建的数据库名称为 wordpress
MYSQL_INITDB_SKIP_TZINFO: 1 # 跳过时区信息的初始化
command:
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci # 设置 MySQL 字符集为 utf8mb4,适应更广泛的字符编码
volumes:
- db_data:/var/lib/mysql # 将名为 db_data 的卷挂载到容器的 /var/lib/mysql 目录,用于持久化数据库数据
networks:
- wordpress_network # 将容器连接到名为 wordpress_network 的网络
healthcheck: # 配置健康检查,确保 MySQL 服务正常运行
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"] # 使用 mysqladmin 命令检查数据库是否可用
interval: 10s # 每 10 秒检查一次
retries: 5 # 如果连续 5 次失败,则认为健康检查失败
start_period: 30s # 在容器启动后等待 30 秒开始健康检查
timeout: 10s # 每次健康检查的超时时间为 10 秒
volumes:
wordpress_data: # 定义一个名为 wordpress_data 的卷
db_data: # 定义一个名为 db_data 的卷
networks:
wordpress_network: # 定义一个名为 wordpress_network 的网络
driver: bridge # 使用 bridge 驱动程序,默认的网络模式docker-compose -f compose.yaml up -d
当 compose.yaml 文件内容发生改变时,再次运行 docker-compose -f compose.yaml up -d 即可,Docker 会自动检测配置文件什么被改变了。
如果要关闭和这个项目有关的容器,可以使用 docker-compose down -f compose.yaml down,但为了安全起见,Docker 不会移除已创建的卷、网络等资源。