docker-compose 构建Springboot+Nginx+Mysql+Redis一站式部署说明
0.说在最前面
0.1 文件目录结构
0.2 注意点
其中
mysql的my.cnf
nginx的配置
redis的配置需要提前准备好
项目需要提前准备好Dockerfile 文件
1.Nginx
# 配置nignx服务
nginx:
# nginx最新镜像
image: nginx:latest
# 定义容器名称
container_name: nginx-compose
# 配置nginx环境
environment:
- TZ=Asia/Shanghai
# 配置端口
ports:
- "80:80"
- "8080:8080"
# 配置挂载的文件夹
volumes:
# nginx配置文件夹
- /workspace/docker-compose/nginx/conf.d:/etc/nginx/conf.d
# nginx静态文件
- /workspace/docker-compose/nginx/html:/etc/nginx/html
# nginx日志
- /workspace/docker-compose/nginx/logs:/var/log/nginx
# 自动重启
restart: always
配置文件定义了镜像/容器名称/运行环境/端口/挂载路径/自动启动等信息
其中挂载路径这样详细说明:
/workspace/docker-compose/nginx/conf.d:/etc/nginx/conf.d
将宿主机的 /workspace/docker-compose/nginx/conf.d 映射到 容器的/etc/nginx/conf.d 路径
然后只需要将nginx的配置文件放在 /workspace/docker-compose/nginx/conf.d 下即可
其中说明:我们这边没有直接映射nginx.conf文件,而是映射配置配置文件子文件夹,因为主配置文件nginx.conf 引入了此文件夹下的所有文件。
include /etc/nginx/conf.d/*.conf;
# 静态文件配置
server {
listen 80;
server_name localhost;
location / {
root html; # 此处默认/etc/nginx/html 路径,可以另外指定路径
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html; # 此处默认/etc/nginx/html 路径,可以另外指定路径
}
}
#ecapi-compose
server {
listen 8080;
server_name localhost;
client_max_body_size 100m;
location / {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://100.100.200.213:8181;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;# 此处默认/etc/nginx/html 路径,可以另外指定路径
}
}
2.Mysql
# 配置mysql服务
mysql:
# 这里指定我们的镜像文件,mysql版本是5.7,
image: mysql:5.7
# 配置我们容器的名字
container_name: mysql-compose
# 通过我们的宿主机的3306端口映射到容器里的3306端口,
# 因为容器内的网络与我们外界是不互通的,只有宿主机能够去访问我们的容器,
# 这样我们就能通过宿主机的3306端口去访问容器的mysql了
ports:
- "3306:3306"
# 配置环境,主要是配置我们的mysql的登陆密码,
# mysql容器创建出来默认可以用不同的ip地址访问,所以这里不用进行配置
environment:
TZ: Asia/Shanghai
MYSQL_DATABASE: ecdb
MYSQL_ROOT_PASSWORD: 123456a?
MYSQL_ROOT_HOST: '%'
# 等同于 -e MYSQL_ROOT_PASSWORD指定root的登录密码
#- MYSQL_ROOT_PASSWORD=123456a?
#- MYSQL_ALLOW_EMPTY_PASSWORD='no'
# 这里这个指令compose启动成功后会自动创建名为docker的数据库
#- MYSQL_DATABASE='ecdb02'
# 此处就是相当于 mysql create user,创建了数据库的登录用户
#- MYSQL_USER='ecuser'
#- MYSQL_PASSWORD='123456a?'
# 配置挂载的文件夹
volumes:
# 配置文件(conf.d mysql.conf.d my.cnf,需要在/workspace/docker-compose/mysql/conf下新建)
- /workspace/docker-compose/mysql/conf:/etc/mysql
# mysql数据
- /workspace/docker-compose/mysql/data:/var/lib/mysql
# 数据库日志
- /workspace/docker-compose/mysql/logs:/var/log/mysql
# 初始化数据库
- /workspace/docker-compose/mysql/init/:/docker-entrypoint-initdb.d/
# 设置命令
command:
[
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
# 这行代码解决无法访问的问题
'--default-authentication-plugin=mysql_native_password'
]
# 自动重启
restart: always
其中 /workspace/docker-compose/mysql/conf 需要新建conf.d mysql.conf.d 两个文件夹,不让回启动报错提示没有此文件夹,至于my.cnf 配置不在此说明
3.Redis
# 配置redis服务
redis:
# 设置容器对应的镜像
image: redis:latest
# 设置容器名
container_name: redis-compose
# 配置环境
environment:
- TZ=Asia/Shanghai
# 同上,作为端口映射
ports:
- "6379:6379"
# 同上,挂载文件夹
volumes:
# 配置文件(需要在宿主机路径上传redis.conf文件)
- /workspace/docker-compose/redis/redis.conf:/etc/redis/redis.conf
# 数据
- /workspace/docker-compose/redis/data:/data
# 日志
- /workspace/docker-compose/redis/logs:/var/log/redis
# 设置命令
command: redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456
# 自动重启
restart: always
其中redis.conf配置 不在这边说了
4.SpringBoot 应用
# 配置springboot服务
springboot:
# 生成镜像,用.它会自动去指定目录下面去找一个Dockerfile的文件,
#然后根据里面的配置去生成一个镜像
build: ./projects
# 指定我们生成的镜像的名字和版本号
image: ecapi-images:2.0
# 指定容器名
container_name: ecapi02
# 同上,做端口映射
ports:
- "8181:8181"
# 同上,挂载文件夹,配置文件外挂
volumes:
- /workspace/docker-compose/projects/config:/home/ecapi/config
# 写清楚我们springboot依赖的服务,有mysql以及redis,这里的名称是service名
depends_on:
- nginx
- mysql
- redis
# 自动重启
restart: always
注意点:外部配置文件需要配置挂载目录
对于mysql和redis 相关的配置地方 需要改成服务名称而不是ip地址
5.完整的配置文件
docker-compose.yml
#表示注释
# 指定我们docker-compose的版本
version: "3"
# 设置我们的服务
services:
# 配置nignx服务
nginx:
# nginx最新镜像
image: nginx:latest
# 定义容器名称
container_name: nginx-compose
# 配置nginx环境
environment:
- TZ=Asia/Shanghai
# 配置端口
ports:
- "80:80"
- "8080:8080"
# 配置挂载的文件夹
volumes:
# nginx配置文件夹
- /workspace/docker-compose/nginx/conf.d:/etc/nginx/conf.d
# nginx静态文件
- /workspace/docker-compose/nginx/html:/etc/nginx/html
# nginx日志
- /workspace/docker-compose/nginx/logs:/var/log/nginx
# 自动重启
restart: always
# 配置mysql服务
mysql:
# 这里指定我们的镜像文件,mysql版本是5.7,这里要使用docker命令拉取镜像,这里先写着,后面我教大家怎么拉取镜像
image: mysql:5.7
# 配置我们容器的名字
container_name: mysql-compose
# 通过我们的宿主机的3306端口映射到容器里的3306端口,因为容器内的网络与我们外界是不互通的,只有宿主机能够去访问我们的容器,这样我们就能通过宿主机的3306端口去访问容器的mysql了
ports:
- "3306:3306"
# 配置环境,主要是配置我们的mysql的登陆密码,mysql容器创建出来默认可以用不同的ip地址访问,所以这里不用进行配置
environment:
TZ: Asia/Shanghai
MYSQL_DATABASE: ecdb
MYSQL_ROOT_PASSWORD: 123456a?
MYSQL_ROOT_HOST: '%'
# 等同于 -e MYSQL_ROOT_PASSWORD指定root的登录密码
#- MYSQL_ROOT_PASSWORD=123456a?
#- MYSQL_ALLOW_EMPTY_PASSWORD='no'
# 这里这个指令compose启动成功后会自动创建名为docker的数据库
#- MYSQL_DATABASE='ecdb02'
# 此处就是相当于 mysql create user,创建了数据库的登录用户
#- MYSQL_USER='ecuser'
#- MYSQL_PASSWORD='123456a?'
# 配置挂载的文件夹
volumes:
# 配置文件(conf.d mysql.conf.d my.cnf)
- /workspace/docker-compose/mysql/conf:/etc/mysql
# mysql数据
- /workspace/docker-compose/mysql/data:/var/lib/mysql
# 数据库日志
- /workspace/docker-compose/mysql/logs:/var/log/mysql
# 初始化数据库
- /workspace/docker-compose/mysql/init/:/docker-entrypoint-initdb.d/
# 设置命令
command:
[
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
# 这行代码解决无法访问的问题
'--default-authentication-plugin=mysql_native_password'
]
# 自动重启
restart: always
# 加入指定网络,容器间必须要处于同一个网络才能通过容器名称进行调用
#networks:
# - my_network
# 配置redis服务
redis:
# 设置容器对应的镜像
image: redis:latest
# 设置容器名
container_name: redis-compose
# 配置环境
environment:
- TZ=Asia/Shanghai
# 同上,作为端口映射
ports:
- "6379:6379"
# 同上,挂载文件夹
volumes:
# 配置文件(需要在宿主机路径上传redis.conf文件)
- /workspace/docker-compose/redis/redis.conf:/etc/redis/redis.conf
# 数据
- /workspace/docker-compose/redis/data:/data
# 日志
- /workspace/docker-compose/redis/logs:/var/log/redis
# 设置命令
command: redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456
# 自动重启
restart: always
# 加入指定网络,容器间必须要处于同一个网络才能通过容器名称进行调用
#networks:
# - my_network
# 配置springboot服务
springboot:
# 生成镜像,用.它会自动去当前目录下面去找一个Dockerfile的文件,然后根据里面的配置去生成一个镜像
build: ./projects
# 指定我们生成的镜像的名字和版本号
image: ecapi-images:2.0
# 指定容器名
container_name: ecapi02
# 同上,做端口映射
ports:
- "8181:8181"
# 同上,挂载文件夹
volumes:
- /workspace/docker-compose/projects/config:/home/ecapi/config
# 加入指定网络,容器间必须要处于同一个网络才能通过容器名称进行调用
#networks:
# - my_network
# 写清楚我们springboot依赖的服务,有mysql以及redis,这里的名称是service名
depends_on:
- nginx
- mysql
- redis
# 自动重启
restart: always
# 创建网络
#networks:
# 默认将会创建为 docker-compose.yml所在 文件夹名_my_network 网络名称
#my_network: