搜索镜像:docker search nacos
第一个便是我们需要的。
// 下载最新版本的Nacos镜像
docker pull nacos/nacos-server
按理,不写版本号,默认会来取最新的,但是本人拉取启动后进入页面,发现其是1.1.4版本的,与spring-cloud-alibaba-dependencies(2.1.0.RELEASE)不兼容,于是我重新拉取了新的镜像:
docker pull nacos/nacos-server:1.3.2
docker run -d -p 8848:8848 -e MODE=standalone -v /opt/nacos/logs:/home/nacos/logs -v /opt/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties --network=host --restart=always --name nacos-node nacos/nacos-server:1.3.2
-d:后台服务启动
-p:指定映射端口
-e MODE=standalone :单机模式启动(nacos默认集群启动,集群启动是无法访问页面的)
-v:指定挂载文件(不熟悉的,去学习一下docker)
–name:指定容器名
查看一下我们的容器是否启动成功
docker ps
最后测试Nacos是否启动成功
浏览器访问http://
单机的nacos单机起来很容易,接下来我们搭建集群,搭建其集群相对比较复杂。
我们的架构图如下:
这里我们就不搭建nginx的集群了。
我们先拉取以下镜像:
nginx,mysql,nacos
安装mysql,并启动容器: docker run -p 3306:3306 --name mysql -v /usr/local/dockerData/mysql/conf:/etc/mysql/conf.d -v /usr/local/dockerData/mysql/logs:/logs -v /usr/local/dockerData/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
查看容器文件目录:ls(不支持ll)
进入容器:docker exec -it 容器ID /bin/bash
并登录mysql,密码是123456
退出mysql:exit
容器不停止推出:ctrl+P+Q
我们已经安装好了mysql,下面我们就可以初始化我们的nacos的sql脚本了。
初始化sql
sql脚本入口: https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql
创建一个自己的数据库,把该脚本复制粘贴执行即可。到此,我们的数据库就安装完成了。
准备机器3台
192.168.1.160
192.168.1.161
192.168.1.162
linux设置固定ip:https://www.linuxidc.com/Linux/2017-12/149910.htm
linux虚拟机克隆:https://www.linuxidc.com/Linux/2017-06/144719.htm
// 每个节点都创建
mkdir -p /usr/local/docker/nacos-server
mkdir -p /usr/local/docker/nacos-server/env
mkdir -p /usr/local/docker/nacos-server/logs
mkdir -p /usr/local/docker/nacos-server/init.d
为啥要创建这些目录呢?怎么知道要创建这些目录文件?
我们学习docker可以知道文件挂载的概念,我们创建的这些目录就是为了映射容器内的相应文件。
从截图可以看到,我们进入nacos的容器后,可以看到容器内含有我们上述创建的目录,我们创建的目录就是为了映射这些文件。我们启动nacos时,指定这些映射文件,就可以读取到我们linux本机的配置而非容器内的配置。(这只是简单解释,基础差的赶紧的去学习docker了)。
custom.properties
vim /usr/local/docker/nacos-server/init.d/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
nacos-hostname.env
vim /usr/local/docker/nacos-server/env/nacos-hostname.env
#nacos dev env
# 首选主机模式
PREFER_HOST_MODE=hostname
# 当前主机的IP
NACOS_SERVER_IP=192.168.1.160
# 集群的各个节点
NACOS_SERVERS=192.168.1.160:8848 192.168.1.161:8848 192.168.1.162:8848
# 数据库的配置
MYSQL_SERVICE_HOST=192.168.1.160
MYSQL_SERVICE_DB_NAME=nacos
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=123456
# 从节点 这里就使用单节点测试,因此就不配置从节点
#MYSQL_SLAVE_SERVICE_HOST=xxx
#MYSQL_SLAVE_SERVICE_PORT=3306
# JVM参数 默认是2G 如果使用虚拟机,内存没有2G,就需要调整这里的参数,否则将无法启动
JVM_XMS=256m
JVM_XMX=256m
JVM_XMN=256m
将我们创建的工作目录拷贝到另外两个机子:
scp -r /usr/local/docker/nacos-server [email protected]:/usr/local/docker/nacos-server
scp -r /usr/local/docker/nacos-server [email protected]:/usr/local/docker/nacos-server
docker run \
-p 8848:8848 \
--restart=always \
--name nacos-node \
--env-file=/usr/local/docker/nacos-server/env/nacos-hostname.env \
-v /usr/local/docker/nacos-server/logs:/home/nacos/logs \
-v /usr/local/docker/nacos-server/init.d/custom.properties:/home/nacos/init.d/custom.properties \
-d nacos/nacos-server
分别在我们的三个机子启动:
到此,我们先理一理:
我们有三台机子,都分别启动了一个nacos容器
192.168.1.160:8848
192.168.1.161:8848
192.168.1.162:8848
这三个容器是集群模式启动,且使用的数据库都是同一个
192.168.1.160:3306(简单说明,数据库可以是任意能远程访问的数据库)
测试
访问任意节点的8848端口; 如: 192.168.1.160:8848/nacos 默认用户名和密码为: nacos/nacos ;登录之后查看节点即可看到如下效果.
特别说明:我们前面说过的,nacos默认是集群模式启动且未指定单机模式启动时是无法访问此页面的,如此,进一步说明我们的nacos集群已经搭建成功了。
**若你遇到页面无响应的情况,那就是集群未启动成功,nacos集群启动成功的条件如下:
异常查看
// 如果出现异常,可以在/usr/local/docker/nacos-server/logs目录下查看
tail -f /usr/local/docker/nacos-server/logs/nacos.log
参考:https://blog.csdn.net/qq_40140473/article/details/98632019
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
开始搭建:
# 拉取镜像
docker pull nginx
# 简单运行
docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
是的,你没有看错,一个简单的Nginx服务器就这样搭建起来了,访问http://localhost即可看到Nginx的欢迎页。需要使用它我们必须进入到容器内部进行更改配置文件操作,第一不是很方便,第二容器内没有现有的文件编辑器。所以这个时候我们需要在宿主机中集中管理Nginx的配置及日志等文件,接下来继续。
拷贝简单运行的Nginx容器中的文件到宿主机将要映射的目录地址中,我选择映射的目录在/data/nginx下(文件目录需先创建)。
Nginx配置文件:/etc/nginx/nginx.conf
Nginx默认配置文件:/etc/nginx/conf.d/default.conf
Nginx日志文件:/var/log/nginx(默认路径,可以在nginx.conf中更改)
Nginx静态文件:/usr/share/nginx/html
# 复制some-nginx容器中的静态文件
docker cp some-nginx:/usr/share/nginx/html /data/nginx/html
# 复制some-nginx容器中的配置文件
docker cp some-nginx:/etc/nginx/nginx.conf /data/nginx/conf/nginx.conf
# 复制some-nginx容器中的默认配置文件
docker cp some-nginx:/etc/nginx/conf.d/default.conf /data/nginx/conf.d/default.conf
接下来运行一个全新的Nginx容器并进行目录、端口的映射(目录映射必须和刚拷贝的地址一一对应)
docker run -it -d --name nginx --restart=on-failure:5 -p 8888:80 -v /data/nginx/html:/usr/share/nginx/html -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /data/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf -v /data/nginx/log:/var/log/nginx --privileged nginx
至此安装完成,我们就可以直接在宿主机内对Nginx进行配置了,也可以查看日志等信息了
我们先看看本地文件:
我们可以看到一行配置:
include /etc/nginx/conf.d/*.conf;
可以知道,这里包含了conf.d文件夹下的文件
我们先拷贝一份default.conf 为default.conf.cp,这是初始化文件。然后我们修改default.conf如下:
upstream nacosserver {
server 192.168.1.160:8848;
server 192.168.1.161:8848;
server 192.168.1.162:8848;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
#root /usr/share/nginx/html;
#index index.html index.htm;
proxy_pass http://nacosserver;
}
#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 /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
注意:nacosserver 这个命名不能有下划线
温馨提示:对nginx不熟悉的,感觉去学了。
完成上述配置,直接重启nginx容器。
访问:http://192.168.1.160:8888/nacos/#/login
到此,我们的基于docker搭建nginx+nacos搭建的集群,已经完成了。
参考:https://blog.csdn.net/weixin_48255807/article/details/111755510
docker run -d \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8848 \
-e NACOS_SERVERS=192.168.229.128:38848,192.168.229.128:38849,192.168.229.128.130:38850 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.229.128 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.229.128 \
-e JVM_XMS=215m -e JVM_XMX=215m -e JVM_XMN=215m \
-p 38848:8848 \
--name nacos48 \
--restart=always \
nacos/nacos-server:1.3.2
docker run -d \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8848 \
-e NACOS_SERVERS=192.168.229.128:38848,192.168.229.128:38849,192.168.229.128.130:38850 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.229.128 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.229.128 \
-e JVM_XMS=215m -e JVM_XMX=215m -e JVM_XMN=215m \
-p 38849:8848 \
--name nacos49 \
--restart=always \
nacos/nacos-server:1.3.2
docker run -d \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8848 \
-e NACOS_SERVERS=192.168.229.128:38848,192.168.229.128:38849,192.168.229.128.130:38850 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.229.128 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.229.128 \
-e JVM_XMS=215m -e JVM_XMX=215m -e JVM_XMN=215m \
-p 38850:8848 \
--name nacos50 \
--restart=always \
nacos/nacos-server:1.3.2
MODE=cluster 集群模式
NACOS_APPLICATION_PORT=8848 容器nacos端口
NACOS_SERVERS=ip:38848,ip:38849,ip:38850 集群每个nacos-server服务
SPRING_DATASOURCE_PLATFORM=mysql 独立支持mysql
NACOS_SERVER_IP=ip 可选值hostname/ip 默认ip
MYSQL_* 相关
MYSQL_SERVICE_DB_NAME=nacos_config 数据库初始化脚本数据库名称
数据库初始化脚本:https://github.com/alibaba/nacos/blob/develop/distribution/conf/nacos-mysql.sql
JVM_XMS=215m -e JVM_XMX=215m -e JVM_XMN=215m
-p 38850:8848 38850宿主机端口:8848 nacos访问端口
–restart=always 重启docker服务会启动该容器
nacos/nacos-server:1.3.2 nacos镜像版本
若遇到页面无法响应的情况,要学会看naocs的日志,根据日志就能解决一切问题了。
Docker容器做端口映射报错
docker: Error response from daemon: driver failed programming external connectivity on endpoint lamp3 (46b7917c940f7358948e55ec2df69a4dec2c6c7071b002bd374e8dbf0d40022c): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 86 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.
解决方法
docker服务启动时定义的自定义链DOCKER被清除
重启即可systemctl restart docker
查看一下路径:http://192.168.1.160:8888/nacos/#/login
必须加上/nacos/#/login
2021-09-02 16:22:43,754 INFO The host [nacos_server] is not valid
Note: further occurrences of request parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: The character [_] is never valid in a domain name.
at org.apache.tomcat.util.http.parser.HttpParser D o m a i n P a r s e S t a t e . n e x t ( H t t p P a r s e r . j a v a : 926 ) a t o r g . a p a c h e . t o m c a t . u t i l . h t t p . p a r s e r . H t t p P a r s e r . r e a d H o s t D o m a i n N a m e ( H t t p P a r s e r . j a v a : 822 ) a t o r g . a p a c h e . t o m c a t . u t i l . h t t p . p a r s e r . H o s t . p a r s e ( H o s t . j a v a : 71 ) a t o r g . a p a c h e . t o m c a t . u t i l . h t t p . p a r s e r . H o s t . p a r s e ( H o s t . j a v a : 45 ) a t o r g . a p a c h e . c o y o t e . A b s t r a c t P r o c e s s o r . p a r s e H o s t ( A b s t r a c t P r o c e s s o r . j a v a : 288 ) a t o r g . a p a c h e . c o y o t e . h t t p 11. H t t p 11 P r o c e s s o r . p r e p a r e R e q u e s t ( H t t p 11 P r o c e s s o r . j a v a : 809 ) a t o r g . a p a c h e . c o y o t e . h t t p 11. H t t p 11 P r o c e s s o r . s e r v i c e ( H t t p 11 P r o c e s s o r . j a v a : 384 ) a t o r g . a p a c h e . c o y o t e . A b s t r a c t P r o c e s s o r L i g h t . p r o c e s s ( A b s t r a c t P r o c e s s o r L i g h t . j a v a : 66 ) a t o r g . a p a c h e . c o y o t e . A b s t r a c t P r o t o c o l DomainParseState.next(HttpParser.java:926) at org.apache.tomcat.util.http.parser.HttpParser.readHostDomainName(HttpParser.java:822) at org.apache.tomcat.util.http.parser.Host.parse(Host.java:71) at org.apache.tomcat.util.http.parser.Host.parse(Host.java:45) at org.apache.coyote.AbstractProcessor.parseHost(AbstractProcessor.java:288) at org.apache.coyote.http11.Http11Processor.prepareRequest(Http11Processor.java:809) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol DomainParseState.next(HttpParser.java:926)atorg.apache.tomcat.util.http.parser.HttpParser.readHostDomainName(HttpParser.java:822)atorg.apache.tomcat.util.http.parser.Host.parse(Host.java:71)atorg.apache.tomcat.util.http.parser.Host.parse(Host.java:45)atorg.apache.coyote.AbstractProcessor.parseHost(AbstractProcessor.java:288)atorg.apache.coyote.http11.Http11Processor.prepareRequest(Http11Processor.java:809)atorg.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384)atorg.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)atorg.apache.coyote.AbstractProtocolConnectionHandler.process(AbstractProtocol.java:791)
at org.apache.tomcat.util.net.NioEndpoint S o c k e t P r o c e s s o r . d o R u n ( N i o E n d p o i n t . j a v a : 1417 ) a t o r g . a p a c h e . t o m c a t . u t i l . n e t . S o c k e t P r o c e s s o r B a s e . r u n ( S o c k e t P r o c e s s o r B a s e . j a v a : 49 ) a t j a v a . u t i l . c o n c u r r e n t . T h r e a d P o o l E x e c u t o r . r u n W o r k e r ( T h r e a d P o o l E x e c u t o r . j a v a : 1149 ) a t j a v a . u t i l . c o n c u r r e n t . T h r e a d P o o l E x e c u t o r SocketProcessor.doRun(NioEndpoint.java:1417) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor SocketProcessor.doRun(NioEndpoint.java:1417)atorg.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)atjava.util.concurrent.ThreadPoolExecutorWorker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
2021-09-02 16:27:36,397 INFO [capacityManagement] start correct usage
可以看到,我们的三个容器都报出这个错误,如果遇到这个错误,是因为我们配置nginx的时候定义如下配置信息时,nacos_server 命名含有下划线,把下划线去掉就好了。
upstream nacos_server {
server 192.168.1.160:8848;
server 192.168.1.161:8848;
server 192.168.1.162:8848;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
#root /usr/share/nginx/html;
#index index.html index.htm;
proxy_pass http://nacos_server;
}
三个容器都报错,从另一个角度来说,我们的集群已经搭建成功了,nginx,默认是集群访问。
排查问题: