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:
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 可能变化):
MySQL 的内网 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

修改如下:
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 服务器上了。

更简便的方法:使用 docker-compose

docker 搭建 nginx 主备模式反向代理 Nacos 集群加 mysql 主从复制

posted @ 2021-10-10 21:57  ageovb  阅读(489)  评论(0编辑  收藏  举报