docker-compose 应用部署
对于没有云平台的项目上线应用部署,基于目前的前后端分离的技术架构体系,往往一个应用需要部署一系列的中间件(mysql、redis、minio、nginx等),再加上自身应用的拆分也会出现一堆应用,对于这些应用的部署,包括后续的维护都是比较费时的工作。
这里提供基于docker-compose
,通过编写docker-compose.yml
文件对应用进行配置,实现一键式部署。
服务器采用5
台linux服务器,版本随意(CentOS、OpenEluler等都可以),CPU/内存的配置根据项目的实际情况跟客户进行申请。
下面的部署,只提供参考,这里只做了应用的高可用,比如数据库、redis、nginx等各中间件的高可用不在该文档提供,后续由其他章节进行完善,如果要做这块工作,先自行百度。
1、服务器规划
- 主机名修改
主机名需要定义好,后面应用的数据库连接基于主机名来配置,nginx的负载均衡也采用主机名来配置代理。
# 主机名修改
hostnamectl set-hostname db01
hostnamectl set-hostname db02
hostnamectl set-hostname nginx
hostnamectl set-hostname app01
hostnamectl set-hostname app02
- 服务器规划
db01: 数据库节点,安装docker、mysql、pg
db02: 数据备份节点,这里只做备份,不做切换,安装docker、mysql、pg
nginx: 反向代理节点,同时提供redis、minio部署(实际也可以都规划到db01,根据配置自行调整)
app01: 应用节点1
app02: 应用节点2
IP | 主机名 | host域名 | 安装组件 |
---|---|---|---|
192.168.1.10 | db01 | mysql8、pg12 | docker:23、mysql:8、pg:12 |
192.168.1.11 | db02 | mysql8、pg12 | docker:23、mysql:8、pg:12 |
192.168.1.12 | nginx | redis6 | docker:23、redis:6、minio:2023、nginx:1.23 |
192.168.1.13 | app01 | app01 | docker:23、数据中台镜像(17个应用) |
192.168.1.14 | app02 | app02 | docker:23、数据中台镜像(17个应用) |
2、端口账号规划
除nginx使用80
端口,其他中间件都不使用原有端口,提升系统安全性。
应用名 | 容器端口 | 映射端口 | 管理账号/密码 | 访问地址 |
---|---|---|---|---|
nginx | 80 | 80 | http://192.168.1.12 | |
minio API | 9000 | 30001 | http://192.168.1.12:30001 | |
minio Console | 9001 | 30002 | admin/****** | http://192.168.1.12:30002 |
redis | 6379 | 30003 | ****** | |
mysql | 3306 | 30004 | root/****** | |
postgresql | 5432 | 30005 | postgres/****** |
3、docker-compose安装
# 下载docker-compose
# 网络好可以直接从github上下载
# sudo curl -L https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
# 本地下载上传到服务器(重命名为docker-compose,并移动到/usr/local/bin/目录下
mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
# 添加执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -v
# 当前docker安装的版本为:Docker version 23.0.1, build a5ee5b1 ,这里docker-compose下载2.16
# Docker Compose version v2.16.0
# 启动服务
docker-compose -f docker-compose-redis-minio-nginx.yml up -d
# 停止服务
docker-compose -f docker-compose-redis-minio-nginx.yml down
# 启动多个文件服务
docker-compose -f docker-compose-redis.yml -f docker-compose-postgresql.yml up -d
# 停止多个文件服务
docker-compose -f docker-compose-redis.yml -f docker-compose-postgresql.yml down
4、镜像导出
在需要部署到客户环境时,可以通过公司的环境进行导出,这里只列了一个模板格式,没有全部应用进行导出,导出的镜像为xxx.tar
包,将该镜像文件复制到客户现场的环境。
tag_v
:为当前导出的镜像版本号,这里按YYYYmmDD
格式进行定义,如果一天发布多个镜像可自定义后面的流水序号如:2023030301
registry_ns
:镜像仓库地址(这里改为实际镜像仓库的地址,方便导入后直接推送,免得还要再打一个tag)
# 镜像标签
tag_v=20230303
registry_ns=wiseda.com.cn/dmm
# 1、dmmlab-server 系统构架-后端镜像
docker pull 172.16.102.2:5000/dmmlab/dmmlab-server:latest
docker tag 172.16.102.2:5000/dmmlab/dmmlab-server:latest $registry_ns/dmmlab-server:$tag_v
docker save > dmmlab-server-$tag_v.tar $registry_ns/dmmlab-server:$tag_v
# 2、dmmlab-web 系统构架-前端镜像
docker pull 172.16.102.2:5000/dmmlab/dmmlab-web:latest
docker tag 172.16.102.2:5000/dmmlab/dmmlab-web:latest $registry_ns/dmmlab-web:$tag_v
docker save > dmmlab-web-$tag_v.tar $registry_ns/dmmlab-web:$tag_v
# 3、mysql:8.0.30 mysql数据库-镜像
docker pull 172.16.102.2:5000/library/mysql:8.0.30
docker tag 172.16.102.2:5000/library/mysql:8.0.30 $registry_ns/mysql:8.0.30
docker save > mysql-8.0.30.tar $registry_ns/mysql:8.0.30
# 4、redis:6.2.6 redis缓存-镜像
docker pull 172.16.102.2:5000/library/bitnami/redis:6.2
docker tag 172.16.102.2:5000/library/bitnami/redis:6.2 $registry_ns/redis:6.2
docker save > redis-6.2.tar $registry_ns/redis:6.2
5、镜像导入
根据上传的镜像文件,将其docker load
导入进去,如果客户有镜像管理仓库,可以将镜像推送到镜像仓库中去如:Harbor
# 镜像标签
tag_v=20230303
registry_ns=wiseda.com.cn/dmm
# 1、dmmlab-server 系统构架-后端镜像
docker load < dmmlab-server-$tag_v.tar
docker tag $registry_ns/dmmlab-server:$tag_v $registry_ns/dmmlab-server:latest
# 2、dmmlab-web 系统构架-前端镜像
docker load < dmmlab-web-$tag_v.tar
docker tag $registry_ns/dmmlab-web:$tag_v $registry_ns/dmmlab-web:latest
6、mysql、pg 安装配置
- 创建数据、配置目录
/var/lib/mysql/data
:mysql数据目录
/var/lib/mysql/conf
:mysql配置目录
/var/lib/mysql/dbscript
:mysql初始化脚本目录
# 创建mysql 数据目录/data、配置目录/conf、数据库脚本目录/dbscript
mkdir -p /var/lib/mysql/data /var/lib/mysql/conf /var/lib/mysql/dbscript
# docker 复制数据库脚本到容器的/tmp目录
# docker cp /var/lib/mysql/dbscript mysql:tmp
# 创建pg数据目录
mkdir -p /var/lib/postgresql/data
# 添加执行权限(不然没有权限向宿主机写入数据)
chmod 777 /var/lib/postgresql/data
- mysql.cnf 配置文件参考
/conf/mysql/mysql.cnf
[mysqld]
skip-name-resolve
skip-log-bin
host_cache_size=0
lower_case_table_names=1
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake=true
default-time_zone='+8:00'
- 初始化数据库脚本
数据库脚本如果能本地客户端连接可以直接去执行,下面提供通过mysql去导入相关脚本
# 初始化dmm-数据库
mysql -p****** -Ddmm < /tmp/dbscript/dmm/1-dmm-database.sql
mysql -p****** -Ddmm < /tmp/dbscript/dmm/2-dmm-base.sql
mysql -p****** -Ddmm < /tmp/dbscript/dmm/3-dmm-config.sql
mysql -p****** -Ddmm < /tmp/dbscript/dmm/4-dmm-permission.sql
mysql -p****** -Ddmm < /tmp/dbscript/dmm/5-dmm-dict.sql
# 初始化mdm主数据-数据库
mysql -p****** -Dmdm < /tmp/dbscript/mdm/1-mdm-database.sql
mysql -p****** -Dmdm < /tmp/dbscript/mdm/2-mdm-classify.sql
# 初始化dmm_job调度管理-数据库
mysql -p****** -Ddmm_job < /tmp/dbscript/job-admin/1-tables-xxl-job.sql
mysql -p****** -Ddmm_job < /tmp/dbscript/job-admin/2-xxl-job-data.sql
7、minio、redis、nginx 安装配置
宿主机先将修改数据目录权限,不然启动时,容器没有权限挂载数据
# 创建数据目录,并修改权限
mkdir -p /var/lib/minio/data /var/lib/redis/data /var/lib/nginx/conf
chmod 777 /var/lib/minio/data
chmod 777 /var/lib/redis/data
- 配置文件参考如:
docker-compose-redis-minio-nginx.yml
version: '3'
networks:
dmmlab-tier:
driver: bridge
services:
minio:
image: 'wiseda.com.cn/dmm/minio:2023.2.27'
container_name: minio
ports:
- '30001:9000'
- '30002:9001'
volumes:
- '/var/lib/minio/data:/data'
restart: always
environment:
- TZ="Asia/Shanghai"
- MINIO_ROOT_USER=admin
- MINIO_ROOT_PASSWORD=dmmlab@minio2023
networks:
- dmmlab-tier
redis:
image: 'wiseda.com.cn/dmm/redis:6.2'
container_name: redis
ports:
- '30003:6379'
volumes:
- '/var/lib/redis/data:/bitnami/redis/data'
restart: always
environment:
- REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL,CONFIG
- REDIS_PASSWORD=dmmlab@redis2023
networks:
- dmmlab-tier
nginx:
image: 'wiseda.com.cn/dmm/nginx:1.23'
container_name: nginx
extra_hosts:
- 'app01:192.168.1.13'
- 'app02:192.168.1.14'
ports:
- '80:80'
volumes:
- /var/lib/nginx/conf/dmmlab_server_block.conf:/opt/bitnami/nginx/conf/server_blocks/dmmlab_server_block.conf:ro
- /var/lib/nginx/conf/index.html:/app/index.html:ro
- nginx配置文件参考
/conf/nginx/dmmlab_server_block.conf
(对应用进行代理,app01、app02进行应用负载,允许单边节点宕机)
upstream DmmlabServerPolling {
server app01:8810;
server app02:8810;
}
upstream DmmlabWebPolling {
server app01:8800;
server app02:8800;
}
server {
listen 80;
server_name localhost;
underscores_in_headers on;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /dmmlab/index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location /dmmlab-server {
proxy_pass http://DmmlabServerPolling;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 1;
}
location /dmmlab {
proxy_pass http://DmmlabWebPolling;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 1;
}
}
- nginx
index.html
配置文件修改(转换到登录页面),自行修改url
中要转发的默认地址
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="refresh" content="0;url=/dmmlab/">
</head>
</html>
8、使用技巧
8.1、单应用更新
在初始化部署时,我们的docker-compose.yml
文件可能是一个全量的,针对这一个节点,安装所有应用或中间件,方便一键启停。当只需要更新某一个应用时,这里我们可以从全量的复制一份出来,只保留当前需要更新的应用,如:
单独的dmmlab-server配置文件 docker-compose-dmmlab-server.yml
,这时只要对这个进行启停:
启动: docker-compose -f docker-compose-dmmlab-server.yml up -d
停止: docker-compose -f docker-compose-dmmlab-server.yml down
version: '3'
networks:
dmmlab-tier:
driver: bridge
services:
# 数据中台-后端
dmmlab-server:
image: 'cufe.edu.cn/dmm/dmmlab-server:latest'
container_name: dmmlab-server-service
ports:
- '8810:8810'
restart: always
extra_hosts:
- 'mysql8:192.168.1.10'
- 'redis6:192.168.1.10'
environment:
- DB_URL=jdbc:mysql://mysql8:30004/dmm?generateSimpleParameterMetadata=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
- SPRING_PROFILE_ACTIVE=pro
- REDIS_PORT=30003
- AWS_ACCESS_KEY=yDbCTq90wxb9sPYS
- AWS_SECRET_KEY=NcNpBXtVMCyJ6wiTKwnN1ssv9CDgPEC6
- AWS_ENDPOINT=http://192.168.1.12:30001
- AWS_BUCKET=dmm
networks:
- dmmlab-tier
8.2、服务名使用
在没有部署Nacos
这类服务发现组件时,通过将应用建议在同网络上,通过容器名可以直接访问。
如上面的dmmlab-server中的yml文件,建立在一个dmmlab-tier
网络中,那么我们的其他应用就可以直接使用container_name
,这里为dmmlab-server-service
进行服务调用,而不需要关心具体的IP,不需要去调整应用的配置。
如下面另一个应用需要通过Feign调用dmmlab-server
的接口,直接如下配置就可以了http://dmmlab-server-service:8810
waf:
api:
encrypt:
# 是否开启api 接口数据加密(默认为true)
enable: ${ENCRYPT_ENABLE:true}
# api应用配置
list:
main:
# 主应用服务地址,结合interface-list中的FEIGN远程调用(服务发现nacos配置)
server-addr: ${MAIN_SERVER_ADDR:dmmlab-server-service}
# url地址配置(可以为服务名+端口 K8S配置)
server-rest-url: ${MAIN_SERVER_REST_URL:http://dmmlab-server-service:8810}
# 主应用上下文路径
context-path: ${MAIN_CONTEXT_PATH:/dmmlab-server/v2/waf}