Docker Compose
假设我们要创建一个商城项目,需要:
Spring Boot
MySQL
Redis
RabbitMQ
Nginx按照之前的学习,我们需要执行:
docker run ...
docker run ...
docker run ...
docker run ...
docker run ...每一个服务都需要对应的执行命令,并且还要配合各种版本号、参数、端口号、路径等指令。
docker run \
-p 3306:3306 \
-v mysql_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--network shop-network \
--name mysql \
mysql:8而且这些还都要牢牢记住,因为一旦服务器重装还需要重新执行一遍。
Docker Compose 正是解决了这一问题
Docker Compose 解决什么?
将多个 docker run 写成一个配置文件。
从前:
docker run mysql
docker run redis
docker run rabbitmq
docker run springboot现在:
compose.yaml只要执行一条命令:
docker compose up就可以全部启动。
一个compose.yaml示例
services:
mysql:
image: mysql:8
ports:
- "3306:3306"
redis:
image: redis:7
ports:
- "6379:6379"
app:
image: shop:v1
ports:
- "8080:8080"有格式化的配置文件,相比于繁琐的执行命令,更加清晰。
关键字
services
services:意思是包含了哪些服务。
services:
mysql:
redis:
app:这个例子中包含三个服务,分别是 MySQL、Redis 和 Spring Boot,启动时就是三个 Container。
image
使用的Image。
mysql:
image: mysql:8这里表示的就是 mysql 使用的 mysql:8 这个 Image
ports
使用的端口号。
mysql:
...
ports:
- "3306:3306"它相当于:
docker run -p 8080:8080设置了宿主机和Container的映射。
左边是宿主机,右边是Container。
volumes
mysql:
...
volumes:
- mysql_data:/var/lib/mysql数据库的数据持久化的地址。
- mysql_data: 表示Docker在宿主机创建了一个目录,这个目录的名字叫 mysql_data,用于存储数据
- /var/lib/mysql: 容器内的路径
注意:即便是windows系统这么写也是正常的,因为它会存在 Docker Desktop 的 Linux VM 中。
environment
例如:
MySQL 需要密码
以前:
docker run -e MYSQL_ROOT_PASSWORD=123456Compose:
mysql:
...
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: todos- MYSQL_ROOT_PASSWORD:指定密码
- MYSQL_DATABASE:指定数据库名称
depends_on
启动顺序
depends_on:
- mysql
- redis表示先启动 MySQL 再启动 Spring Boot。
network
Compose 默认自动创建 Network
所以 Spring Boot 可以直接连接 MySQL。
命令
用于在终端执行控制 compose.yaml 的命令
docker compose up
启动所有服务
读取compose.yaml
↓
创建Network
↓
创建Volume
↓
下载Image
↓
创建Container
↓
全部启动docker compose down
停止所有服务
停止Container
↓
删除Container
↓
删除Network注意:Volume 默认不会删除
Java项目示例
假如:有一个Spring Boot项目,需要 MySQL 和 Redis。
MySQL 和 Redis使用Docker Hub上的镜像。
1.Spring Boot 打包
mvn clean package得到:
target/
mail.jar2.编写 Dockerfile
FROM eclipse-temurin:21-jre
WORKDIR /app
COPY target/mall.jar app.jar
ENTRYPOINT ["java","-jar","app.jar"]3.编写 docker-compose.yml
在Spring Boot项目根目录,创建 docker-compose.yml
target
Dockerfile
pom.xml
docker-compose.yml (+)编写内容:
services:
mysql:
image: mysql:8
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: mall
ports:
- "3306:3306"
redis:
image: redis:7
container_name: redis
ports:
- "6379:6379"
app:
build: .
container_name: mall
ports:
- "8080:8080"
depends_on:
- mysql
- redisbuild . 表示使用当前目录下的 Dockerfile 来构建镜像。
执行
docker compose up