第22章 Docker三剑客之Docker Compose实践案例

1,423 阅读8分钟

本文介绍了使用 Docker Compose 管理多容器应用的实践:布道师学习通,特别是如何通过一个 docker-compose.yml 文件配置 MySQL 和 Redis 数据库以及多个服务(如 budaos_com-stp-mgr, budaos_com-stp-evgl, budaos_com-stp-sp),确保数据库优先启动,并实现一键部署。文中还提供了关于加速镜像下载、配置 Docker 远程访问等常见问题的解决方案。

Docker Compose简介

Docker Compose 是 Docker 官方提供的一个工具,用于定义和运行多容器的 Docker 应用程序。通过使用 Docker Compose,用户可以利用 YAML 文件来配置应用程序的服务,然后通过一条命令即可启动所有服务,并且这些服务将自动在网络中连接起来。这大大简化了在本地开发环境中的应用部署流程,同时也使得跨环境(如从开发到生产)迁移变得更加容易。

任务描述

使用Docker Compose管理多个容器,实现一条命令启动部署布道师学习通服务,并设置容器的启动先后顺序 在应用程序启动前,先优先启动MySQL和redis数据库。

image.png

任务准备

  1. Docker环境已经安装
  2. Docker compose已经安装
  3. 熟练使用docker和docker compse常用命令

任务实施

1.编写docker-compose.yml

#version: '3.8'

networks:
  cbnet:
    driver: bridge
    ipam:
      config:
        - subnet: 172.5.0.0/16
          gateway: 172.5.0.1

services:
  mysql:
    image: mysql:8.0.39
    container_name: mysql  # 指定容器名称
    #resources:
      #limits:
        #memory: 3072M  # 3GB 的内存限制
        #memory_swap: 4096M  # 4GB 的内存交换空间限制
    networks:
      cbnet:
        ipv4_address: 172.5.0.200
    environment:
      MYSQL_ROOT_PASSWORD: budaos_com
    ports:
      - "3306:3306"
    volumes:
      - /budaos_com/data/mysql:/var/lib/mysql  # 保留 MySQL 数据卷的映射
      - /etc/my.cnf:/etc/mysql/my.cnf
      - /etc/localtime:/etc/localtime:ro  # 挂载宿主机的时区文件,解决慢8个小时的问题
    restart: always  # 设置自动重启策略

  redis:
    image: redis:7.4.1
    container_name: redis  # 指定容器名称
    networks:
      cbnet:
        ipv4_address: 172.5.0.107
    command: ["redis-server", "--requirepass", "budaos_com_www_123456"]
    ports:
      - "6379:6379"
    volumes:
      - /budaos_com/data/redis:/data  # 保留 Redis 数据卷的映射
      - /etc/localtime:/etc/localtime:ro  # 挂载宿主机的时区文件,解决慢8个小时的问题
      #- /etc/timezone:/etc/timezone:ro  # 挂载宿主机的时区文件
    restart: always  # 设置自动重启策略

  budaos_com-stp-mgr:
    image: budaos_com/budaos_com-stp-mgr:latest  # 替换为实际的镜像名称
    container_name: budaos_com-stp-mgr  # 指定容器名称
    networks:
      cbnet:
        ipv4_address: 172.5.0.205
    ports:
      - "9205:9084"  # 将9205映射到9084
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://172.5.0.200:3306/budaos_com-stp  # 替换为实际的数据库名称
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: budaos_com
      SPRING_REDIS_HOST: 172.5.0.107
      SPRING_REDIS_PASSWORD: budaos_com_www_123456
    depends_on:
      - mysql
      - redis
    volumes:
      - /budaos_com/data/budaos_com-stp/uploads:/mnt/cbstp/uploads  # 只为该服务映射
    restart: always  # 设置自动重启策略

  budaos_com-stp-evgl:
    image: budaos_com/budaos_com-stp-evgl:latest  # 替换为实际的镜像名称
    container_name: budaos_com-stp-evgl  # 指定容器名称
     #resources:
      #limits:
        #memory: 3072M  # 3GB 的内存限制
        #memory_swap: 4096M  # 4GB 的内存交换空间限制
    networks:
      cbnet:
        ipv4_address: 172.5.0.204
    ports:
      - "9204:9084"  # 将9204映射到9084
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://172.5.0.200:3306/budaos_com-stp  # 替换为实际的数据库名称
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: budaos_com
      SPRING_REDIS_HOST: 172.5.0.107
      SPRING_REDIS_PASSWORD: budaos_com_www_123456
    depends_on:
      - mysql
      - redis
    volumes:
      - /budaos_com/data/budaos_com-stp/uploads:/mnt/cbstp/uploads  # 只为该服务映射
    restart: always  # 设置自动重启策略

  budaos_com-stp-sp:
    image: budaos_com/budaos_com-stp-sp:latest  # 替换为实际的镜像名称
    container_name: budaos_com-stp-sp  # 指定容器名称
     #resources:
      #limits:
        #memory: 3072M  # 3GB 的内存限制
        #memory_swap: 4096M  # 4GB 的内存交换空间限制
    networks:
      cbnet:
        ipv4_address: 172.5.0.206
    ports:
      - "9206:9084"  # 将9206映射到9084
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://172.5.0.200:3306/budaos_com-stp  # 替换为实际的数据库名称
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: budaos_com
      SPRING_REDIS_HOST: 172.5.0.107
      SPRING_REDIS_PASSWORD: budaos_com_www_123456
    depends_on:
      - mysql
      - redis
    volumes:
      - /budaos_com/data/budaos_com-stp/uploads:/mnt/cbstp/uploads  # 只为该服务映射
    restart: always  # 设置自动重启策略

以下是您提供的 Docker Compose 文件的详细解释和说明:

1. Docker Compose 文件版本

version: '3.8'
  • 指定 Docker Compose 文件的版本,这里使用的是 3.8 版本,该版本支持更先进的配置选项。

2. 网络配置

networks:
  cbnet:
    driver: bridge
    ipam:
      config:
        - subnet: 172.5.0.0/24
          gateway: 172.5.0.1
  • 网络名称: 定义了名为 cbnet 的自定义网络。
  • 驱动: 使用 bridge 驱动,这种网络模式是在 Docker 中创建虚拟网络的默认方式。
  • IP 地址管理 (IPAM) : 配置了网络的子网(subnet)和网关(gateway)。这里的子网是 172.5.0.0/24,可以用来分配 IP 地址,网关为 172.5.0.1

3. MySQL 服务

  mysql:
    image: mysql:8.0.39
    container_name: mysql  # 指定容器名称
    #resources:
      #limits:
        #memory: 3072M  # 3GB 的内存限制
        #memory_swap: 4096M  # 4GB 的内存交换空间限制
    networks:
      cbnet:
        ipv4_address: 172.5.0.200
    environment:
      MYSQL_ROOT_PASSWORD: budaos_com
    ports:
      - "3306:3306"
    volumes:
      - /budaos_com/data/mysql:/var/lib/mysql  # 保留 MySQL 数据卷的映射
      - /etc/my.cnf:/etc/mysql/my.cnf
      - /etc/localtime:/etc/localtime:ro  # 挂载宿主机的时区文件,解决慢8个小时的问题
    restart: always  # 设置自动重启策略
  • 服务名称mysql 为服务名称。
  • 镜像: 使用 MySQL 官方 8.0.39 版本镜像。
  • 容器名称container_name 用于指定容器的名称为 mysql
  • 网络配置: 将服务连接到 cbnet 网络,并指定 static IP 地址为 172.5.0.200
  • 环境变量: 设置 MYSQL_ROOT_PASSWORD,用于 MySQL 的根用户密码。
  • 端口映射: 将主机的 3306 端口映射到容器的 3306 端口。
  • 数据卷: 映射主机目录 /budaos_com/data/mysql 到容器内的 /var/lib/mysql,用于持久化数据库数据。
  • 挂载宿主机的时区文件: /etc/localtime:/etc/localtime:ro 解决容器时间慢8个小时的问题
  • 重启策略: 设置为 always,容器在退出时自动重启。

4. Redis 服务

    redis:
    image: redis:7.4.1
    container_name: redis  # 指定容器名称
    networks:
      cbnet:
        ipv4_address: 172.5.0.107
    command: ["redis-server", "--requirepass", "budaos_com_www_123456"]
    ports:
      - "6379:6379"
    volumes:
      - /budaos_com/data/redis:/data  # 保留 Redis 数据卷的映射
      - /etc/localtime:/etc/localtime:ro  # 挂载宿主机的时区文件,解决慢8个小时的问题
      #- /etc/timezone:/etc/timezone:ro  # 挂载宿主机的时区文件
    restart: always  # 设置自动重启策略
  • 服务名称redis 为服务名称。
  • 镜像: 使用 Redis 官方 7.4.1 版本镜像。
  • 容器名称container_name 用于指定容器名称为 redis
  • 网络配置: 连接到 cbnet 网络,并指定 static IP 地址为 172.5.0.107
  • 命令: 在启动容器时执行 redis-server,并设置访问密码为 budaos_com_www_123456
  • 端口映射: 将主机的 6379 端口映射到容器的 6379 端口。
  • 数据卷: 映射主机目录 /budaos_com/data/redis 到容器内的 /data,用于持久化 Redis 数据。
  • 挂载宿主机的时区文件: /etc/localtime:/etc/localtime:ro 解决容器时间慢8个小时的问题
  • 重启策略: 设置为 always,容器在退出时自动重启。

5. Creatorblue 服务

   budaos_com-stp-mgr:
    image: budaos_com/budaos_com-stp-mgr:latest  # 替换为实际的镜像名称
    container_name: budaos_com-stp-mgr  # 指定容器名称
    networks:
      cbnet:
        ipv4_address: 172.5.0.205
    ports:
      - "9205:9084"  # 将9205映射到9084
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://172.5.0.200:3306/budaos_com-stp  # 替换为实际的数据库名称
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: budaos_com
      SPRING_REDIS_HOST: 172.5.0.107
      SPRING_REDIS_PASSWORD: budaos_com_www_123456
    depends_on:
      - mysql
      - redis
    volumes:
      - /budaos_com/data/budaos_com-stp/uploads:/mnt/cbstp/uploads  # 只为该服务映射
    restart: always  # 设置自动重启策略
  • 服务名称creatorblue-stp-mgr 为业务服务名称。
  • 镜像: 使用指定业务镜像的最新版本。
  • 容器名称container_name 指定容器名称为 budaos_com-stp-mgr
  • 网络配置: 连接到 cbnet 网络,并指定 static IP 地址为 172.5.0.205
  • 端口映射: 映射主机的 9205 端口到容器的 9084 端口。
  • 环境变量: 设置 Spring Boot 应用的数据库和 Redis 配置,包括数据源 URL、用户名、密码等。
  • 依赖服务: 使用 depends_on 指定该服务依赖于 mysql 和 redis 服务。
  • 数据卷: 映射主机目录 /budaos_com/data/budaos_com-stp/uploads 到容器内的 /mnt/cbstp/uploads,用于持久化文件上传数据。
  • 重启策略: 设置为 always,容器在退出时自动重启。

2.启动

    docker-compose up -d 

常见问题

下载镜像慢的情况

新建/etc/docker/daemon.json内容如下:

{
"registry-mirrors" :["https://mirror.ccs.tencentyun.com",
"http://registry.docker-cn.com",
"http://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com"],
"insecure-registries" :["registry.docker-cn.com",
"docker.mirrors.ustc.edu.cn"
],
"debug" : true,
"dns": ["8.8.8.8", "8.8.4.4"],
"experimental" : true
}

并重启容器才会生效。

docker支持远程访问

  • 说明:docker默认没有打开“2375”端口,需要先进行配置开启端口

  • 命令

  • 修改配置:vim /usr/lib/systemd/system/docker.service

  • 修改:ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

  • 备注:如果重启不起来可能是“unix://var/run/docker.sock”文件位置不对 ,通过:find / -name docker.sock, 查找正确位置修改即可

  • 重载配置:systemctl daemon-reload

  • 重启服务:systemctl restart docker