Skip to content

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

只要执行一条命令:

bash
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=123456

Compose:

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.jar

2.编写 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
      - redis

build . 表示使用当前目录下的 Dockerfile 来构建镜像。

执行

docker compose up