netcore ocelot docker consul集群相关资料参考

https://www.cnblogs.com/edisonchou/p/9124985.html

https://www.cnblogs.com/edisonchou/p/9148034.html

https://www.cnblogs.com/axzxs2001/p/8487521.html

https://blog.csdn.net/hailang2ll/article/details/82020027

https://blog.csdn.net/hailang2ll/article/details/82079192

 

consul访问键值,key/value,ip地址根据情况可能不同

访问所有键值

http://192.168.80.100:8500/v1/kv/?recurse

访问单个key=foo:

http://192.168.80.100:8500/v1/kv/foo

另外value值进行了base64加密,由于Consul的Value是经过Base64编码的(主要是为了允许非UTF-8的字符),所以这里看到的是编码后的结果。我们可以通过解码得到最终的Value值。

 

Docker安装consul集群

假设三台主机的ip分别为:

主机一:10.21.14.164

主机二:10.21.14.165

主机三:10.21.14.166

三台主机的安装步骤相似,以主机一为例:

1. 安装docker服务:

2. 启动docker服务:

3. 查找consul镜像:

docker search consul

4. 下载官方consul镜像:

docker pull consul

5. 下载完后可检查镜像:

docker images

6. 三台主机上建立数据目录和配置目录,目录为空即可:

mkdir -p /app/consul/data

mkdir -p /app/consul/conf

7. 三台主机依次启动容器:

主机一的命令为:

docker run --net=host --name consul -v /app/consul/data:/consul/data -v /app/consul/conf:/consul/config -d docker.io/consul consul agent -server -bind=10.21.14.164 -client 0.0.0.0 -ui -bootstrap-expect=3 -data-dir /consul/data -config-dir /consul/config

主机二的命令为:

docker run --net=host --name consul -v /app/consul/data:/consul/data -v /app/consul/conf:/consul/config -d docker.io/consul consul agent -server -bind=10.21.14.165 -client 0.0.0.0 -ui -bootstrap-expect=3 -data-dir /consul/data -config-dir /consul/config -join 10.21.14.164

主机三的命令为:

docker run --net=host --name consul -v /app/consul/data:/consul/data -v /app/consul/conf:/consul/config -d docker.io/consul consul agent -server -bind=10.21.14.166 -client 0.0.0.0 -ui -bootstrap-expect=3 -data-dir /consul/data -config-dir /consul/config -join 10.21.14.164

命令说明:

--net=host:采用主机网络配置,若采用默认的bridge模式,则会存在容器跨主机间通信失败的问题

-v /data/consul_data/data:/consul/data:主机的数据目录挂载到容器的/consul/data下,因为该容器默认的数据写入位置即是/consul/data

-v /data/consul_data/conf:/consul/config:主机的配置目录挂载到容器的/consul/conf下,因为该容器默认的数据写入位置即是/consul/conf

consul agent -server:consul的server启动模式

consul agent -bind=192.168.0.3:consul绑定到主机的ip上

consul agent  -bootstrap-expect=3:server要想启动,需要至少3个server

consul agent -data-dir /consul/data:consul的数据目录

consul agent -config-dir /consul/config:consul的配置目录

consul agent -join 192.168.0.1:对于主机二、三来说,需要加入到这个集群里

-client 0.0.0.0 -ui : 启动ui界面

都启动完成后,可以通过如下命令观察consul日志,了解启动情况:

docker logs 容器id/容器名称

8. 检查集群状态:

docker exec -it 容器id /bin/sh

通过该命令进入容器,查看集群信息:

[release@sh-lbs02 data]$ docker exec -it consul /bin/sh/

# consul members

至此,集群已启动完成,consul的端口打开较多,可以在主机上观察其端口情况:

[release@sh-web02 ~]$netstat -tlnp|grep consul

[sudo] passwordfor release:

tcp        00192.168.0.1:83000.0.0.0:*              LISTEN330/consul

tcp        00192.168.0.1:83010.0.0.0:*              LISTEN330/consul

tcp        00192.168.0.1:83020.0.0.0:*              LISTEN330/consul

tcp        00127.0.0.1:85000.0.0.0:*              LISTEN330/consul

tcp        00127.0.0.1:86000.0.0.0:*              LISTEN330/consul

9. 如何启动consul客户端?假设consul客户端与服务端在同一个主机上:

首先,建立客户端的配置目录和数据目录:

mkdir-p /app/consul_cli/data

mkdir-p /app/consul_cli/conf

其次,在配置目录下分配客户端使用的端口,避免与服务端的端口冲突:

cd /app/consul_cli/conf

touch basic.json

vi basic.json

#内容如下:

{

"ports": {

"http":18501,

"dns":18601,

"rpc":18401,

"serf_lan":18301,

"serf_wan":18302,

"server":18300        }

}

最后,启动客户端:

docker run  --net=host --name consul-cli -v /app/consul_cli/data:/consul/data -v /app/consul_cli/conf:/consul/config -d docker.io/consul consul agent -bind=10.21.14.166 -data-dir/consul/data -config-dir/consul/config -join10.21.14.164

作者:soane1983
链接:https://www.jianshu.com/p/565a1f24d730
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面

1、从容器里面拷文件到宿主机?

答:在宿主机里面执行以下命令

docker cp 容器名:要拷贝的文件在容器里面的路径       要拷贝到宿主机的相应路径

示例: 假设容器名为testtomcat,要从容器里面拷贝的文件路为:/usr/local/tomcat/webapps/test/js/test.js,  现在要将test.js从容器里面拷到宿主机的/opt路径下面,那么命令应该怎么写呢?

答案:在宿主机上面执行命令

2、从宿主机拷文件到容器里面

答:在宿主机里面执行如下命令

docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径

示例:假设容器名为testtomcat,现在要将宿主机/opt/test.js文件拷贝到容器里面的/usr/local/tomcat/webapps/test/js路径下面,那么命令该怎么写呢?

答案:在宿主机上面执行如下命令

3、在这里在记录一个问题,怎么看容器名称?

执行命令:docker ps,出现如图所示,其中NAMES就是容器名了。

4.需要注意的是,不管容器有没有启动,拷贝命令都会生效。

 

宿主机,virturalbox虚拟机,docker,consul集群

宿主机和虚拟机区别:
宿主机是虚拟机的物理基础,虚拟机存在于宿主机中,与宿主机共享使用硬件。宿主机的运行是虚拟机运行的前提与基础。
虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
宿主机就是主机,这个概念是相对于子机而言的,比如安装有虚拟机的话,那么相对于虚拟机而言,正在使用的计算机就是宿主机,虚拟机是安装在主机上的,必须在主机上才能运行,主机就是一个“宿主”。
docker可以运行在宿主机上,也可以运行于虚拟机上。
宿主机进入虚拟机virtualbox命令:
$docker-machine ssh server1

docker run -d --name=node1 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
-p 8300:8300 \
-p 8301:8301 \
-p 8301:8301/udp \
-p 8302:8302/udp \
-p 8302:8302 \
-p 8400:8400 \
-p 8500:8500 \
-p 8600:8600 \
-h node1 \
consul agent -server -bind=172.17.0.2 -bootstrap-expect=3 -node=node1 \
-data-dir=/tmp/data-dir -client 0.0.0.0 -ui
docker run -d --name=node2 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
-p 9300:8300 \
-p 9301:8301 \
-p 9301:8301/udp \
-p 9302:8302/udp \
-p 9302:8302 \
-p 9400:8400 \
-p 9500:8500 \
-p 9600:8600 \
-h node2 \
consul agent -server -bind=172.17.0.3 \
-join=192.168.99.103 -node-id=$(uuidgen | awk '{print tolower($0)}') \
-node=node2 \
-data-dir=/tmp/data-dir -client 0.0.0.0 -ui

docker run -d --name=node3 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
-p 10300:8300 \
-p 10301:8301 \
-p 10301:8301/udp \
-p 10302:8302/udp \
-p 10302:8302 \
-p 10400:8400 \
-p 10500:8500 \
-p 10600:8600 \
-h node3 \
consul agent -server -bind=172.17.0.4 \
-join=192.168.99.103 -node-id=$(uuidgen | awk '{print tolower($0)}') \
-node=node3 \
-data-dir=/tmp/data-dir -client 0.0.0.0 -ui

docker run -d --name=node4 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' \
-p 11300:8300 \
-p 11301:8301 \
-p 11301:8301/udp \
-p 11302:8302/udp \
-p 11302:8302 \
-p 11400:8400 \
-p 11500:8500 \
-p 11600:8600 \
-h node4 \
consul agent -bind=172.17.0.5 -retry-join=192.168.99.103 \
-node-id=$(uuidgen | awk '{print tolower($0)}') \
-node=node4 -client 0.0.0.0 -ui

docker run -d --name=node5 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' \
-p 12300:8300 \
-p 12301:8301 \
-p 12301:8301/udp \
-p 12302:8302/udp \
-p 12302:8302 \
-p 12400:8400 \
-p 12500:8500 \
-p 12600:8600 \
-h node5 \
consul agent -bind=172.17.0.6 -retry-join=192.168.99.103 \
-node-id=$(uuidgen | awk '{print tolower($0)}') \
-node=node5 -client 0.0.0.0 -ui

docker run -d --name=node6 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' \
-p 13300:8300 \
-p 13301:8301 \
-p 13301:8301/udp \
-p 13302:8302/udp \
-p 13302:8302 \
-p 13400:8400 \
-p 13500:8500 \
-p 13600:8600 \
-h node6 \
consul agent -bind=172.17.0.7 -retry-join=192.168.99.103 \
-node-id=$(uuidgen | awk '{print tolower($0)}') \
-node=node6 -client 0.0.0.0 -ui

docker run --name server1 -d --net=host -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
consul agent -server -ui -bootstrap-expect=3 \
-data-dir=/tmp/consul -node=server1 \
-client=0.0.0.0 -bind=192.168.99.103

docker run --name server2 -d --net=host -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
consul agent -server -ui -bootstrap-expect=3 \
-data-dir=/tmp/consul -node=server2 \
-client=0.0.0.0 -bind=192.168.99.104 -join 192.168.99.103

docker run --name server3 -d --net=host -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
consul agent -server -ui -bootstrap-expect=3 \
-data-dir=/tmp/consul -node=server3 \
-client=0.0.0.0 -bind=192.168.99.105 -join 192.168.99.103

docker run --name client1 -d --net=host -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
consul agent -node=client1 \
-client=0.0.0.0 -bind=192.168.99.106 -retry-join=192.168.99.103

docker run --name client2 -d --net=host -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
consul agent -node=client2 \
-bind=192.168.99.107 -retry-join=192.168.99.103

--name
docker参数,设置容器名称

-node
consul agent的参数,设置集群结点名称

-bind
绑定集群内部ip,此ip可以被集群中其它结点访问到

consul agent参数参考:https://www.consul.io/docs/agent/options.html
server类型结点可以访问集群ui界面,client模式则不可以。
http://192.168.99.103:8500
http://192.168.99.104:8500
http://192.168.99.105:8500
查看集群结点各个server信息:进入node1虚拟机执行命令:
docker exec -t node1 consul members
结果显示:
Node Address Status Type Build Protocol DC Segment
server1 192.168.99.103:8301 alive server 1.6.2 2 dc1 <all>
server2 192.168.99.104:8301 alive server 1.6.2 2 dc1 <all>
server3 192.168.99.105:8301 alive server 1.6.2 2 dc1 <all>
client1 192.168.99.106:8301 alive client 1.6.2 2 dc1 <default>
client2 192.168.99.107:8301 alive client 1.6.2 2 dc1 <default>

查看目前全部的consul的角色状态:
docker exec -t node1 consul operator raft list-peers
结果:
docker@node1:~$ docker exec -t beautiful_hugle consul operator raft list-peers
Node ID Address State Voter RaftProtocol
server1 0111e3b9-6ef6-3b96-3c8a-f35adc10b997 192.168.99.103:8300 leader true 3
server2 442b7edf-a273-6ea4-7555-28ade8e1405f 192.168.99.104:8300 follower true 3
server3 ccf7e7cd-afba-ebf1-4b4c-5b42a2036ad2 192.168.99.105:8300 follower true 3

虚拟机中查看docker启动日志:
docker logs 容器id/容器名称

OCI runtime exec failed: exec failed: container_linux.go:346: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown
进入docker容器内部命令:
docker exec -it 容器id /bin/sh
或者
docker exec -it 容器id /bin/bash

宿主机进入node1虚拟机,新建如下文件夹和文件,将.netcore服务注册到Consul(通过配置文件来注册服务,其中,192.168.1.106为本物理机地址,物理机上运行宿主机):执行如下命令,进行配置文件注册服务
vi /shared/app/consul/conf/services_config.json
代码如下:
{
"services":[
{
"id": "CLIENT_SERVICE_01",
"name" : "MVCClientService",
"tags": [
"MVCClientService01"
],
"address": "192.168.1.106",
"port": 8820,
"checks": [
{
"name": "clientservice_check",
"http": "http://192.168.1.106:8820",
"interval": "10s",
"timeout": "5s"
}
]
},
{
"id": "CLIENT_SERVICE_02",
"name" : "APIClientService",
"tags": [
"APIClientService02"
],
"address": "192.168.1.106",
"port": 8810,
"checks": [
{
"name": "clientservice_check",
"http": "http://192.168.1.106:8810/api/values",
"interval": "10s",
"timeout": "5s"
}
]
}
]
}
文件保存不了,用sudo提升权限
linux vi常用命令:
退出:q!
保存退出:wq

将宿主机Client1的配置文件实现服务注册
docker run --name client1 -d --net=host \
-v /shared/app/consul/data:/consul/data \
-v /shared/app/consul/conf:/consul/config \
consul agent -client=0.0.0.0 -data-dir=/consul/data -config-dir=/consul/config \
-bind=192.168.99.106 -join=192.168.99.103
说明:shared目录为宿主机在virtualbox中的共享目录,这样就可以在启动Docker的同时,启动consul加载配置文件,实现服务注册

通过url提供的api实现服务注册
curl -X PUT -d '{"id": "jetty","name": "jetty","address": "192.168.1.106","port": 8820,"tags": ["dev"],"checks": [{"http": "http://192.168.1.106:8820","interval": "5s"}]}' \
http://192.168.99.106:8500/v1/agent/service/register

删除服务,删除后不会恢复
curl -v -X PUT http://192.168.99.106:8500/v1/agent/service/deregister/jetty
说明:jetty为ServiceID

以下两个操作,删除服务后,隔一会还恢复加入
curl -X PUT -d '{"Datacenter":"dc1","Node":"client1","ServiceID":"jetty"}' http://192.168.99.106:8500/v1/catalog/deregister
或者
curl --request PUT --data '{"Datacenter":"dc1","Node":"client1","ServiceID":"jetty"}' http://192.168.99.106:8500/v1/catalog/deregister