栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Apply Docker to Deploy Nacos Cluster, Integrate MySQL and Implement Reverse Proxy with Nginx

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Apply Docker to Deploy Nacos Cluster, Integrate MySQL and Implement Reverse Proxy with Nginx

푰’풎 풉풉품, 푰 풂풎 풂 품풓풂풅풖풂풕풆 풔풕풖풅풆풏풕 풇풓풐풎 푵풂풏풋풊풏품, 푪풉풊풏풂.

 푺풉풄풐풐풍: 푯풐풉풂풊 푼풏풊풗풆풓풔풊풕풚 푳풆풂풓풏풊풏품: 푰’풎 풄풖풓풓풆풏풕풍풚 풍풆풂풓풏풊풏품 풅풆풔풊품풏 풑풂풕풕풆풓풏, 푳풆풆풕풄풐풅풆, 풅풊풔풕풓풊풃풖풕풆풅 풔풚풔풕풆풎, 풎풊풅풅풍풆풘풂풓풆 풂풏풅 풔풐 풐풏. 푯풐풘 풕풐 풓풆풂풄풉 풎풆:푽푿 푴풚 풃풍풐품: 풉풕풕풑풔://풉풉품풚풚풅풔.풃풍풐품.풄풔풅풏.풏풆풕/ 푷풓풐풇풆풔풔풊풐풏풂풍 풔풌풊풍풍풔:풎풚 풅풓풆풂풎

为什么要用英文写呢?为了去外企,为了摆脱自己对英语的恐惧,不是装B。

1-1: Nacos Cluster Architecture Nacos集群架构


The picutre comes from Nacos. It shows the main nacos cluster arch. As I understand it, there maybe an Nginx server exist in front of docker nacos cluster. So, I try to deploy an nacos cluster by using docker-compose technology and an Nginx server. This article aims to record the process of deploying and the peoblems during completing it.

1-2: Environment

Docker-compose v2.2.2 : Different docker-compose version don’t seem to be a problem.Nacos: v2.0.3 the latestMySQL: v5.7Nginx: v1.18.0 1-3: Project Arch and Nacos Deploment in Docker

nacos-hostname.env

#nacos dev env
PREFER_HOST_MODE=hostname
# docker实例别名,可以换成ip port must be 8848
NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
MYSQL_SERVICE_HOST=mysql
# 指定保存数据的数据库名称
MYSQL_SERVICE_DB_NAME=nacos_devtest
# 访问mysql端口
MYSQL_SERVICE_PORT=3306
# 访问mysql的用户名
MYSQL_SERVICE_USER=root
# 访问mysql的密码
MYSQL_SERVICE_PASSWORD=root
custom.properties
#spring.security.enabled=false
#management.security=false
#security.basic.enabled=false
#nacos.security.ignore.urls=/**
#management.metrics.export.elastic.host=http://localhost:9200
# metrics for prometheus
management.endpoints.web.exposure.include=*

# metrics for elastic search
#management.metrics.export.elastic.enabled=false
#management.metrics.export.elastic.host=http://localhost:9200

# metrics for influx
#management.metrics.export.influx.enabled=false
#management.metrics.export.influx.db=springboot
#management.metrics.export.influx.uri=http://localhost:8086
#management.metrics.export.influx.auto-create-db=true
#management.metrics.export.influx.consistency=one
#management.metrics.export.influx.compressed=true
docker-compose.yml
version: "3"
services:
  mysql:
    container_name: mysql
    # 最新的mysql8版本
    image: mysql:5.7
    environment:
      # mysql root用户密码
      MYSQL_ROOT_PASSWORD: root
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M;
    volumes:
      # mysql的数据文件
      - ./mysql/data:/var/lib/mysql
      # mysql配置文件
      - ./mysql/config:/etc/mysql/conf.d
    ports:
      - "3306:3306"
  nacos1:
    hostname: nacos1
    container_name: nacos1
    image: nacos/nacos-server:latest
    volumes:
      # 需要添加mysql8的插件
      #- ./nacos/plugins/mysql/:/home/nacos/plugins/mysql/
      # 把日志文件映射出来
      - ./nacos/cluster-logs/nacos1:/home/nacos/logs
      # 把配置文件映射出来
      - ./nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties
    
    environment:                       # 设置环境变量,相当于docker run命令中的-e
      - JVM_XMS=512m
      - JVM_XMX=512m
      - JVM_XMN=128m
      #- MODE=standalone
    ports:
      - "8848:8848"
      - "9555:9555"
    env_file:
        # 集群配置文件
      - ./nacos/env/nacos-hostname.env
    restart: always
    depends_on:
      - mysql
  nacos2:
    hostname: nacos2
    image: nacos/nacos-server:latest
    container_name: nacos2
    volumes:
      #- ./nacos/plugins/mysql/:/home/nacos/plugins/mysql/
      - ./nacos/cluster-logs/nacos2:/home/nacos/logs
      - ./nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties
    environment:                        # 设置环境变量,相当于docker run命令中的-e
      - JVM_XMS=512m
      - JVM_XMX=512m
      - JVM_XMN=128m
    ports:
      - "8849:8848"
    env_file:
      - ./nacos/env/nacos-hostname.env
    restart: always
    depends_on:
      - mysql
  nacos3:
    hostname: nacos3
    image: nacos/nacos-server:latest
    container_name: nacos3
    volumes:
      #- ./nacos/plugins/mysql/:/home/nacos/plugins/mysql/
      - ./nacos/cluster-logs/nacos3:/home/nacos/logs
      - ./nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties
    environment:                      # 设置环境变量,相当于docker run命令中的-e
      - JVM_XMS=512m
      - JVM_XMX=512m
      - JVM_XMN=128m
    ports:
      - "8850:8848"
    env_file:
      - ./nacos/env/nacos-hostname.env
    restart: always
    depends_on:
      - mysql
Remember!!! The sql file should be imported into db nacos_devtest. sql file download

The files above refer to get source code from gitee and offical nacos group.

Success: All nodes status are up.

Create a dataId in one node and you will get the same in another.

Notes:

In most cases, we may add port mappings in docker services. e.x. - port "8849:8848" i.e. Expose the 8848 port inside the container to the outside 8849 port. However, we may omits one problem. Let me show you. Firstly, when the docker-compose.yml is finished and deployed by docker-compose up command. Docker engine will create an network called ${dir}_defalut like this:

(base) ➜  docker-compose-nacos-mysql-master docker network list    
NETWORK ID     NAME                            DRIVER    SCOPE
72eddc5e38ac   bridge                          bridge    local
7348f4641015   docker-nacos_default            bridge    local <-----

We can inspect this network:

 "Containers": {
    "185a008b417d09201c8e8efdc5b4b68776f994d797c32d9fbd523327c80cff80": {
        "Name": "nacos2",
        "EndpointID": "be3a4eba47b6d5908682ece4a9465390385ec5a10ab8b5730d7eb8c2d436c309",
        "MacAddress": "02:42:ac:1b:00:05",
        "IPv4Address": "172.27.0.5/16",
        "IPv6Address": ""
    },
    "1f09159bc54c43a4fb86eb84e083ab35354e727d1c1bd0a4cab448298e4c2b71": {
        "Name": "nacos1",
        "EndpointID": "a61935035f6940ad624ac68cd49af76faa1461146130bf1c4349157eed53232f",
        "MacAddress": "02:42:ac:1b:00:06",
        "IPv4Address": "172.27.0.6/16",
        "IPv6Address": ""
    },
    "b11c0f47fafb15b7523be1c63d5d8f9134c2705dad128ba46630bbff48fe40d8": {
        "Name": "nacos3",
        "EndpointID": "59d1641bff3f8250bb0c3e13e78c5e44e3c3caeaf8ed48ca7d72b6df6fd32f5b",
        "MacAddress": "02:42:ac:1b:00:03",
        "IPv4Address": "172.27.0.3/16",
        "IPv6Address": ""
    },
    "e0d5e0d03a07dfea11cd061097a3e1ef2fee6f851c282bff8b8a89d228a5194e": {
        "Name": "mysql",
        "EndpointID": "f20dd0ed478656e497c502d74541e2c57d30f27b45b0360f25ca766f89edd2e4",
        "MacAddress": "02:42:ac:1b:00:02",
        "IPv4Address": "172.27.0.2/16",
        "IPv6Address": ""
    }
}

This shows us the ip of containers(mysql, nacos1, nacos2, nacos3) in docker.

Ok, if I deploy MySQL - port "3307:3306", my host reaches MySQL at 127.0.0.1:3307. Thinking of it, how does nacos1 in the docker container reach MySQL which is in another container? 3307 or 3306? YES ! 3306 is right ! So, let’s check the nacos-hostname.env confiuration file. NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848 We use the hostname nacos1 instead of the real ip. The ports are also 8848 rather than 8849,8850… so it is MYSQL_SERVICE_PORT=3306.

How to know whether the services could communicate with each other? you can use ping utils in one contaniner. Like this:ping ${antoher container ip adress}, the ip address must be in docker network, such as docker-nacos_default above.

If there has been a MySQL service in your docker container, you must put them(nacos1…3, MySQL) in the same network in order to communicate with each other.

1-4: Nginx Reverse Proxy

As mentioned above, the Nacos cluster won’t be exposed to the outer environment. Each request reaches Nginx first, then Nginx dispatches requests to the Nacos cluster. In this article, I deploy nginx on my host, not docker. Yes, I failed to deploy it on the docker. The main reason is the network in docker. I put nginx on the same docker network docker-nacos_default. Many times I have tried I failed. QAQ. Fortunately, I realized my idea on my host machine-Ubuntu.You can install it by apt-get install nginx . Here is my config.

(base) ➜  docker-compose-nacos-mysql-master cd /etc/nginx 
(base) ➜  nginx ls
conf.d          koi-utf     modules-available  proxy_params     sites-enabled  win-utf
fastcgi.conf    koi-win     modules-enabled    scgi_params      snippets
fastcgi_params  mime.types  nginx.conf         sites-available  uwsgi_params
(base) ➜  nginx cat nginx.conf 
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 768;
	# multi_accept on;
}

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;
	# server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

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

	##
	# SSL Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    upstream nacos { 
      server  192.168.1.4:8848 weight=10; 
      server  192.168.1.4:8849 weight=10; 
      server  192.168.1.4:8850 weight=10; 
    } 
    server{ 
      listen 80; 
      server_name  192.168.1.4; 
      location / { 
          proxy_pass         http://nacos; 
      } 
    }
	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}

In my host, access nacos must from 192.168.1.4:8848; 192.168.1.4:8849; 192.168.1.4:8850; 192.168.1.4 is my ip. Nacos expose their internal port 8848 by 8848, 8849 and 8850 to the outside world. Like the picture below:

Success: Chrome access

http://192.168.1.4/nacos/#/configurationManagement?dataId=&group=&appName=&namespace=&pageSize=&pageNo=

We can arrive nacos terminal.

1-5: Reference

Install NginxChange Apt Source in Docker ContainerMySQL master-servant + Nacos cluster + Nginx master-servantGitee Deployment Written by a CoderCommunication Between ContainersOfficial Naco Group. There are examples of docker deployment in it.Docker Cluster Deployment If You Has A MySQL Container Aleardy. i.e Different Docer Network Deploymentnacos-mysql.sqlNacos Cluster Deployment document

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/730202.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号