使用Docker搭建Nacos集群

本次是在Mac的M1版本上使用Docker搭建Nacos集群的详细步骤,并记录了一些遇到的问题及解决方案。

搭建涉及:1个Nginx + 3个Nacos + 1个MySQL

使用版本:Nginx为1.22.0,Nacos为2.0.3,MySQL为8.0.30

一、创建虚拟网络

因为MySQL、Nacos和Nginx需要在同一个网络下互通,且MySQL和Nacos集群需要指定IP地址,所以需要创建虚拟网络,默认网络不能指定IP。

bash 复制代码
docker network create --subnet=172.19.0.0/16 mynet

注意:创建时,自定义网络的网段不能和已有的虚拟网段冲突,否则会报如下错误:

Error response from daemon: Pool overlaps with other one on this address space

可通过 docker network ls 查看都有哪些网络,并通过 docker network inspect 虚拟网络名 来查看对应所处的子网范围。新建网络时不和已有的虚拟网络处于同一个网段即可。

二、创建MySQL容器

bash 复制代码
cd /Users/songwj/lib/docker/mysql

# 创建名为mysql的容器,并指定网络mynet和IP地址
docker run -id \
--name=mysql \
--net mynet --ip 172.19.0.2 \
-p 3306:3306 \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql

初始化数据库脚本:

到官网:Release 2.0.3 (July 28, 2021) · alibaba/nacos · GitHub,下载nacos-server-2.0.3.tar.gz,解压

创建数据库名为nacos_config,并刷脚本conf/nacos-mysql.sql

注意:刷的脚本得和nacos服务的版本一致,否则添加配置时可能报:发布失败。请检查参数是否正确。

三、创建Nacos容器

因为本次为Mac的M1版本,本次使用的镜像为:zhusaidong/nacos-server-m1:2.0.3,创建3个nacos容器:nacos01、nacos02和nacos03

bash 复制代码
docker run -id \
--name=nacos01 \
--net mynet --ip 172.19.0.3 \ # 指定网络和IP
-e PREFER_HOST_MODE=ip \
-e MODE=cluster \ # 启用集群模式
-e NACOS_SERVERS="172.19.0.4:8848 172.19.0.5:8848" \ # 指定另外两台的IP和端口
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=172.19.0.2 \  # MySQL容器IP地址
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-p 3333:8848 \
zhusaidong/nacos-server-m1:2.0.3

docker run -id \
--name=nacos02 \
--net mynet --ip 172.19.0.4 \
-e PREFER_HOST_MODE=ip \
-e MODE=cluster \
-e NACOS_SERVERS="172.19.0.3:8848 172.19.0.5:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=172.19.0.2 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-p 4444:8848 \
zhusaidong/nacos-server-m1:2.0.3

docker run -id \
--name=nacos03 \
--net mynet --ip 172.19.0.5 \
-e PREFER_HOST_MODE=ip \
-e MODE=cluster \
-e NACOS_SERVERS="172.19.0.3:8848 172.19.0.4:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=172.19.0.2 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-p 5555:8848 \
zhusaidong/nacos-server-m1:2.0.3

四、创建Nginx容器

bash 复制代码
cd /Users/songwj/lib/docker/nginx

docker run -id \
--name=nginx \
--net mynet \ # 指定网络mynet
-p 1111:80 \
-v $PWD/conf.d:/etc/nginx/conf.d \
-v $PWD/html:/etc/nginx/html \
-v $PWD/log:/usr/log/nginx \
-v $PWD/nginx.conf:/etc/nginx/nginx.conf \
nginx:1.22.0

此处nginx.conf配置:

bash 复制代码
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;

    upstream nacosList {
        server 172.19.0.3:8848;
        server 172.19.0.4:8848;
        server 172.19.0.5:8848;
    }

    server {
        listen       80;
        server_name  172.19.0.6;

        location / {
            proxy_pass http://nacosList;
        }
    }
}

五、访问测试

http://localhost:1111/nacos

此时通过1111端口访问,可以自动负载均衡,新配置的数据正常写入MySQL。

相关推荐
JavaPub-rodert9 小时前
Go 后台如何同时兼容 MySQL、PostgreSQL、SQLite 和 SQL Server?从 ShiyuAdmin 看 GORM 多数据库适配
数据库·mysql·postgresql·golang·javapub·王仕宇
爱吃火鸡面呀10 小时前
MySQL 查询与函数详解:从基础条件筛选到高级字符处理
数据库·mysql
知行产研10 小时前
中国矿山无人驾驶出海的三重门
数据库·mysql·php
艾伦_耶格宇11 小时前
【DOCKER容器实战】-2MySQL
运维·docker·容器
爱和冰阔落11 小时前
【MySQL 慢查询排查实战】列表接口逐渐变慢时,怎样从请求链路定位原因
android·数据库·mysql
Dxy123931021612 小时前
MySQL有哪些锁?InnoDB锁体系完整梳理博客
数据库·mysql
wear工程师12 小时前
MySQL 索引条件下推是什么?Using index condition 并不是覆盖索引
sql·mysql
禅口魔心12 小时前
RK3576开发——Docker部署
docker·嵌入式linux
方便面不加香菜13 小时前
MySQL 复合查询
数据库·mysql
随便做点啥13 小时前
32卡×4090 24GB,Qwen3.8-27B-FP8 集群部署报告
服务器·经验分享·docker·vllm