目录
前言
Docker Compose安装、常用命令、模板文件
使用Docker Compose的步骤
使用Docker Compose部署SpringBoot应用
1. 运行配置要求
2. 容器化SpringBoot应用
3. SpringBoot依赖服务脚本
devecimag-docker-compose-env.yml
参数变量.env
MySQL 数据库脚本执行
2. Docker命令
4. SpringBoot应用服务脚本
devecimag-docker-compose-app.yml
5. 启动docker-compose
6. 使用Docker可视化工具: Portainer查看部署结果
阅读本文前,建议先熟悉一下文章, 了解Docker基本概念, 如何容器化Springboot应用, 如何使用idea方便快速连接Docker服务器
- 准备虚拟机: 在win10上使用VMware Pro16 安装 CentOS 7.9 设置静态IP 可以访问外网
- 安装Docker和容器化Springboot引用: 第一个docker化的java应用
Docker可视化工具: Portainer的安装和使用 (界面上几乎能够操作常见的Docker命令)
- Idea:连接远程主机SFTP服务实现文件上传和下载 (便于更新Dockerfile文件)
- Idea:连接Docker服务器 (便于查看镜像,容器日志等)
- 构建和推送镜像: docker-maven-plugin:自动构建Maven多模块的Docker镜像,并推送到Docker Registry或阿里云
具体参考: https://glory.blog.csdn.net/article/details/113365376
Compose
项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
Compose
定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。
Compose
恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Docker Compose是一个用于定义和运行多个docker容器应用的工具。使用Compose你可以用YAML文件来配置你的应用服务,然后使用一个命令,你就可以部署你配置的所有服务了。
- 使用Dockerfile定义应用程序环境,一般需要修改初始镜像行为时才需要使用;
- 使用docker-compose.yml定义需要部署的应用程序服务,以便执行脚本一次性部署;
- 使用docker-compose up命令将所有应用服务一次性部署起来。
CenterOS7.6版本,推荐4G以上内存。
具体搭建参考: 准备虚拟机: 在win10上使用VMware Pro16 安装 CentOS 7.9 设置静态IP 可以访问外网
具体参考: 构建和推送镜像: docker-maven-plugin:自动构建Maven多模块的Docker镜像,并推送到Docker Registry或阿里云
#用于部署运行所依赖的服务
version: '3'
services:
# MySQL数据库
mysql:
image: mysql:${MYSQL_VERSION}
container_name: mysql
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} #设置root帐号密码
TZ: Asia/Shanghai
ports:
- "${MYSQL_HOST_PORT}:3306"
volumes:
- ${MYSQL_DATA_DIR}:/var/lib/mysql #数据文件挂载
- ${MYSQL_CONF_DIR}:/etc/mysql/conf.d #配置文件挂载
- ${MYSQL_LOG_DIR}:/var/log/mysql #日志文件挂载
# Redis数据库
redis:
image: redis:${REDIS_VERSION}
container_name: redis
environment:
TZ: Asia/Shanghai
command: redis-server --appendonly yes
restart: always
volumes:
- ${REDIS_DATA_DIR}:/data #数据文件挂载
- ${REDIS_CONF_FILE}:/etc/redis/redis.conf #配置文件挂载
ports:
- "${REDIS_HOST_PORT}:6379"
# RabbitMQ消息队列
rabbitmq:
image: rabbitmq:${RABBITMQ_VERSION}
container_name: rabbitmq
#privileged: true
restart: always
environment:
TZ: Asia/Shanghai
volumes:
- ${RABBITMQ_DATA_DIR}:/var/lib/rabbitmq #数据文件挂载
#- ${RABBITMQ_CONF_DIR}:/etc/rabbitmq #配置文件挂载
- ${RABBITMQ_LOG_DIR}:/var/log/rabbitmq #日志文件挂载
ports:
- "${RABBITMQ_HOST_PORT}:5672"
- "${RABBITMQ_MAG_PORT}:15672"
# Nacos注册中心和配置中心
nacos:
image: nacos/nacos-server:${NACOS_VERSION}
container_name: nacos
restart: always
environment:
- "TZ=Asia/Shanghai"
- "PREFER_HOST_MODE=${PREFER_HOST_MODE}"
- "MODE=${MODE}"
- "SPRING_DATASOURCE_PLATFORM=${SPRING_DATASOURCE_PLATFORM}"
- "MYSQL_SERVICE_HOST=${MYSQL_SERVICE_HOST}"
- "MYSQL_SERVICE_DB_NAME=${MYSQL_SERVICE_DB_NAME}"
- "MYSQL_SERVICE_PORT=${MYSQL_SERVICE_PORT}"
- "MYSQL_SERVICE_USER=${MYSQL_SERVICE_USER}"
- "MYSQL_SERVICE_PASSWORD=${MYSQL_SERVICE_PASSWORD}"
volumes:
- ${NACOS_LOG_DIR}:/home/nacos/logs:rw #日志文件挂载
- ${NACOS_CONF_DIR}:/home/nacos/init.d #配置文件挂载
depends_on:
- mysql
ports:
- 8848:8848
################################################
### devicemag environment config file ###
################################################
#################### MySQL #####################
MYSQL_VERSION=5.7
MYSQL_HOST_PORT=3306
MYSQL_ROOT_PASSWORD=vr123456
MYSQL_DATA_DIR=/mydata/mysql/data/db
MYSQL_CONF_DIR=/mydata/mysql/data/conf
MYSQL_LOG_DIR=/mydata/mysql/log
#################### Redis #####################
REDIS_VERSION=5
REDIS_HOST_PORT=6379
REDIS_DATA_DIR=/mydata/redis/data
REDIS_CONF_FILE=/mydata/redis/conf/redis.conf
#################### RabbitMQ #####################
RABBITMQ_VERSION=3.7.15-management
RABBITMQ_HOST_PORT=5672
RABBITMQ_MAG_PORT=15672
RABBITMQ_DATA_DIR=/mydata/rabbitmq/data
RABBITMQ_CONF_DIR=/mydata/rabbitmq/conf
RABBITMQ_LOG_DIR=/mydata/rabbitmq/log
#################### NACOS #####################
NACOS_VERSION=1.2.1
PREFER_HOST_MODE=hostname
MODE=standalone
SPRING_DATASOURCE_PLATFORM=mysql
#此处要主要的是要写mysql服务的host,不能写127.0.0.1;直接写mysql即可
MYSQL_SERVICE_HOST=mysql
MYSQL_SERVICE_DB_NAME=devicemag-config
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=XXXX
NACOS_LOG_DIR=/mydata/nacos/log
NACOS_CONF_DIR=/mydata/nacos/conf
通过mysql客户端工具, 连接数据库执行脚本
需要创建test数据库并创建一个可以远程访问的对象reader。
将test.sql文件拷贝到mysql容器的/目录下:
docker cp /mydata/test.sql mysql:/
进入mysql容器并执行如下操作:
#进入mysql容器
docker exec -it mysql /bin/bash
#连接到mysql服务
mysql -uroot -proot --default-character-set=utf8
#创建远程访问用户
grant all privileges on *.* to 'reader' @'%' identified by '123456';
#创建mall数据库
create database testcharacter set utf8;
#使用test数据库
use test;
#导入test.sql脚本
source /test.sql;
#用于部署业务服务
version: '3'
services:
# 认证模块
devicemag-auth:
image: registry.cn-beijing.aliyuncs.com/fly_jt/devicemag-auth:1.0.0
container_name: devicemag-auth
restart: always
ports:
- 8050:8050
volumes:
- /mydata/devicemag/log/devicemag-auth:/var
- /etc/localtime:/etc/localtime
environment:
- 'TZ="Asia/Shanghai"'
# depends_on:
# - mysql
# - redis
# - nacos
external_links:
- redis:redis #可以用redis这个域名访问redis服务
- mysql:db #可以用db这个域名访问mysql服务
- nacos:nacos #可以用nacos这个域名访问nacos服务
# 网关模块
devicemag-gateway:
image: registry.cn-beijing.aliyuncs.com/fly_jt/devicemag-gateway:1.0.0
container_name: devicemag-gateway
restart: always
ports:
- 8080:8080
volumes:
- /mydata/devicemag/log/devicemag-gateway:/var
- /etc/localtime:/etc/localtime
environment:
- 'TZ="Asia/Shanghai"'
# depends_on:
# - mysql
# - redis
# - nacos
external_links:
- redis:redis #可以用redis这个域名访问redis服务
- mysql:db #可以用db这个域名访问mysql服务
- nacos:nacos #可以用nacos这个域名访问nacos服务
# 系统模块
devicemag-system:
image: registry.cn-beijing.aliyuncs.com/fly_jt/devicemag-system:1.0.0
container_name: devicemag-system
restart: always
ports:
- 8070:8070
volumes:
- /mydata/devicemag/log/devicemag-system:/var
- /etc/localtime:/etc/localtime
environment:
- 'TZ="Asia/Shanghai"'
# depends_on:
# - mysql
# - redis
# - nacos
external_links:
- redis:redis #可以用redis这个域名访问redis服务
- mysql:db #可以用db这个域名访问mysql服务
- nacos:nacos #可以用nacos这个域名访问nacos服务
# 文件模块
devicemag-file:
image: registry.cn-beijing.aliyuncs.com/fly_jt/devicemag-file:1.0.0
container_name: devicemag-file
restart: always
ports:
- 8060:8060
volumes:
- /mydata/devicemag/log/devicemag-file:/var
- /etc/localtime:/etc/localtime
environment:
- 'TZ="Asia/Shanghai"'
# depends_on:
# - mysql
# - redis
# - nacos
external_links:
- redis:redis #可以用redis这个域名访问redis服务
- mysql:db #可以用db这个域名访问mysql服务
- nacos:nacos #可以用nacos这个域名访问nacos服务
# 核心模块
devicemag-core:
image: registry.cn-beijing.aliyuncs.com/fly_jt/devicemag-core:1.0.0
container_name: devicemag-core
restart: always
ports:
- 8090:8090
volumes:
- /mydata/devicemag/log/devicemag-core:/var
- /etc/localtime:/etc/localtime
environment:
- 'TZ="Asia/Shanghai"'
# depends_on:
# - mysql
# - redis
# - rabbitmq
# - nacos
external_links:
- redis:redis #可以用redis这个域名访问redis服务
- mysql:db #可以用db这个域名访问mysql服务
- nacos:nacos #可以用nacos这个域名访问nacos服务
- rabbitmq:rabbit #可以用rabbit这个域名访问rabbitmq服务
上传完后在当前目录下执行如下命令
docker-compose -f devecimag-docker-compose-env.yml up -d
docker-compose -f devecimag-docker-compose-app.yml up -d
[root@localhost devicemag]# docker-compose -f devecimag-docker-compose-env.yml up -d
Building with native build. Learn about native build in Compose here: https://docs.docker.com/go/compose-native-build/
WARNING: Found orphan containers (devicemag-gateway, devicemag-core, devicemag-file, devicemag-system, devicemag-auth) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Recreating redis ...
mysql is up-to-date
rabbitmq is up-to-date
Recreating redis ... done
[root@localhost devicemag]# docker-compose -f devecimag-docker-compose-app.yml up -d
Building with native build. Learn about native build in Compose here: https://docs.docker.com/go/compose-native-build/
WARNING: Found orphan containers (redis, nacos, mysql, rabbitmq) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Recreating devicemag-system ... done
Recreating devicemag-file ... done
Recreating devicemag-auth ... done
Recreating devicemag-gateway ... done
Recreating devicemag-core ... done