Docker 下搭建 Nginx + Nacos + MySQL
Nginx 反向代理 Nacos(官方文档说至少配置 3 个节点才能组成集群),Nacos 的数据持久化到 MySQL 中(默认存储在内嵌的 Apache Derby 数据库中)。
MySQL
Docker 安装 MySQL
docker pull mysql
创建映射文件夹
将容器内的文件夹映射到主机的 /opt/ 文件夹中:
# 配置文件路径
mkdir -p /opt/mysql/conf
# 数据文件路径
mkdir –p /opt/mysql/data
# 日志文件路径
mkdir -p /opt/mysql/logs
配置 MySQL
执行 vim /etc/mysql/conf.d/my.cnf
命令创建自定义配置文件:
[mysqld]
# 服务端对外开放的端口
port=3306
# 服务端使用的字符集默认为 UTF8(utf8mb4 这个才是真的UTF8格式,默认的不是很建议)
character-set-server=utf8mb4
# 修改时区为北京/上海所在的东八区(MySQL 8 需要修改,不然连不上 MySQL)
default-time-zone = '+8:00'
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用 “mysql_native_password” 插件认证,否则远程连接失败
default_authentication_plugin=mysql_native_password
# 允许最大连接数
max_connections=200
# 允许连接失败的次数,防止有人从该主机试图攻击数据库系统
max_connect_errors=10
[client]
# 客户端连接服务端时使用的端口
port=3306
# 客户端使用的字符集默认为 UTF8(utf8mb4 这个才是真的UTF8格式,默认的不是很建议)
default-character-set=utf8mb4
启动容器
docker run -d --name mysql -p 3306:3306 \
--restart=always \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /opt/mysql/conf.d:/etc/mysql/conf.d \
-v /opt/mysql/logs:/logs \
-v /opt/mysql/data:/data \
mysql
启动参数说明:
-d
:后台运行容器,并返回容器 ID--name
:为容器指定一个名称-v
:将容器内的文件夹映射到主机的 /opt/ 文件夹中-p
:指定端口映射 格式为: 主机 port: 容器 port--restart always
:始终重启-e MYSQL_ROOT_PASSWORD
:指定 root 用户密码
使用
hostname -i
命令可以查询容器对应的内网 IP 地址。
修改加密方式
配置完 MySQL 之后,这一步就不需要操作了。
MySQL 8 引入了新特性 caching_sha2_password,这种密码加密方式客户端不支持,客户端支持的是 mysql_native_password,所以需要修改:
# 进入容器
docker exec -it --privileged mysql bash
# 以 root 用户登录,密码为 123456
mysql -uroot -p123456
# 修改用户的密码和加密方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
远程连接及创建数据库
使用 ifconfig
命令查询 Linux 主机的 IP:
使用 172.20.182.182 连接之后,创建一个名为 nacos_config 的 schema,然后使用 Nacos 安装路径下(Windows 版本)的 \conf\nacos-mysql.sql 创建数据库表。
Nacos
Docker 安装 Nacos
docker pull nacos/nacos-server
Nacos 2.0.3 版本有问题,按照下面操作,映射配置文件 application.properties 后 IP:8848/nacos 无法访问,不映射配置文件时正常访问。
创建映射文件夹
将容器内的文件夹映射到主机的 /opt/ 文件夹中:
# 配置文件路径,不用执行
mkdir -p /opt/nacos/conf/
# 日志文件路径
mkdir -p /opt/nacos/logs/
拷贝默认配置,不用执行
# 启动容器
docker run -d --name nacos -p 8848:8848 nacos/nacos-server
# 获取容器 ID
docker ps | grep nacos
# 拷贝配置文件,a7f8f0567703 为上一步查到的容器 ID
docker cp a7f8f0567703:/home/nacos/conf/application.properties /opt/nacos/conf/application.properties
# 强制删除容器
docker rm -f nacos
将数据源切换为 MySQL
# 查看 bridge 网络信息
docker network inspect bridge
找到 MySQL 的内网 IP 地址为 172.17.0.3(该 IP 可能变化):
# 修改配置文件,将 Nacos 数据源切换为 MySQL,不用执行
vim /opt/nacos/conf/application.properties
# 进入容器再修改,而不是在映射配置文件中修改
# 启动容器
docker run -d --name nacos8848 -p 8848:8848 \
--restart always \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
-v /opt/nacos/logs:/home/nacos/logs \
nacos/nacos-server
# 进入容器
docker exec -it --privileged nacos8848 bash
# 将数据源切换为 MySQL
vim ./conf/application.properties
修改如下:
启动容器
# 第一个使用主机的 8848 端口
docker restart nacos8848
# 同样的方式配置并启动第二个和第三个 Nacos 容器
# 第二个使用主机的 8849 端口
docker run -d --name nacos8849 -p 8849:8848 \
--restart always \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
-v /opt/nacos/logs:/home/nacos/logs \
nacos/nacos-server
# 第三个使用主机的 8850 端口
docker run -d --name nacos8850 -p 8850:8848 \
--restart always \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
-v /opt/nacos/logs:/home/nacos/logs \
nacos/nacos-server
Nginx
Docker 安装 Nginx
docker pull nginx
创建映射文件夹
将容器内的文件夹映射到主机的 /opt/ 文件夹中(也可以不创建,运行容器时会自动创建,这里只是为了说明文件夹作用):
# 配置文件路径
mkdir -p /opt/nginx/conf/conf.d
# 静态资源路径
mkdir -p /opt/nginx/html
# 日志文件路径
mkdir -p /opt/nginx/logs
拷贝默认配置
# 启动容器
docker run -d --name nginx -p 80:80 nginx
# 获取容器 ID
docker ps | grep nginx
# 拷贝配置文件,383881afbd49 为上一步查到的容器 ID
docker cp 383881afbd49:/etc/nginx/nginx.conf /opt/nginx/conf/nginx.conf
docker cp 383881afbd49:/etc/nginx/conf.d /opt/nginx/conf
docker cp 383881afbd49:/usr/share/nginx/html /opt/nginx/html
# 强制删除容器
docker rm -f nginx
修改配置
# 修改配置文件,使用反向代理及负载均衡
vim /opt/nginx/conf/nginx.conf
修改如下:
#gzip on;
upstream cluster { # 使用默认的时间片轮循负载均衡策略
server 172.20.182.182:8848;
server 172.20.182.182:8849;
server 172.20.182.182:8850;
}
include /etc/nginx/conf.d/*.conf;
server {
listen 80; # 监听的端口
server_name 172.20.182.182; # 要转发的域名或 IP
location / {
add_header backendIP $upstream_addr; # 添加 HTTP 响应头,以便知道负载到哪台服务器上
add_header backendCode $upstream_status; # 响应码
proxy_pass http://cluster; # 代理转发到 cluster
}
}
启动容器
docker run -d --name nginx -p 80:80 \
--restart=always \
-v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /opt/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /opt/nginx/html:/usr/share/nginx/html \
-v /opt/nginx/logs:/var/log/nginx \
nginx
浏览器访问 http://172.20.182.18/nacos ,按下 F12
即可看到请求落到哪台 Nacos 服务器上了。