§1 容器编排
Compose 是一个用于定义以及运行多个 Docker 容器的工具。
通过 YAML 文件配置应用服务,随后通过单个命令即可从这个配置创建并开启所有服务
容器编排可以应用于所有环境
- 开发
- 测试
- 模拟
- 生产
- CI 工作流
作用
- 明确启动顺序
- 批量管理服务声明周期
- 灵活管理服务间关系
§2 指令
查看帮助
docker-compose -h
启动所有 compose 服务
docker-compose up
后台启动所有 compose 服务
docker-compose up -d
停止并删除容器、网络、卷、镜像
docker-compose down
进入容器内部
docker-compose exec dockerf-compose.yml中服务名 /bin/bash
查看经过 docker-compose 的所有运行中容器
docker-compose ps
查看经过 docker-compose 的所有容器进程
docker-compose top
开启经过 docker-compose 的所有服务
docker-compose start
重启经过 docker-compose 的所有服务
docker-compose restart
停止经过 docker-compose 的所有服务
docker-compose stop
查看容器输出日志
docker-compose logs dockerf-compose.yml中服务名
查看配置
docker-compose config
查看配置,只输出有问题的部分
docker-compose config -q
无输出说明 dockerf-compose.yml 中没有语法问题
§3 使用
§3.1 Docker Compose 的获取
安装
官网安装指南
下面示例使用手动安装
-
查看 docker 安装位置
whereis docker
-
下面示例将
docker compose
与 docker 安装在同路径
curl -SL https://github.com/docker/compose/releases/download/v2.7.0/docker-compose-linux-x86_64 -o /usr/bin/docker-compose
-
增加权限
chmod +x /usr/bin/docker-compose
-
验证安装
docker compose version
基本流程
- 通过 Dockerfile 文件 定义应用环境
以便通过复制 Dockerfile 的方式随处复制这个定义过程 - 在 dockerf-compose.yml 中定义组成应用的各个服务
这可以使这些服务可以在独立的环境中一起运行 - 通过
docker compose up
指令开始并运行整个应用
此指令可以通过 Docker compose 命令行 和 Compose standalone(二进制版 `docker-compose) 运行
dockerf-compose.yml 版本对照
dockerf-compose.yml 拥有多种版本,需要考虑 Docker Engine 版本
点击查看 Docker 官网版本对照
docker-compose.yml 示例
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
- logvolume01:/var/log
depends_on:
- redis
redis:
image: redis
volumes:
logvolume01: {}
§3.2 Docker Compose 使用示例
编写 docker-compose.yml 文件
- version
用于标记当前 docker-compose.yml 文件的版本
参考 版本对照 - services
其下包含多个 service
每一个 service 都相当于一条docker run
指令
service 可选的指定 容器名(container_name)- 指定时,经过
docker-compose up
启动的容器 就叫那个名字 - 不指定时,容器名是 当前 service 的服务名增加前后缀
- 指定时,经过
- networks
其下包含多个 network
每一个 network都相当于一条docker network create
指令
version: "3"
# 整个 services 段,相当于一条一条的 docker run 指令的集合
services:
seataSoService:
image: seata-so-service
container_name: so1
ports:
- "8001:8000"
volumes:
- /app/seataSoService:/data
networks:
- net_tomcat_01
depends_on:
- redis
- mysql
redis_01:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /app/reids:redis.conf:/etc/redis/redis.conf
- /app/redis/data:/data
networks:
- net_tomcat_01
command:
- redis-server /etc/redis/redis.conf
mysql_01:
image: mysql:5.7
environment:
mysql_root_password: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'learning'
MYSQL_USER: 'user1'
MYSQL_PASSWORD: '111111'
ports:
- "3306:3306"
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- app/mysql/init:/docker-[entrypoint-initdb.d
networks:
- net_tomcat_01
# 解决外部无法访问问题
command:
- --default-authentication-plugin=mysql_native_password
networks:
net_tomcat_01:
调整微服务配置
基于上面的 docker-compose.yml 文件,各个微服务配置需要做出调整
微服务 对 其他微服务或中间件的配置中,基于 IP 或 服务名 的部分,改为基于 docker-compose.yml 中配置的服务名(此服务名 约等于容器名),这是因为
- 微服务之间的依赖,现在转变为对 包含不同微服务的容器 之间的依赖了
- 微服务对中间件等基础设施的依赖,现在转变为 对 包含中间件或基础设施的容器 依赖了
以 seataSoService 服务下 mysql 配置为例
spring:
application:
name: seata-so-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.gjt.mm.mysql.Driver # 注意
url: jdbc:mysql://mysql_01:3306/SO?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
username: root
password: root
服务打包
整个 docker-compose 涉及的所有服务的bao
以及其他组件传输至服务器
上例中,包含
- seataSoService
- redis:6.0.8
- mysql:5.7
启动
docker-compose up -d