目录
使用Docker Compose部署SpringBoot应用
devecimag-docker-compose-env.yml
devecimag-docker-compose-app.yml
6. 使用Docker可视化工具: Portainer查看部署结果
RabbitMQ: /var/lib/rabbitmq/.erlang.cookie must be accessible by owner only
MinIO: Console endpoint is listening on a dynamic port , please use --console-address
前言
阅读本文前,建议先熟悉一下文章, 了解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或阿里云
Docker Compose安装、常用命令、模板文件
Compose
项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
Compose
定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。
Compose
恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Docker Compose是一个用于定义和运行多个docker容器应用的工具。使用Compose你可以用YAML文件来配置你的应用服务,然后使用一个命令,你就可以部署你配置的所有服务了。
使用Docker Compose的步骤
- 使用Dockerfile定义应用程序环境,一般需要修改初始镜像行为时才需要使用;
- 使用docker-compose.yml定义需要部署的应用程序服务,以便执行脚本一次性部署;
- 使用docker-compose up命令将所有应用服务一次性部署起来。
使用Docker Compose部署SpringBoot应用
1. 运行配置要求
CenterOS7.6版本,推荐4G以上内存。
具体搭建参考: 准备虚拟机: 在win10上使用VMware Pro16 安装 CentOS 7.9 设置静态IP 可以访问外网
2. 容器化SpringBoot应用
具体参考: 构建和推送镜像: docker-maven-plugin:自动构建Maven多模块的Docker镜像,并推送到Docker Registry或阿里云
3. SpringBoot依赖服务脚本
devecimag-docker-compose-env.yml
#用于部署运行所依赖的服务
version: '3'
services:
# 1.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_CONF_MY_FILE}:/etc/mysql/my.cnf #配置文件挂载
- ${MYSQL_CONF_MYSQL_FILE}:/etc/mysql/mysql.cnf #配置文件挂载
- ${MYSQL_LOG_DIR}:/var/log/mysql #日志文件挂载
- /etc/localtime:/etc/localtime:ro
- /etc/timezone/timezone:/etc/timezone:ro
# 2.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 #配置文件挂载
- /etc/localtime:/etc/localtime:ro
- /etc/timezone/timezone:/etc/timezone:ro
ports:
- "${REDIS_HOST_PORT}:6379"
# 3.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 #日志文件挂载
- /etc/localtime:/etc/localtime:ro
- /etc/timezone/timezone:/etc/timezone:ro
ports:
- "${RABBITMQ_HOST_PORT}:5672"
- "${RABBITMQ_MAG_PORT}:15672"
# 4.Nacos注册中心和配置中心
nacos:
image: nacos/nacos-server:${NACOS_VERSION}
container_name: nacos
ports:
- 8848:8848
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 #配置文件挂载
- /etc/localtime:/etc/localtime:ro
- /etc/timezone/timezone:/etc/timezone:ro
depends_on:
- mysql
# 5.MinIO服务器
# https://raw.githubusercontent.com/minio/minio/master/docs/orchestration/docker-compose/docker-compose.yaml
minio:
image: minio/minio:RELEASE.2021-07-30T00-02-00Z
container_name: minio
ports:
- "9000:9000"
- "9009:9009"
restart: always
command: server /data --console-address ":9009"
environment:
MINIO_ROOT_USER: minio
MINIO_ROOT_PASSWORD: minio123 #大于等于8位
logging:
options:
max-size: "50M" # 最大文件上传限制
max-file: "10"
driver: json-file
volumes:
- ${MINIO_DATA_DIR}:/data # 映射文件路径
- /etc/localtime:/etc/localtime:ro
- /etc/timezone/timezone:/etc/timezone:ro
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
# 6.Nginx服务器
nginx:
image: nginx:${NGINX_VERSION}
container_name: nginx
restart: always
ports:
- "80:80"
- "7930:7930"
- "9001:9001"
- "9002:9002"
#定义挂载点
volumes:
- ${NGINX_CONF_FILE}:/etc/nginx/nginx.conf
- ${NGINX_CONF_DIR}:/etc/nginx/conf.d
- ${NGINX_LOG_DIR}:/var/log/nginx
- ${NGINX_HTML_DIR}:/etc/nginx/html
参数变量.env
################################################
### devicemag environment config file ###
################################################
#################### MySQL #####################
MYSQL_VERSION=5.7
MYSQL_HOST_PORT=3306
MYSQL_ROOT_PASSWORD=123456
MYSQL_DATA_DIR=/mydata/mysql/data/db
MYSQL_CONF_DIR=/mydata/mysql/data/conf
MYSQL_CONF_MY_FILE=/mydata/mysql/data/my.cnf
MYSQL_CONF_MYSQL_FILE=/mydata/mysql/data/mysql.cnf
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=smartmag-config
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=123456
NACOS_LOG_DIR=/mydata/nacos/log
NACOS_CONF_DIR=/mydata/nacos/conf
#################### MINIO #####################
MINIO_DATA_DIR=/mydata/minio/data
#################### NGINX #####################
NGINX_VERSION=1.16.1-alpine
NGINX_PROXY_FILE=/mydata/nginx/proxy.conf
NGINX_CONF_FILE=/mydata/nginx/nginx.conf
NGINX_HTML_DIR=/mydata/nginx/html
NGINX_LOG_DIR=/mydata/nginx/log
NGINX_CONF_DIR=/mydata/nginx/conf.d
#################### BIGUNION #####################
BIGUNION_VERSION=1.0.0
MySQL 数据库脚本执行
1. Navicat
通过mysql客户端工具, 连接数据库执行脚本
2. Docker命令
需要创建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;
4. SpringBoot应用服务脚本
devecimag-docker-compose-app.yml
#用于部署业务服务
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服务
5. 启动docker-compose
上传完后在当前目录下执行如下命令
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
6. 使用Docker可视化工具: Portainer查看部署结果
备注:
/mydata/mysql/data/my.cnf
# Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
#
# This program is also distributed with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms,
# as designated in a particular file or component or in included license
# documentation. The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have included with MySQL.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
[mysqld]
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
/mydata/nginx/nginx.conf
#user nobody;
worker_processes 2;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 9001;
server_name localhost;
location / {
root /etc/nginx/html/teacher;
index index.html index.htm;
}
}
server {
listen 9002;
server_name localhost;
location / {
root /etc/nginx/html/student;
index index.html index.htm;
}
}
server {
listen 7930;
server_name localhost;
location /{
root /etc/nginx/html/bigunionresource;
autoindex on;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
if ($request_method = 'OPTIONS') {
return 204;
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
异常处理
RabbitMQ: /var/lib/rabbitmq/.erlang.cookie must be accessible by owner only
解决办法参考: https://glory.blog.csdn.net/article/details/119250404
MinIO: Console endpoint is listening on a dynamic port , please use --console-address
解决办法参考: https://glory.blog.csdn.net/article/details/119250223