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.10db01mysql8、pg12docker:23、mysql:8、pg:12
192.168.1.11db02mysql8、pg12docker:23、mysql:8、pg:12
192.168.1.12nginxredis6docker:23、redis:6、minio:2023、nginx:1.23
192.168.1.13app01app01docker:23、数据中台镜像(17个应用)
192.168.1.14app02app02docker:23、数据中台镜像(17个应用)

2、端口账号规划

除nginx使用80端口,其他中间件都不使用原有端口,提升系统安全性。

应用名容器端口映射端口管理账号/密码访问地址
nginx8080http://192.168.1.12
minio API900030001http://192.168.1.12:30001
minio Console900130002admin/******http://192.168.1.12:30002
redis637930003******
mysql330630004root/******
postgresql543230005postgres/******

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}
上次更新:
编辑者: 李贤伟