Docker Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

定义一个YAML格式的配置文件docker-compose.yml,写好对个容器之间的调用关系。然后,只要一个命令就能同时启动/关闭这些容器。

Docker建议我们每个容器中只运行一个服务,因此需要docker compose多服务部署的工具。

安装Compose

Reference地址:Reference | Docker Documentation

Install地址: Manuals | Docker Documentation

CentOS 安装举例:手动安装

DOCKER_CONFIG=${DOCKER_CONFIG:-/usr/local/lib/docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose

第一行代码详见${}的详细用法

下载慢的话可以使用国内镜像源

curl -SL https://get.daocloud.io/docker/compose/releases/download/v2.16.0/docker-compose-`uname -s`-`uname -m` -o $DOCKER_CONFIG/cli-plugins/docker-compose

如果还是慢,可在本地下载完成后,上传到/usr/local/lib/docker/cli-plugins/,并改名

mv docker-compose-linux-x86_64 docker-compose

添加可执行权限

sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose

查看是否安装成功

# docker compose version
Docker Compose version v2.16.0

Compose核心概念

一文件

  • docker-compose.yml

两要素

  • 服务(service):一个个应用容器实例

  • 工程(project):一组关联的应用容器组成的完整单元,在文件中定义

Compose命令

命令 描述
docker compose -h 查看帮助
docker compose up 启动所有docker compose服务
docker compose up -d 启动所有docker compose服务并后台运行
docker compose down 停止并删除容器、网络、卷、镜像
docker compose exec id /bin/bash 进入容器实例内部,docker-compose.yml中的id
docker compose ps 展示当前docker compose编排过的运行的容器
docker compose top 展示当前docker compose编排过的容器进程
docker compose logs id 查看容器输出日志
docker compose config 检查配置
docker compose config -q 检查配置,有问题才输出
docker compose restart 重启服务
docker compose start 启动服务
docker compose stop 停止服务

Compose实战

准备项目

项目下载地址:

数据库脚本

使用user表作为案例,其脚本如下:

CREATE TABLE `tb2023`.`t_user`  (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT,
`username` varchar(50) NULL COMMENT '用户名',
`password` varchar(50) NULL COMMENT '密码',
`gender` tinyint NULL COMMENT '性别 0=女 1=男',
`version` int DEFAULT '1' COMMENT '乐观锁',
`deleted` tinyint unsigned DEFAULT '1' COMMENT '删除标志,默认0不删除 1删除',
`create_time` timestamp NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
);

项目配置文件

application.yml
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://172.31.193.36:3306/tb2023?useSSL=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
redis:
host: 172.31.193.36
port: 6379
password: 123456
lettuce:
pool:
max-active: 10
max-idle: 10
min-idle: 1
time-between-eviction-runs: 10s

从配置文件中可以看到项目包含了:

  • MySQL
  • Redis

注意:这里mysql和redis的IP地址固定了,使用的是Linux系统的IP地址,使用ip addr可查看eth0的IP。

构建镜像

编写Dockerfile文件

Dockerfile
FROM openjdk:8
COPY *.jar /app.jar

CMD ["--server.port=8080"]
EXPOSE 8080

ENTRYPOINT ["java", "-jar", "/app.jar"]

使用maven打包项目,将Dockerfile和jar一块上传到服务器

打包镜像

docker build -t docker-spring-boot .

查看镜像

[root@swcode compose]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-spring-boot latest 559521cb1212 10 seconds ago 573MB
idea-demo latest 1e0b48277189 28 hours ago 544MB

不使用Compose

单独启动MySQL容器

启动MySQL容器

docker run -d -p 3306:3306 --name mysql8 --privileged=true -v /compose/mysql/conf:/etc/mysql/conf.d -v /compose/mysql/logs:/logs -v /compose/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8

进入容器

docker exec -it mysql8 bash

登陆mysql,密码是123456

mysql -u root -p

创建数据库tb2023

create database tb2023;

创建t_user

CREATE TABLE `tb2023`.`t_user`  (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT,
`username` varchar(50) NULL COMMENT '用户名',
`password` varchar(50) NULL COMMENT '密码',
`gender` tinyint NULL COMMENT '性别 0=女 1=男',
`version` int DEFAULT '1' COMMENT '乐观锁',
`deleted` tinyint unsigned DEFAULT '1' COMMENT '删除标志,默认0不删除 1删除',
`create_time` timestamp NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
);

单独启动Redis容器

下载配置文件:https://redis.io/docs/management/config/

修改以下几项

appendonly yes
# bind 127.0.0.1
requirepass 123456

启动Redis容器

docker run -p 6379:6379 --name redis708 --privileged=true -v /compose/redis/redis.conf:/etc/redis/redis.conf -v /compose/redis/data:/data -d redis:7.0.8 redis-server /etc/redis/redis.conf

查看是否启动成功

docker ps

单独启动项目容器

启动项目

docker run -d -p 8080:8080 docker-spring-boot

查看是否启动成功

[root@swcode compose]# docker ps
CONTAINER ID IMAGE PORTS NAMES
46f1c4741b04 docker-spring-boot 0.0.0.0:8080->8080/tcp priceless_bassi
19e0fdd1a65f redis:7.0.8 0.0.0.0:6379->6379/tcp redis708
69615c89a053 mysql:8 0.0.0.0:3306->3306/tcp, 33060/tcp mysql8

测试项目

访问Swagger接口:http://ip:8080/swagger-ui/index.html

使用Compose编排

docker-compose文件

docker-compose.yml
version: "3"

services:
microService:
image: docker-spring-boot
container_name: ms01
ports:
- "8080:8080"
volumes:
- /compose/microService:/data
networks:
- ms01_net
depends_on:
- redis
- mysql

redis:
image: redis:7.0.8
ports:
- "6379:6379"
volumes:
- /compose/redis/redis.conf:/etc/redis/redis.conf
- /compose/redis/data:/data
networks:
- ms01_net
command: /usr/local/bin/redis-server /etc/redis/redis.conf

mysql:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'tb2023'
MYSQL_USER: 'swcode'
MYSQL_PASSWORD: '123456'
ports:
- "3306:3306"
volumes:
- /compose/mysql/data:/var/lib/mysql # 挂载数据
- /compose/mysql/conf:/etc/mysql/conf.d # 挂载配置文件
- /compose/mysql/db:/docker-entrypoint-initdb.d # 挂载配置文件
- /compose/mysql/logs:/logs # 挂载日志
networks:
- ms01_net
command: --default-authentication-plugin=mysql_native_password # 解决外部无法访问

networks:
ms01_net:

修改项目配置

通过服务名访问,IP无关

更改IP为服务名

application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql:3306/tb2023?useSSL=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
redis:
host: redis
port: 6379
password: 123456
lettuce:
pool:
max-active: 10
max-idle: 10
min-idle: 1
time-between-eviction-runs: 10s

重新打包上传到服务器,重新构建

docker rmi -f docker-spring-boot
docker build -t docker-spring-boot .

启动所有容器项目

清空所有容器

docker rm -f $(docker ps -aq)

创建配置文件/compose/redis/redis/redis.conf

Redis配置文件,下载地址:https://redis.io/docs/management/config/。

修改以下几项

appendonly yes
bind 0.0.0.0
requirepass 123456

执行启动命令

docker-compose.yml所在目录
docker compose up -d

查看运行的服务

[root@swcode compose]# docker ps
CONTAINER ID IMAGE PORTS NAMES
06a1106838a6 docker-spring-boot 0.0.0.0:8080->8080/tcp ms01
34559844510c redis:7.0.8 0.0.0.0:6379->6379/tcp compose-redis-1
492dd67129a8 mysql:8 0.0.0.0:3306->3306/tcp, 33060/tcp compose-mysql-1

测试项目

访问Swagger接口:http://ip:8080/swagger-ui/index.html

停止项目

docker compose stop