10

20220714docker-Consul_没有鸡汤,只为生活的技术博客_51CTO博客

 2 years ago
source link: https://blog.51cto.com/u_4483409/5471100
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Consul提供的一些关键特性

•service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务

•health checking:健康检测使consul可以快速的警告在集群中的操作。和服务发现的集成,可以防止请求转发到故障的服务上面

•key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作

consul安装

* Consul 下载地址:https://www.consul.io/downloads.html

* Github地址:https://github.com/hashicorp/consul

* 码云地址:https://gitee.com/mirrors/consul

下载、解压就得到一个可执行文件consul(通过go编译为二进制文件)

将这个文件移动到全局变量环境中

$ sudo mv consul /usr/local/bin/

consul对外提供的端口,不同的端口有不同的作用,

20220714docker-Consul_docker

Consul-启动服务

consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=ali -bind=192.168.169.150 -ui -client=0.0.0.0

参数含义:

agent

  -server表示启动的是一个服务

  -bootstrap-expect 1 表示等待多少个节点再启动,这里1个,就是自己一个就

  -node=texun_1 就是给consul服务起个别名为ali_1

  -bind=172.17.114.76  绑定内网ip

  -data-dir /opt/data1  数据存储目录为/opt/data1

  -ui 启动默认ui界面

  -client  consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服

  务,默认是127.0.0.1,可指定允许客户端使用什么ip去访问

Consul-api常用命令

注册服务:

curl -X PUT -d '{"ID":"order_1","Name":"order","Tags":["xdp-\/core.order"],"Address":"192.168.232.201","Port":18307,"Check":{"name":"order_1.check","tcp":"192.168.232.201:18307","interval":"10s","timeout":"2s"}}' http://192.168.232.204:8550/v1/agent/service/register

查询服务:

curl http://192.168.232.204:8550/v1/health/service/order?dc=xdp_dc&passing=true

dc : 表示数据中心是xdp_dc (存储信息记录)

passing : 表示健康检测是通过的

查询所有服务:

curl http://192.168.232.204:8550/v1/agent/services?dc=xdp_dc

注销服务:

curl -X PUT http://192.168.232.204:8550/v1/agent/service/deregister/order_1?dc=xdp_dc

查询所有k/v:

curl http://192.168.232.204:8550/v1/kv/?recurse

添加key/value :

curl -X PUT -d 'test' http://192.168.232.204:8550/v1/kv/abc/key1
key: abc/key1
value:test

修改k/v:

curl -X PUT -d 'test666' http://192.168.232.204:8550/v1/kv/abc/key1

删除key:

curl -X DELETE http://192.168.232.204:8550/v1/kv/abc/key1

docker 安装consul

下载consul镜像docker pull consul:1.4.4

#创建自定义网段

[root@localhost docker]# docker network create --subnet=172.200.7.0/100 mynetwork
d8c3c71a6b4d4dcaf348830c97c5b489626a1a6f3627419d395d99e16852caad
创建容器#启动第1个Server节点,集群要求要有3个Server,将容器8500端口映射到主机8900端口,同时开启管理界面
docker run -d
-p 8510:8500 //配置端口映射
-v/docker/consul/data/server1:/consul/data //配置文件夹映射 没有则自动创建
-v/docker/consul/conf/server1:/consul/config //配置文件夹映射
-e CONSUL_BIND_INTERFACE='eth0' //配置使用网络
--network=mynetwork //配置网络
--ip 172.200.7.6 //自定义指定ip地址
--privileged=true --name=consul_server1 consul:1.4.4 //配置自启动 别名
agent -server -bootstrap-expect=3 //配置服务节点3个
-ui -node=consul1.4.4_server_public_2 //配置web页面
-client='0.0.0.0' //配置客户端响应
-data-dir /consul/data //配置consul存储地址
-config-dir /consul/config //配置文件存储地址
-datacenter=xdp_dc //数据中心名称

具体执行的命令 必须输入成一行

[root@localhost config]# docker run -d -p 8510:8500 -v/docker/consul/data/server1:/consul/data -v/docker/consul/conf/server1:/consul/config -e CONSUL_BIND_INTERFACE='eth0' --network=mynetwork --ip 172.200.7.6 --privileged=true --name=consul_server1 consul:1.4.4 agent -server -bootstrap-expect=3 -ui -node=consul1.4.4_server_public_2 -client='0.0.0.0' -data-dir /consul/data -config-dir /consul/config -datacenter=xdp_dc
1be16c0c0314449c5c6729d72480b606a19bfeeba7e952926d8c1104e4e60c4e
[root@localhost config]#
[root@localhost config]# docker run -d -p 8520:8500 -v /docker/consul/data/server2:/consul/data -v /docker/consul/conf/server2:/consul/config -e CONSUL_BIND_INTERFACE='eth0' --network=mynetwork --ip 172.200.7.7 --privileged=true --name=consul_server_2 consul:1.4.4 agent -server -ui -node=consul1.4.4_server_public_3 -client='0.0.0.0' -datacenter=xdp_dc -data-dir /consul/data -config-dir /consul/config -join=172.200.7.6
0773aee815d29e4f03d41a2f4fb52291d97fe957bff5480ed68bc48e6cfa8071
[root@localhost config]#
[root@localhost config]# docker run -d -p 8530:8500 -v /docker/consul/data/server3:/consul/data -v /docker/consul/conf/server3:/consul/config -e CONSUL_BIND_INTERFACE='eth0' --network=mynetwork --ip 172.200.7.8 --privileged=true --name=consul_server_3 consul:1.4.4 agent -server -ui -node=consul1.4.4_server_public_4 -client='0.0.0.0' -datacenter=xdp_dc -data-dir /consul/data -config-dir /consul/config -join=172.200.7.6
6bbf455ed8c7a335031615109635dc2b6cb28003fe4c94e2ffb1e5764a64ac80

查询是否已经配置固定ip地址
[root@localhost config]# docker inspect consul_server1 | grep "IPAddress"
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.200.7.6",

5台server节点  2台client节点

docker run -d -p 8510:8500 -v /docker/consul/data/server1:/consul/data -v /docker/consul/conf/server1:/consul/config -e CONSUL_BIND_INTERFACE='eth0' --network=mynetwork --ip 172.200.7.6 --privileged=true --name=consul_server1 consul:1.4.4 agent -server -bootstrap-expect=3 -ui -node=consul1.4.4_server_1 -client='0.0.0.0' -data-dir /consul/data -config-dir /consul/config -datacenter=consul_data
docker run -d -p 8520:8500 -v /docker/consul/data/server2:/consul/data -v /docker/consul/conf/server2:/consul/config -e CONSUL_BIND_INTERFACE='eth0' --network=mynetwork --ip 172.200.7.7 --privileged=true --name=consul_server2 consul:1.4.4 agent -server -ui -node=consul1.4.4_server_2 -client='0.0.0.0' -datacenter=consul_data -data-dir /consul/data -config-dir /consul/config -join=172.200.7.6
docker run -d -p 8530:8500 -v /docker/consul/data/server3:/consul/data -v /docker/consul/conf/server3:/consul/config -e CONSUL_BIND_INTERFACE='eth0' --network=mynetwork --ip 172.200.7.8 --privileged=true --name=consul_server3 consul:1.4.4 agent -server -ui -node=consul1.4.4_server_3 -client='0.0.0.0' -datacenter=consul_data -data-dir /consul/data -config-dir /consul/config -join=172.200.7.6
docker run -d -p 8540:8500 -v /docker/consul/data/server4:/consul/data -v /docker/consul/conf/server4:/consul/config -e CONSUL_BIND_INTERFACE='eth0' --network=mynetwork --ip 172.200.7.9 --privileged=true --name=consul_server4 consul:1.4.4 agent -server -ui -node=consul1.4.4_server_4 -client='0.0.0.0' -datacenter=consul_data -data-dir /consul/data -config-dir /consul/config -join=172.200.7.6
docker run -d -p 8550:8500 -v /docker/consul/data/server5:/consul/data -v /docker/consul/conf/server5:/consul/config -e CONSUL_BIND_INTERFACE='eth0' --network=mynetwork --ip 172.200.7.10 --privileged=true --name=consul_server5 consul:1.4.4 agent -server -ui -node=consul1.4.4_server_5 -client='0.0.0.0' -datacenter=consul_data -data-dir /consul/data -config-dir /consul/config -join=172.200.7.6

docker run -d -p 8610:8500 -v /docker/consul/data/client1:/consul/data -v /docker/consul/conf/client1:/consul/config -e CONSUL_BIND_INTERFACE='eth0' --network=mynetwork --ip 172.200.7.100 --privileged=true --name=consul_client1 consul:1.4.4 agent -ui -node=consul1.4.4_client_1 -client='0.0.0.0' -datacenter=consul_data -data-dir /consul/data -config-dir /consul/config -join=172.200.7.6
docker run -d -p 8620:8500 -v /docker/consul/data/client2:/consul/data -v /docker/consul/conf/client2:/consul/config -e CONSUL_BIND_INTERFACE='eth0' --network=mynetwork --ip 172.200.7.101 --privileged=true --name=consul_client2 consul:1.4.4 agent -ui -node=consul1.4.4_client_2 -client='0.0.0.0' -datacenter=consul_data -data-dir /consul/data -config-dir /consul/config -join=172.200.7.6

如果出现以下效果 则按照成功

20220714docker-Consul_ico_02

安装consul模板

# 1. 解压缩$ unzip consul-template_0.26.0_linux_386.zip#将执行文件(解压缩之后的文件夹),复制到/usr/local/bin文件夹下
cp consul-template /usr/local/bin
# 2. 设置环境变量,输入命令:
vim /etc/profile
# 3. 将这里的代码添加到 profile 文件末尾(这里覆盖之前consul的配置)
# Consul
export CONSUL_TEMPLATE_HOME=/usr/local/bin/consul-template
export PATH=$PATH:$CONSUL_HOME:$CONSUL_TEMPLATE_HOME;
# 4. 执行命令使环境变量生效
source /etc/profile
# 5. 验证软件是否安装成功
consul-template -v

 Consul-template 实战配置文件生成

实战步骤:

1. Consul-template 定义模板文件: find_address.tpl#创建模板1be16c0c0314:/consul/config/tpl# pwd
/consul/config/tpl
1be16c0c0314:/consul/config/tpl# vi find_address.tpl
1be16c0c0314:/consul/config/tpl# more find_address.tpl
{{ key "/hashicorp/street_address" }}

touch find_address.tpl
#定义模板内容项
{{ key "/hashicorp/street_address" }}
2. consul-template读取KV数据,用于渲染生成配置文件#运行consul-template命令,
同时指定要使用的模板和需要更新的文件:consul-template -template "find_address.tpl:hashicorp_address.conf"

注: consul-template 命令会持续运行,可使用 CTRL+c 可以停止其运行。新开一个新终端,使用命令

行指令将数据写入Consul

3. 根据 consul kv 之类 

用来往consul的KV键值对中存入数据数据$ consul kv put hashicorp/street_address "127.0.0.1:8080"Success! Data written to: hashicorp/street_address
#查看hashicorp_address.conf 文件来确保有数据写入文件
cat /consul/config/tpl/hashicorp_address.conf
127.0.0.1:8080

4. 想要动态更新模板的值

再次 采用kv指令, 

consul kv put hashicorp/street_address "127.0.0.1:11000" 更新

hashicorp/street_address 值,可以看到该文件立即更新。有啥用? 比如用户可以用相同的过程来

更新HAProxy负载均衡器配置。

个人解释:模板文件位置:/consul/config/tpl模板文件名可以自定义 :需要在第二步执行命令是 将模板文件名以及需要更新的文件都指定好就行 consul-template -template "模板文件名:需输出的配置文件名称" 模板文件内容中的key :指的是需要到consul中的kv对应的键名 将值保持到上一步的“配置文件名称”中

具体的consul的kv 需要通过接口调用写入数据

Dockerfile构建镜像

1、先创建dockerfile文件名的文件,注意没有任何后缀

2、dockerfile 构建镜像的内容分段(须知:任何镜像都需要基于操作系统构建)

一、指定操作系统 / 已经构建好的别人或往期镜像

二、把软件安装的过程命令写在dockerfile中(安装程序)

三、配置系统如:开放端口、配置共享目录等

Dockerfile文件常用指令

FROM : 指定系统 / 镜像

RUN : 指定在系统中运行的命令 (讲究尽量多的命令合在一起)

EXPOSE : 指定镜像开放的端口

ENV :配置镜像环境

COPY : 复制主机的资源到镜像中

CMD : 指定容器启动的时候运行什么命令

Docker常用命令

1、根据dockerfile

docker build –t  镜像名 .

2、根据镜像名启动并运行起容器

docker run –itd --name 容器名  镜像名 -p=81:80

3、查看容器日志

docker log 容器id

4、查看容器进程

docker top 容器id

5、进入容器

docker  exec –it 容器名 bash/sh

1、查看所有镜像

docker images  .

2、删除镜像

docker rmi 镜像名  [-f  强制删除]

3、查看容器

docker ps  [-a  是查看所有容器]

4、查看容器进程

docker top 容器id

5、启动停止容器

docker start/stop 容器

Alpine镜像安装go问题

go在alpine系统采用的so不同导致的

情况:由于alpine镜像使用的是musl libc而不是gnu libc,/lib64/ 是不存在的。但他们是兼容的,可以创建个软连接过去.

mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

Docker网络

Docker网络和虚拟机一样;设定上分为三种

1、bridge : 桥接网络 (默认、常用)

2、none: 无指定网络 (没用过)

3、host:主机网络(特殊情况)

Docker网络-命令

docker network create --subnet=192.168.1.0/24 mynetwork

docker run -itd --network=redis-network --ip 192.168.1.10 --name dockerName imagesName

查看所有网络

docker network ls

docker network rm mynetwork

Docker run-补充

docker run

  -d: 后台运行容器,并返回容器ID;

  -i: 以交互模式运行容器,通常与 -t 同时使用;

  -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

  --name="nginx-lb": 为容器指定一个名称;

  -h "mars": 指定容器的hostname;

  -e username="ritchie": 设置环境变量;

  -m :设置容器使用内存最大值

  -v :与宿主机绑定共享目录

  -p :与宿主机绑定端口

  -ip : 定义网络ip

  --network:指定使用的网络

20220714docker-Consul_docker_03
20220714docker-Consul_数据中心_04

需要注意的是docker-composer运用的时候一定要注意版本的问题,如下图显示;

20220714docker-Consul_ico_05

Docker-compose安装

官网地址:https://docs.docker.com/compose/

安装:curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

version: "3.6" # 确定docker-composer文件的版本

services: # 代表就是一组服务 - 简单来说一组容器

  nginx: # 这个表示服务的名称,课自定义; 注意不是容器名称

    build: # 根据dockerfile构建镜像及构建为容器

      context: ./nginx

    image: nginx1.4_composer # 指定容器的镜像文件

    container_name: nginx-1.4-composer # 这是容器的名称

    ports: # 配置容器与宿主机的端口

      - "8001:80"

    privileged: true # 执行特殊权限的命令

    volumes: # 配置数据挂载

        - /redis_2004/09/nginx/conf:/conf

    working_dir: /conf #工作目录

docker-compose命令

运行编排好的容器

docker-compose up -d

停止编排好的容器

docker-compose stop

停止并删除编排好的容器

docker-compose down

Consul的API操作:

本地请求:基于 Agent

数据中心请求:基于 catalog 类型

注册服务:

http://ip:port/v1/kv/key ​​http://192.168.30.128:8530/v1/kv/config/db/connection​​
# CURL:
curl -X DELETE http://192.168.30.128:8530/v1/kv/config/db/connection

# 请求例子:

curl http://localhost:8500/v1/agnect/services
/v1/agent/checks --获取本地agent注册的所有检查(包括配置
文件和http注册)
/v1/agent/services --获取本地agent注册的所有服务
/v1/agent/members --获取集群中的成员
/v1/agent/self --获取本地agent的配置和成员信息
/v1/agent/join/ --注销一个本地agent的服务项

数据中心请求:

基于 catalog 类型
/v1/catalog/register --注册一个新的service、node、check
/v1/catalog/deregister --注销一个service、node、check
/v1/catalog/datacenters --列出知道的数据中心
/v1/catalog/nodes --在给定的数据中心列出node
/v1/catalog/services --在给定的数据中心列出service
/v1/catalog/service/

创建服务事例:

HTTP-API请求:

URL:http://192.168.30.128:8530/v1/agent/service/register
method: PUT
DATA:
{
"id":"goods-4", //服务id //如果没有则系统自动
"name":"goods", //服务名称
"tags":[ //标签信息
"核心业务",
"商品"
],
"address":"192.168.199.144", //IP地址
"port":80, //端口
"checks":[ //监控检查
{
"name":"核心商品业务", //健康检查名称
"http":"http://192.168.199.144:80", //需要请求的地址
"interval":"10s",//每隔多久检查一次
"timeout":"5s"//超时时间
}
]
}
20220714docker-Consul_docker_06

结果显示如下

20220714docker-Consul_数据中心_07

            请求了两次id 分别为goods-3 goods-4

20220714docker-Consul_docker_08
#本地请求(Agent)HTTP-API请求:查询本地节点下所有的注册服务URL:http://192.168.30.128:8530/v1/agent/servicesmethod: GET
HTTP-API请求:查询指定本地节点下的服务
语法:/v1/catalog/service/{name}
URL:http://192.168.30.128:8530/v1/agent/service/test1name
method: GET
--数据中心(catalog)的查询方式:
/v1/catalog/services --在给定的数据中心列出service
/v1/catalog/service/ --查看某个服务的信息
HTTP-API:查询当前数据中心下的注册的服务
URL:http://192.168.30.128:8510/v1/catalog/services
http://192.168.30.128:8510/v1/catalog/service/test1name
method:GET
20220714docker-Consul_数据中心_09

删除服务

语法:/v1/agent/service/deregister/URL:http://192.168.30.128:8530/v1/agent/service/deregister/test1method: PUT

更新服务

    更新服务和创建服务类似 查询id 和name相同的服务 有则更改没有则新增

/v1/agent/service/registerURL:http://192.168.30.128:8530/v1/agent/service/registermethod: PUTDATA: JSON格式数据{
"id":"goods-1",
"name":"goods",
"tags":[
"核心","商品"
],
"address":"192.168.199.144",
"port":3306,
"checks":[
{
"name":"商品核心业务",
"http":"http://192.168.199.144:3306",
"interval":"10s",
"timeout":"5s"
}
]
}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK