部署中间件
提示
docker-compose
结构化的yaml文档可以清晰的了解整个系统容器,所有中间件均采用 docker-compose
工具部署。
为方便快速搭建环境,我已经将相关部署配置文件放在 docs/docker/ 目录下,直接拷贝至服务器运行即可完成所需中间件的部署。
说明
有个细节还是必要说下:
docker-compose up
会创建默认的网络,网络的名称为 当前compose文件所在文件夹名称_default
,例如此配置文件在data目录下,所以默认网络为 data_default
。
设置 COMPOSE_PROJECT_NAME
环境变量可以定制默认网络名称,本节教程中我设置的是 xh
,所以会创建一个 xh_default
的网络。
在同一个配置文件中启动的所有容器默认会加入这个网络,so,容器间互相访问可以直接通过容器 container_name
访问,无需额外的配置。
如本教程中的 nacos
和 xxl-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.0 | 3306 | 无 | root | 1qaz@WSX#EDC |
redis | 6379 | 无 | 无 | 无 |
minio | 9000,9001 | http://localhost:9001 | root | 1qaz@WSX#EDC |
xxl-job-admin | 8088 | http://localhost:8088/xxl-job-admin | admin | 123456 |
nacos | 8848,9848 | http://localhost:8848/nacos | nacos | nacos |
jenkins | 8080 | http://localhost:8080 | 后续生成 |
nginx是反向代理服务器,后续会进行配置
jenkins 是一款 Java 语言编写的开源的持续集成工具,我们主要用这个来做自动化部署微服务。