docker-compose部署MySQL+Mongo+Redis+Nginx+SpringBoot应用
docker-compose部署MySQL+Mongo+Redis+Nginx+SpringBoot应用
docker和docker-compose的安装步骤可以参考我的另外一篇文章
CentOS7安装部署docker和docker-compose
首先,找个合适的地方,新建一个docker-compose.yml文件。内容我先贴上我的,下面在解释
version: '3'
services:
# MySql配置
mysql:
# 随容器启动而启动
restart: always
image: [你的镜像拉取地址]
# 容器别名
container_name: mysql
# 端口映射
ports:
- "3506:3306"
# 设置网卡信息
networks:
- autoconnect-parent
command:
# MySQL5.0以后的,都加上这句
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
# 指定mysql启动后的初始化脚本
--init-file=/docker-entrypoint-initdb.d/init.sql
environment:
TZ: Asia/Shanghai
# 设置mysql的root密码
MYSQL_ROOT_PASSWORD: "你的mysql密码"
# 设置mysql使用的数据库
MYSQL_DATABASE: 你的数据库名
volumes:
# 磁盘挂载,将mysql的数据存在宿主机的/data/mysql/data目录
- /data/mysql/data:/var/lib/mysql
# 指定初始化脚本存放目录(容器内目录),这里和指定初始化脚本文件相呼应
- /data/mysql/init.d:/docker-entrypoint-initdb.d
# Mongo配置
mongo:
privileged: true
restart: always
image: [你的镜像拉取地址]
container_name: mongo
environment:
TZ: Asia/Shanghai
MONGO_INITDB_DATABASE: autoconnect
MONGO_INITDB_ROOT_USERNAME: itd
MONGO_INITDB_ROOT_PASSWORD: vendeitd002
ports:
- "29107:27017"
networks:
- autoconnect-parent
volumes:
- /etc/localtime:/etc/localtime
- /data/mongo/data:/data/db
# 指定初始化脚本所在目录,这里我写了,但是没卵用。后面再解释
- /data/mongo/init.d:/docker-entrypoint-initdb.d
# Redis配置
redis:
restart: always
container_name: redis
image: [你的镜像拉取地址]
ports:
- "16379:6379"
networks:
- autoconnect-parent
# 使用配置文件启动,这里我没挂载,因为提前把修改好的conf文件打进了镜像中。这里直接使用
command: redis-server /etc/redis/redis.conf
# Nginx配置
nginx:
restart: always
image: [你的镜像拉取地址]
container_name: nginx
ports:
- "80:80"
- "443:443"
networks:
- autoconnect-parent
# 这的配置是指nginx要和下面这些个容器有通信
links:
- admin
- exporter
- worker
- job
# 这个是指的,启动顺序,nginx要在下面这些容器启动好了以后才启动
depends_on:
- admin
- exporter
- worker
- job
# 项目
openjdk:
image: [你的镜像拉取地址]
restart: always
container_name: openjdk
admin:
restart: always
image: [你的镜像拉取地址]
container_name: admin
ports:
- "8109:8109"
networks:
- autoconnect-parent
volumes:
- /data/autoconnect:/mnt/autoconnect
links:
- mysql
- mongo
- redis
depends_on:
- openjdk
- mysql
- mongo
- redis
worker:
restart: always
image: [你的镜像拉取地址]
container_name: worker
ports:
- "8201:8201"
networks:
- autoconnect-parent
links:
- mysql
- mongo
- redis
depends_on:
- openjdk
- mysql
- mongo
- redis
exporter:
restart: always
image: [你的镜像拉取地址]
container_name: exporter
ports:
- "8200:8200"
networks:
- autoconnect-parent
links:
- mysql
- mongo
- redis
depends_on:
- openjdk
- mysql
- mongo
- redis
job:
restart: always
image: [你的镜像拉取地址]
container_name: job
ports:
- "9202:9202"
networks:
- autoconnect-parent
links:
- mysql
- mongo
- redis
depends_on:
- openjdk
- mysql
- mongo
- redis
# 设置一个虚拟网卡,把要相互通信的容器,都放在同一个网络里才能实现相互通信
networks:
autoconnect-parent:
Q1. 容器间的相互通信问题
同时部署这么多应用,肯定会有相互通信的,比如应用需要访问数据库,nginx需要转发请求到应用接口等等。
首先,需要确保相互通信的容器都在同一个网络。这就是为什么要新建一个名为autoconnect-parent的networks并把相互通信的容器都放在这个网卡里的原因。
其次需要打开容器允许远程访问的配置,比如mongo需要注释掉/etc/mongod.conf.orig文件里的bindIp配置。redis需要注释掉redis.conf文件里的# bind 127.0.0.1。mysql需要保证user的root用户的host存在%这个值等等。
在然后,容器内访问地址修改。比如应用需要访问mysql,那么application.yml里的mysql链接串就应该是:url: jdbc:mysql://mysql:[容器内端口号]。相同的nginx里转发的配置就要变成:proxy_pass http://admin:8102。
Q2. mongo初始化的问题
第一个问题就是,它不能像mysql一样指定用哪个脚本文件来初始化,只能配置初始化脚本所在目录。
第二个问题就是,我写的初始化脚本,它压根儿就不执行。
基于这两个问题,我只能先启动容器,在进入mongo容器去手动执行。DMT。
更多推荐
所有评论(0)