当前位置: 首页 > news >正文

Docker-compose 单节点管理、consul 注册中心、registrator、template

consul是一个基于分布式的服务发现和配置管理工具。它具有快速构建分布式架构,提供服务发现和服务注册功能。consul职能:1、自动发现、注册;2、自动配置;3、自动更新

服务发现:自动检查网络中的服务(如数据库、应用)位置(ip和端口)的机制。用于分布式系统连接和交互

服务注册:允许服务在一个注册中心上公开其存在和可用性,以便于其他服务可以发现病预期交互

template:动态发现和更新应用配置,自动配置删除添加文件内容,修改注册中心里的ip+大端口号

docker-compose (单一节点管理) 容器单节点管理器

docker swarm(跨节点管理) 跨主机互相通信。bug多,不用了

一、Docker-compose(单节点管理)******

Docker-Compose项目是Docker官方的开源项目,容器单节点管理器,负责实现对Docker容器集群的快速编排。

docker-compose (单一节点管理) 容器单节点管理器

Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service),容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如 Consul。

三个管理:工程: project LNMP

                  服务:service nginx、mysql、php

                  容器:container 容器 --name 主机名;镜像 images;标签 tag;端口 -p;网络 --network;数据卷 -v 

Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API, 就可以在其上利用Compose来进行编排管理。


二、docker-compose 部署

1. Docker Compose 环境安装

Docker Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 Docker Compose

#下载
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

[root@localhost ~]# cd /usr/local/bin/
把docker-compose包拖进去


#安装
chmod +x /usr/local/bin/docker-compose


#查看版本
docker-compose --version

新的版本下载地址
sudo curl -L "https://github.com/docker/compose/releases/download/2.26.0/docker-compose-linux-aarch64" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

2. YAML 文件格式及编写注意事项   * * * *

YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于 XML数据描述语言,语法比 XML 简单的很多。YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 [] 括起来, hash 用花括号 {} 括起来。

使用 YAML 时需要注意下面事项:

●大小写敏感
●通过缩进表示层级关系
●不支持制表符 tab 键缩进,只能使用空格缩进
●缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2个空格
●用 # 号注释
●符号字符后缩进1个空格,如冒号 :  、逗号 ,  、横杠 -    
●如果包含特殊字符用单引号('')引起来会作为普通字符串处理,双引号(""): 特殊字符作为本身想表示的意思
name: "Hi,\nTom"


数据结构:
●对象映射: 键值对的字典
animal: pets

●序列数组: 一组按次序排列的列表
- Cat
- Dog
- Goldfish

["Cat", "Dog", "Goldfish"]

●布尔值
debug: true
debug: false


示例:
# yaml 格式
languages:       #序列的映射
  - Java
  - Golang
  - Python
websites:        #映射的映射
  cpu: 2
  memory: 1024M
  swap: 2048M
  disk: 60G 


键:{值}

# Json 格式
{
  languages: [
    'Java',
    'Golang',
    'Python'    
  ],
  resources: {
    cpu: '2',
    memory: '1024M',
    swap: '2048M',
    disk: '60G'
  }
}

Baidu:
  www.baidu.com
wangyi: www.163.com
tengxun: www.qq.com

键 值

school: bei da
  kgc:          (两个空格)
    yunjisuan:
      - dingding
      - benet
      - wanglei
      - zhoubo
      - dalao
    dashuju:
      - lijia
      - chenming
    
    

3. Docker Compose配置常用字段

字段                                       描述
build                                      指定 Dockerfile 文件名,要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定
dockerfile                                 构建镜像上下文路径
context                                    可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址
image                                      指定镜像
command:                                  执行命令,覆盖容器启动后默认执行的命令
container_name                             指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale指定容器数量
deploy                                     指定部署和运行服务相关配置,只能在 Swarm 模式使用
environment                                添加环境变量
networks                                   加入网络,引用顶级networks下条目
network_mode                            设置容器的网络模式,如 host,bridge,...
ports                                      暴露容器端口,与 -p 相同,但端口不能低于 60
volumes                                    挂载一个宿主机目录或命令卷到容器,命名卷要在顶级 volumes 定义卷名称
volumes_from                            从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,仅版本 '2' 支持
hostname                                   容器主机名
sysctls                                    在容器内设置内核参数
links                                    连接到另外一个容器,- 服务名称[:服务别名]
privileged                                用来给容器root权限,注意是不安全的,true | false
restart                                    设置重启策略,no,always,nounless-st-failure,oped
                                        no,默认策略,在容器退出时不重启容器。
                                        on-failure,在容器非正常退出时(退出状态非0),才会重启容器。
                                        on-failure:3,在容器非正常退出时重启容器,最多重启3次。
                                        always,在容器退出时总是重启容器。
                                        unless-stopped,在容器退出的容器时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了。
depends_on                                                                                                在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,可能会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。
php:
  depends_on:
    - apache
    - mysql

4. Docker Compose 常用命令

字段     描述
build重新构建服务
ps  列出容器
up创建和启动容器 
exec  在容器里面执行命令
scale  指定一个服务容器启动数量
top  显示容器进程
logs  查看容器输出
down删除容器、网络、数据卷和镜像
stop/start/restart  停止/启动/重启服务

                        

5. Docker Compose 文件结构

yum install -y tree
tree /opt/compose_nginx
/opt/compose_nginx/
├── docker-compose.yml                #创建模板脚本
├── nginx
│?? ├── Dockerfile                    #创建容器脚本
│?? ├── nginx-1.12.0.tar.gz            #复制源码包
│?? └── run.sh                        #启动服务脚本
└── wwwroot
    └── index.html                    #站点网页

6、nginx + tomcat docker-compose编排

①、在 /opt/compose_nginx 下创建 nginx 

(1)准备依赖文件

mkdir -p /opt/compose_nginx/nginx /opt/compose_nginx/wwwroot
cd /opt/compose_nginx/nginx
cp nginx-1.12.0.tar.gz ./

vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx

vim Dockerfile
#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER this is nginx image yss

ADD CentOS-Base.repo /etc/yum.repos.d/
#添加环境包
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
#上传nginx软件压缩包,并解压
ADD nginx-1.12.0.tar.gz /usr/local/src/
#指定工作目录
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
#指定http和https端口
EXPOSE 80
EXPOSE 443
//方法一:
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf            #关闭 nginx 在后台运行
#添加宿主机中run.sh到容器中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
//方法二:
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]


echo "<h1>this is test web</h1>" > /opt/compose_nginx/wwwroot/index.html


(2)编写配置文件docker-compose.yml

vim /opt/compose_nginx/docker-compose.yml
version: '3'
services:
  nginx:
    container_name: web1
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 1216:80
      - 1217:443
    networks:
      lnmp:
        ipv4_address: 172.18.0.10
    volumes:
      - ./wwwroot:/usr/local/nginx/html
networks:
  lnmp:
   driver: bridge
   ipam:
     config:
       - subnet: 172.18.0.0/16


cd /opt/compose_nginx/
docker-compose -f docker-compose.yml up -d           #启动yum文件
----------------------------------------------------------------------------------------------------------
-f, --file FILE :使用特定的 compose 模板文件,默认为 docker-compose.yml
-p, --project-name NAME :指定项目名称,默认使用目录名称
-d :在后台运行
----------------------------------------------------------------------------------------------------------

docker ps -a
CONTAINER ID   IMAGE                 COMMAND     CREATED              STATUS              PORTS                                         NAMES
b48dceee248f   compose_nginx_nginx   "/run.sh"   About a minute ago   Up About a minute   0.0.0.0:1216->80/tcp, 0.0.0.0:1217->443/tcp   compose_nginx_nginx_1

cd /opt/compose_nginx/
docker-compose ps                    #必须在docker-compose.yml所在目录执行此命令

浏览器访问:http://192.168.190.10:80

②、在 compose_nginx 在创建 tomcat

cd /opt/compose_nginx/
[root@localhost compose_nginx]# mkdir tomcat
[root@localhost compose_nginx]# ls
   docker-compose.yml  nginx  tomcat  wwwroot
[root@localhost compose_nginx]# cd tomcat    #把apache-tomcat-8.5.16.tar.gz、jdk-8u91-linux-x64.tar.gz包拖进去

[root@localhost tomcat]# vim Dockerfile 

[root@localhost tomcat]# cd /opt/compose_nginx

[root@localhost compose_nginx]# vim docker-compose.yml 

version: '3'
services:
  nginx:
    container_name: web1
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 80:80
      - 443:443
    networks:
      lnmp:
        ipv4_address: 172.18.0.10
    volumes:
      - ./wwwroot:/usr/local/nginx/html
  tomcat:
    hostname: tomcat
    build:
      context: ./tomcat
      dockerfile: Dockerfile
    ports:
      - 8080:8080
    networks:
      lnmp
networks:
  lnmp:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16

[root@localhost compose_nginx]# docker-compose -f docker-compose.yml up -d

[root@localhost compose_nginx]# docker ps -a
CONTAINER ID   IMAGE                  COMMAND                   CREATED             STATUS         PORTS                                                                     NAMES
c1c6ad98575d   compose_nginx_tomcat   "/usr/local/tomcat/b…"   About a minut ago   Up 6 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp                                 compose_nginx_tomcat_1
0b29b256da55   compose_nginx_nginx    "/usr/local/nginx/sb…"   22 hours ago        Up 22 hours    0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/t

 


7、Docker consul的容器服务更新与发现

Consul注册中心 ******

(1)什么是服务注册与发现
服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构,起初的解决手段是在服务前端负载均衡,这样前端必须要知道所有后端服务的网络位置,并配置在配置文件中。这里就会有几个问题:
●如果需要调用后端服务A-N,就需要配置N个服务的网络位置,配置很麻烦
●后端服务的网络位置变化,都需要改变每个调用者的配置

既然有这些问题,那么服务注册与发现就是解决这些问题的。后端服务A-N可以把当前自己的网络位置注册到服务发现模块,服务发现就以K-V的方式记录下来,K一般是服务名,V就是IP:PORT。服务发现模块定时的进行健康检查,轮询查看这些后端服务能不能访问的了。前端在调用后端服务A-N的时候,就跑去服务发现模块问下它们的网络位置,然后再调用它们的服务。这样的方式就可以解决上面的问题了,前端完全不需要记录这些后端服务的网络位置,前端和后端完全解耦!

consul(所有服务都能注册)、nacos(转给微服务提供)、eyreka

(2)什么是consul  
consul是google开源的一个使用go语言开发的服务管理软件。

支持多数据中心、分布式高可用的、服务发现和配置共享。采用Raft算法,用来保证服务的高可用。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行agent,他有两种运行模式server 和 client。 每个数据中心官方建议需要3个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行。

在client模式下,所有注册到当前节点的服务会被转发到server节点,本身是不持久化这些信息。
在server模式下,功能和client模式相似,唯一不同的是,它会把所有的信息持久化到本地,这样遇到故障,信息是可以被保留的。
server-leader是所有server节点的老大,它和其它server节点不同的是,它需要负责同步注册的信息给其它的server节点,同时也要负责各个节点的健康监测。

consul提供的一些关键特性:
服务注册与发现:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
健康检查:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
Key/Value存储:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
多数据中心:无需复杂的配置,即可支持任意数量的区域。

安装consul是用于服务注册,也就是容器本身的一些信息注册到consul里面,其他程序可以通过consul获取注册的相关服务信息,这就是服务注册与发现。

consul 部署

consul服务器            192.168.190.70        运行consul服务、nginx服务、consul-template守护进程
registrator服务器        192.168.190.80        运行registrator容器、运行nginx容器

systemctl stop firewalld.service
setenforce 0

------------------ consul服务器 (1192.168.190.70)--------------------

1. 建立 Consul 服务
mkdir /opt/consul
cp consul_1.9.2_linux_amd64.zip /opt/consul
cd /opt/consul
unzip consul_1.9.2_linux_amd64.zip
mv consul /usr/local/bin/

//设置代理,在后台启动 consul 服务端
 consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.190.70 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &     

#如果是集群的话 -node=consul-server02 03...    ,-bind=192.168.10.23 \     ip也要换
----------------------------------------------------------------------------------------------------------
-server: 以server身份启动。默认是client。
-bootstrap :用来控制一个server是否在bootstrap模式,在一个数据中心中只能有一个server处于bootstrap模式,当一个server处于 bootstrap模式时,可以自己选举为 server-leader。
-bootstrap-expect=2 :集群要求的最少server数量,当低于这个数量,集群即失效。
-ui :指定开启 UI 界面,这样可以通过 http://localhost:8500/ui 这样的地址访问 consul 自带的 web UI 界面。
-data-dir :指定数据存储目录。
-bind :指定用来在集群内部的通讯地址,集群内的所有节点到此地址都必须是可达的,默认是0.0.0.0。(0.0.0.0所有客户端都能访问客户端
-client :指定 consul 绑定在哪个 client 地址上,这个地址提供 HTTP、DNS、RPC 等服务,默认是 127.0.0.1。
-node :节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名。
-datacenter :指定数据中心名称,默认是dc1。
----------------------------------------------------------------------------------------------------------

netstat -natp | grep consul

启动consul后默认会监听5个端口:
8300:服务端 replication(副本:同步)、leader(老大) farwarding(转发)的端口
8301:lan(内网) cossip的端口       同一个数据中心consul中,客户端通过该端口通信
8302:wan(外网) gossip的端口,不同数据中心间通信
8500:web ui界面的端口
8600:使用dns协议查看节点信息的端口

2. 查看集群信息

#查看members状态
consul members

#查看集群状态
consul operator raft list-peers

consul info | grep leader
    leader = true
    leader_addr = 192.168.190.70:8300

3. 通过 http api 获取集群信息

curl 127.0.0.1:8500/v1/status/peers             #查看集群server成员
curl 127.0.0.1:8500/v1/status/leader            #集群 server-leader
curl 127.0.0.1:8500/v1/catalog/services            #注册的所有服务
curl 127.0.0.1:8500/v1/catalog/nginx            #查看 nginx 服务信息
curl 127.0.0.1:8500/v1/catalog/nodes            #集群节点详细信息


-------------------------- registrator服务器(192.168.190.80) ---------------------------

//容器服务自动加入 Nginx 集群
1. 安装 Gliderlabs/Registrator 

Gliderlabs/Registrator 可检查容器运行状态自动注册,还可注销 docker 容器的服务到服务配置中心。目前支持 Consul、Etcd 和 SkyDNS2。

docker pull gliderlabs/registrator

docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=192.168.190.80 \                   #本机ip
consul://192.168.190.70:8500        #consul(服务端)ip+端口号

----------------------------------------------------------------------------------------------------------
--net=host :把运行的docker容器设定为host网络模式。
-v /var/run/docker.sock:/tmp/docker.sock :把宿主机的Docker守护进程(Docker daemon)默认监听的Unix域套接字挂载到容器中。
--restart=always :设置在容器退出时总是重启容器。
--ip :刚才把network指定了host模式,所以我们指定ip为本机的ip。
consul :指定consul服务端的IP和端口。
----------------------------------------------------------------------------------------------------------


2. 测试服务发现功能是否正常

docker run -itd -p 83:80 --name test01 -h test01 nginx
docker run -itd -p 84:80 --name test02 -h test02 nginx
docker run -itd -p 88:80 --name test03 -h test03 httpd
docker run -itd -p 89:80 --name test04 -h test04 httpd               #-h:设置容器主机名

                                      #主机外的名称      #容器名   #镜像名

docker ps -a


3. 验证 http 和 nginx 服务是否注册到 consul

浏览器中,输入 http://192.168.190.70:8500,在 Web 页面中“单击 SERVICES”,会出现 5 个服务。在 Web 页面中“单击 NODES”然后单击“consurl-server01”,

 

//在consul服务器使用curl测试连接服务器

curl 127.0.0.1:8500/v1/catalog/services {"consul":[],"httpd":[],"nginx":[]}

------------------------------------ consul-template(192.168.190.70) ------------------------------------

template:动态发现和更新应用配置,自动配置删除添加文件内容,修改注册中心中的ip+大端口号

Consul-Template基于Consul的自动替换配置文件的应用。Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行 shell 命令执行更新操作,重新加载 Nginx。

Consul-Template可以查询Consul中的服务目录、Key、Key-values 等。这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers 、 Haproxy Backends等。

1. 准备 template nginx 模板文件
在consul服务器上操作

vim /opt/consul/nginx.ctmpl
#定义nginx upstream一个简单模板
upstream http_backend {
  {{range service "nginx"}}
   server {{.Address}}:{{.Port}};
   {{end}}
}

#定义一个server,监听8000端口,反向代理到upstream
server {
    listen 8000;
    server_name localhost 192.168.190.70;
    access_log /var/log/nginx/kgc.com-access.log;                            #修改日志路径
    index index.html index.php;            #前端页面
    location / {                                       #转发到后端
        proxy_set_header HOST $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Client-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://http_backend;
    }
}

 

2. 编译安装nginx

yum -y install pcre-devel zlib-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
tar zxvf nginx-1.12.0.tar.gz -C /opt/


cd /opt/nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make -j && make install

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

3. 配置 nginx

vim /usr/local/nginx/conf/nginx.conf
......
http {
     include       mime.types;
     include  vhost/*.conf;                       #添加虚拟主机目录
     default_type  application/octet-stream;
......

//创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost 

//创建日志文件目录
mkdir /var/log/nginx
  
//启动nginx

cd /usr/local/nginx/sbin

./nginx

 

4. 配置并启动 template

unzip consul-template_0.19.3_linux_amd64.zip -d /opt/
cd /opt/
mv consul-template /usr/local/bin/

//在前台启动 template 服务,启动后不要按 ctrl+c 中止 consul-template 进程。

consul-template --consul-addr 192.168.190.70:8500 \
--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info

//另外打开一个终端查看生成配置文件

cat /usr/local/nginx/conf/vhost/kgc.conf
upstream http_backend {
   server 192.168.190.80:83;

   server 192.168.190.80:84;

}

server {
  listen 8000;
  server_name 192.168.190.70;
  access_log /var/log/nginx/kgc.cn-access.log;
  index index.html index.php;
  location / {
    proxy_set_header HOST $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Client-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://http_backend;
  }
}


5. 在registrator机器,访问 template-nginx

[root@registrator opt]# docker ps -a
CONTAINER ID   IMAGE                           COMMAND                   CREATED             STATUS             PORTS                               NAMES
99bf632055c3   httpd                           "httpd-foreground"        About an hour ago   Up About an hour   0.0.0.0:89->80/tcp, :::89->80/tcp   test04
4090d96cfe11   httpd                           "httpd-foreground"        About an hour ago   Up About an hour   0.0.0.0:88->80/tcp, :::88->80/tcp   test03
4c4c1313bee3   nginx                           "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:84->80/tcp, :::84->80/tcp   test02
1d2284cc81a1   nginx                           "/docker-entrypoint.…"   2 hours ago         Up 2 hours         0.0.0.0:83->80/tcp, :::83->80/tcp   test01
5796842feb27   gliderlabs/registrator:latest   "/bin/registrator --…"   2 hours ago         Up 2 hours                                             registrator

[root@registrator opt]# docker exec -it test01 bash
root@test01:/# echo "this is test01" > /usr/share/nginx/html/index.html 
root@test01:/# exit
exit
[root@registrator opt]# docker exec -it test02 bash
root@test02:/# echo "this is test02" > /usr/share/nginx/html/index.html 
root@test02:/# exit
exit

浏览器访问:http://192.168.190.70:8000/,并不断刷新。


6. 增加一个 nginx 容器节点
(1)增加一个 nginx 容器节点,测试服务发现及配置更新功能。
docker run -itd -p:85:80 --name test-05 -h test05 nginx

//观察 template 服务,会从模板更新/usr/local/nginx/conf/vhost/kgc.conf 文件内容,并且重载 nginx 服务。

(2)查看/usr/local/nginx/conf/vhost/kgc.conf 文件内容
cat /usr/local/nginx/conf/vhost/kgc.conf
upstream http_backend {

server 192.168.10.23:83;:去!

server 192.168.10.23:84;

server 192.168.10.23:85;

server 192.168.10.23:86;

}

(3)查看三台 nginx 容器日志,请求正常轮询到各个容器节点上
docker logs -f test-01
docker logs -f test-02
docker logs -f test-05
docker logs -f test-06


---------------------------consul 多节点------------------------------
//添加一台已有docker环境的服务器192.168.10.14/24加入已有的群集中
consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.10.14 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true  \
-datacenter=dc1  \
-join 192.168.10.23 &> /var/log/consul.log &

------------------------------------------------------------------------
-enable-script-checks=true :设置检查服务为可用
-datacenter : 数据中心名称
-join :加入到已有的集群中
------------------------------------------------------------------------

consul members
Node             Address             Status  Type    Build  Protocol  DC
consul-server01  192.168.10.23:8301  alive   server  0.9.2  2         dc1
consul-server02  192.168.10.14:8301  alive   server  0.9.2  2         dc1


consul operator raft list-peers
Node             ID                  Address             State     Voter  RaftProtocol
Node             ID                  Address             State     Voter  RaftProtocol
consul-server01  192.168.10.23:8300  192.168.10.23:8300  leader    true   2
consul-server02  192.168.10.14:8300  192.168.10.13:8300  follower  true   2

相关文章:

Docker-compose 单节点管理、consul 注册中心、registrator、template

consul是一个基于分布式的服务发现和配置管理工具。它具有快速构建分布式架构&#xff0c;提供服务发现和服务注册功能。consul职能&#xff1a;1、自动发现、注册&#xff1b;2、自动配置&#xff1b;3、自动更新 服务发现&#xff1a;自动检查网络中的服务&#xff08;如数据…...

制药企业MES与TMS的数据库改造如何兼顾安全与效率双提升

*本图由AI生成 在全球制造业加速数字化转型的浪潮中&#xff0c;一家来自中国的、年营业额超过200亿元的制药企业以其前瞻性的视角和果断的行动&#xff0c;成为该行业里进行国产化改造的先锋。通过实施数据库改造试点项目&#xff0c;该企业实现了其关键业务系统MES&#xff0…...

Spring Boot比Spring多哪些注解

Spring Boot 是 Spring 框架的扩展&#xff0c;它旨在简化 Spring 应用程序的初始搭建以及开发过程。与 Spring 相比&#xff0c;Spring Boot 提供了许多额外的注解来进一步简化配置和开发工作。以下是 Spring Boot 特有的一些核心注解&#xff0c;这些注解在 Spring 中不可用&…...

985研一学习日记 - 2024.10.17

一个人内耗&#xff0c;说明他活在过去&#xff1b;一个人焦虑&#xff0c;说明他活在未来。只有当一个人平静时&#xff0c;他才活在现在。 日常 1、起床6:00√ 2、健身1个多小时 今天练了二头和背部&#xff0c;明天练胸和三头 3、LeetCode刷了3题 旋转图像&#xff1a…...

牛客SQL29详解 计算用户的平均次日留存率

牛客SQL29详解 计算用户的平均次日留存率 牛客SQL29详解 计算用户的平均次日留存率 叮嘟&#xff01;这里是小啊呜的学习课程资料整理。好记性不如烂笔头&#xff0c;今天也是努力进步的一天。一起加油进阶吧&#xff01; 牛客SQL29详解 计算用户的平均次日留存率 题目&#x…...

Redis --- 第四讲 --- 常用数据结构 --- 其他类型stream、bitmap……。补充内容scan命令。

通过前面的学习&#xff0c;我们已经学习了Redis最关键的五个数据结构&#xff1a;String、List、Hash、Set、ZSet。这五个数据结构应用广泛&#xff0c;频繁使用。 redis中包含的所有类型&#xff0c;下面将要介绍不常用的类型。 一、streams类型介绍 事件、epoll/IO多路复…...

Java多线程--实现跑马小游戏

线程的实现方式 继承Thread类&#xff1a;void run()方法没有返回值&#xff0c;无法抛异常实现Runnable接口&#xff1a;void run()方法没有返回值&#xff0c;无法抛异常实现Callable接口&#xff1a;V call() throws Exception 返回结果&#xff0c;能够抛异常 实现Callab…...

扫雷(C 语言)

目录 一、游戏设计分析二、各个步骤的代码实现1. 游戏菜单界面的实现2. 游戏初始化3. 开始扫雷 三、完整代码四、总结 一、游戏设计分析 本次设计的扫雷游戏是展示一个 9 * 9 的棋盘&#xff0c;然后输入坐标进行判断&#xff0c;若是雷&#xff0c;则游戏结束&#xff0c;否则…...

有源滤波器(一)

滤波器设计工具 | 滤波器设计向导 | Analog Devices 一种带通滤波器&#xff1a; 有源滤波器完美规避了这个带不带负载滤波参数变化的问题&#xff0c;但是有源滤波器只能处理小电流和小电压&#xff1a; 鼠标所指的电路图是一阶同相滤波器&#xff0c;右上角的是他的幅频特性…...

Flume面试整理-常见的Channel类型

Apache Flume提供了多种Channel(通道)类型,作为Source(源)和Sink(汇)之间的缓冲区,确保数据的可靠传输。不同类型的Channel提供了不同的性能和可靠性,适用于不同的应用场景。以下是Flume中常见的Channel类型及其特点: 1. Memory Channel ● 描述:Memory Channel将数…...

【前端】如何制作一个自己的网页(6)

接上文 网络中的图片 我们也可以在百度等网站搜索自己喜欢的图片。 此时对图片点击右键&#xff0c;选择【复制图片地址】&#xff0c;即可获得该图片的网络地址。 其实在HTML中&#xff0c;除了图片以外&#xff0c;我们还可以利用地址找到另一个网页。 如右图所示&#…...

Linux系统性能调优技巧

Linux系统性能调优是一个复杂而持续的过程&#xff0c;需要综合考虑硬件、软件、内核参数、进程管理等多个方面。以下是一些具体的调优技巧&#xff1a; 一、硬件优化 增加物理内存&#xff1a;内存不足时&#xff0c;系统会频繁进行交换&#xff08;swapping&#xff09;活动…...

数学建模算法与应用 第5章 插值与拟合方法

目录 5.1 插值方法 Matlab代码示例&#xff1a;线性插值 Matlab代码示例&#xff1a;样条插值 5.2 曲线拟合的线性最小二乘法 Matlab代码示例&#xff1a;线性拟合 5.3 最小二乘优化与多项式拟合 Matlab代码示例&#xff1a;多项式拟合 5.4 曲线拟合与函数逼近 Matlab代…...

3D Slicer 教程二 ---- 数据集

上一章下载3d slicer的软件,这章从加载数据集来弄清楚3dslicer怎么使用. 一. 加载数据集 如果没有数据集,也可用用样本数据. (1) "File" --> "add Data" 可以添加图片文件夹,(试了MP4不行,内镜的视频估计不支持),添加单个图片的话,会出现一些选项, …...

【建议收藏】30个Java异常的知识点,你能撑到第几个?

文章目录 问题1&#xff1a;Error 和 Exception 区别是什么&#xff1f;问题2&#xff1a;运行时异常和一般异常(受检异常)区别是什么&#xff1f;问题3&#xff1a;JVM 是如何处理异常的&#xff1f;问题4&#xff1a;throw 和 throws 的区别是什么&#xff1f;问题5&#xff…...

【Linux系统编程】环境基础开发工具使用

目录 1、Linux软件包管理器yum 1.1 什么是软件包 1.2 安装软件 1.3 查看软件包 1.4 卸载软件 2、Linux编辑器-vim 2.1 vim的概念 2.2 vim的基本操作 2.3 vim的配置 3、Linux编译器-gcc/g 3.1 gcc编译的过程​编辑​编辑​编辑 3.2 详解链接 动态链接 静态链接 4…...

滚雪球学Redis[6.2讲]:Redis脚本与Lua:深入掌握Redis中的高效编程技巧

全文目录&#xff1a; &#x1f4dd;前言&#x1f6a6;正文&#x1f31f;6.2.1 Lua脚本的优势&#x1f58b;️6.2.2 EVAL命令与Lua脚本编写&#x1f435;编写Lua脚本的基本步骤&#x1f436;示例&#xff1a;简单的GET和SET操作&#x1f431;示例&#xff1a;Lua实现自增和过期…...

上市不到一月,极氪7X交付破万台!论纯电,极氪真“遥遥领先”

承认吧&#xff0c;在纯电这条赛道上&#xff0c;极氪真就“遥遥领先”~ 推出的第一款原生纯电猎装极氪001&#xff0c;就常年霸榜25万级豪华纯电销冠 主打豪华大车的极氪009&#xff0c;成为40万以上高端“保姆车”的不二之选 第一次面向主流纯电市场推出的豪华大五座——极…...

【Linux】理解文件系统与软硬链接,观察inode号理解<“软链接是包含路径的新文件“,“硬链接是关于文件名的机制“>,最终明白<什么是真正删除一个文件>

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…...

Java高并发控制之按业务对象加同步锁

一、需求 最常见的一个场景&#xff0c;账户余额更新&#xff01; 业务场景稍复杂点&#xff0c;一个客户有多个虚拟余额账户&#xff0c;产生交易时&#xff0c;需要同时更新客户的多个余额账户&#xff0c;现在需要为余额更新做并发控制。 二、解决方案 1、依赖数据的乐观锁&…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...