Skip to content

部署中间件

提示

docker-compose 结构化的yaml文档可以清晰的了解整个系统容器,所有中间件均采用 docker-compose 工具部署。

为方便快速搭建环境,我已经将相关部署配置文件放在 docs/docker/ 目录下,直接拷贝至服务器运行即可完成所需中间件的部署。

说明

有个细节还是必要说下:

docker-compose up 会创建默认的网络,网络的名称为 当前compose文件所在文件夹名称_default,例如此配置文件在data目录下,所以默认网络为 data_default

设置 COMPOSE_PROJECT_NAME 环境变量可以定制默认网络名称,本节教程中我设置的是 xh ,所以会创建一个 xh_default 的网络。

在同一个配置文件中启动的所有容器默认会加入这个网络,so,容器间互相访问可以直接通过容器 container_name 访问,无需额外的配置。

如本教程中的 nacosxxl-job-admin 都是直接通过 mysql8 来直接访问的。

目录结构

docker                                   
├─ mysql                               
│  ├─ docker-entrypoint-initdb.d       // 需要初始化的sql放在此目录
│  │  ├─ init_nacos_config.sql        // nacos配置初始化sql
│  │  ├─ init_xh_admin.sql               // 晓寒系统初始化sql
│  │  └─ init_xxl_job.sql              // xxl-job配置初始化sql
│  └─ my.cnf                          // mysql配置文件
├─ nginx                               
│  └─ nginx.conf                       // nginx配置文件
├─ .env                                // docker-compose环境变量
└─ docker-compose.yaml                 // docker-compose配置文件

配置文件

主要看下docker-compose.yaml文件:

yaml
version: "3.9"
# 有个细节还是说下:方便新人了解,docker-compose up会创建的默认的网络,网络的名称为 ”当前compose文件所在文件夹名称_default“,例如此配置文件在data目录下,所以默认网络为 data_default
# 设置COMPOSE_PROJECT_NAME环境变量可以定制默认网络名称
# 在同一个compose配置文件中启动的所有容器默认会加入同一个网络,so,容器间互相访问可以直接通过容器container_name访问,无需额外的配置
services:
  mysql:
    image: mysql:8.0-debian
    container_name: mysql8
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/data:/var/lib/mysql
      # mysql配置文件
      - ./mysql/my.cnf:/etc/my.cnf
      # 把需要初始化的sql放在这个目录下,挂载至容器,这样容器创建时会自动执行此目录的所有sql文件,执行数据库的初始化
      - ./mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}
    restart: always
  redis:
    image: redis:7.0-alpine
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - ./redis/data:/data
      - ./redis/redis.conf:/etc/redis/redis.conf
    restart: unless-stopped
    command: redis-server --appendonly yes
  minio:
    container_name: minio
    image: quay.io/minio/minio:latest
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - ./minio/data:/data
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: ${MINIO_USER}
      MINIO_ROOT_PASSWORD: ${MINIO_PASSWORD}
    restart: always
  jenkins:
    image: jenkins/jenkins:lts-jdk17
    container_name: jenkins
    # 用root用户启动,因为jenkins需要调用宿主机的docker,docker-compose,会有权限问题,怕麻烦直接root省事,但要注意网络安全
    user: root
    ports:
      - "8080:8080"
    volumes:
      - ./jenkins/jenkins_home:/var/jenkins_home
      - /etc/localtime:/etc/localtime
      # 映射宿主机docker,这样再容器内部执行docker就等于在宿主机执行
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/bin/docker
      # 映射宿主机docker-compose,这样再容器内部执行docker-compose就等于在宿主机执行
      - /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
      - /usr/bin/docker-compose:/usr/bin/docker-compose
    environment:
      JAVA_OPTS: "-Xmx256m -Xms256m"
    deploy:
      resources:
        limits:
          cpus: "0.5"
          memory: 2G
    restart: always
    privileged: true
  nginx:
    image: nginx:1.24.0-alpine-slim
    container_name: nginx
    network_mode: host
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/cer:/etc/nginx/cer:ro
      - ./nginx/html:/usr/share/nginx/html:ro
    restart: always
  xxl-job-admin:
    image: xuxueli/xxl-job-admin:2.4.0
    container_name: xxl-job-admin
    ports:
      - "8088:8080"
    volumes:
      - ./xxl-job:/data/applogs
    environment:
      PARAMS: "--spring.datasource.url=jdbc:mysql://mysql8:3306/xxl_job?Unicode=true&characterEncoding=UTF-8 --spring.datasource.username=root --spring.datasource.password=${MYSQL_PASSWORD}"
    depends_on:
      - mysql
    restart: always
  nacos:
    image: nacos/nacos-server:v2.2.3-slim
    container_name: nacos
    environment:
      MODE: "standalone"
      SPRING_DATASOURCE_PLATFORM: "mysql"
      MYSQL_SERVICE_HOST: mysql8
      MYSQL_SERVICE_PORT: "3306"
      MYSQL_SERVICE_DB_NAME: "nacos_config"
      MYSQL_SERVICE_USER: "root"
      MYSQL_SERVICE_PASSWORD: ${MYSQL_PASSWORD}
      NACOS_AUTH_ENABLE: "true"
      NACOS_AUTH_IDENTITY_KEY: "xh"
      NACOS_AUTH_IDENTITY_VALUE: "xh666"
      NACOS_AUTH_TOKEN: "dlfkgjer78234uskl23ioufsjlk34r9028rf0wu24078woekrjelwriufio"
      JVM_XMS: "256m"
      JVM_XMX: "256m"
      JVM_XMN: "64m"
    volumes:
      - ./nacos/logs:/home/nacos/logs
    ports:
      - "8848:8848"
      - "9848:9848"
    depends_on:
      - mysql
    restart: always
    deploy:
      resources:
        limits:
          memory: 1G

环境变量

docker-compose的环境变量文件为同目录下 .env 文件:

txt
COMPOSE_PROJECT_NAME=xh

# Mysql root密码
MYSQL_USER=root
MYSQL_PASSWORD="1qaz@WSX#EDC"

# MinIo root密码
MINIO_USER=root
MINIO_PASSWORD="1qaz@WSX#EDC"

开始部署

我们将该文件夹上传至服务器,如放在/data目录下

sh
$ cd /data && ll -a

输出这些文件

sh
[root@VM-12-14-opencloudos data]# cd /data && ll -a 
root 4096 Nov  2 20:46 .
root 4096 Nov  3 22:22 ..
root 4179 Nov  2 20:34 docker-compose.yaml
root  125 Nov  2 20:34 .env
root 4096 Nov  2 20:34 mysql
root 4096 Nov  2 20:34 nginx

直接执行compose脚本部署:

sh
$ docker-compose up -d

会自动下载所有的镜像文件,等待一段时间,咱们中间件的应用就部署好了:

看下容器情况

sh
$ docker ps -a

OK,咱们系统所需的中间件已经部署完成。

细心的小伙伴可能发现了,除了创建了容器还创建了一个默认网络, xh_default。 这个网络后面部署咱们应用的微服务时还会用到。

中间件访问

中间件端口号web管理地址用户名初始密码
mysql8.03306root1qaz@WSX#EDC
redis6379
minio9000,9001http://localhost:9001root1qaz@WSX#EDC
xxl-job-admin8088http://localhost:8088/xxl-job-adminadmin123456
nacos8848,9848http://localhost:8848/nacosnacosnacos
jenkins8080http://localhost:8080后续生成

nginx是反向代理服务器,后续会进行配置

jenkins 是一款 Java 语言编写的开源的持续集成工具,我们主要用这个来做自动化部署微服务。