docker安裝consul詳細教程


  1. 拉取鏡像
    sudo docker pull consul

  2. 啟動節點1(server模式)
    docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node1 consul agent -server -bind=172.17.0.2 -bootstrap-expect=3 -node=node1

-node:節點的名稱 
-bind:綁定的一個地址,用於節點之間通信的地址,可以是內外網,必須是可以訪問到的地址 
-server:這個就是表示這個節點是個SERVER 
-bootstrap-expect:這個就是表示期望提供的SERVER節點數目,數目一達到,它就會被激活,然后就是LEADER了
  1. 啟動節點2-3(server模式)

cat /proc/sys/kernel/random/uuid 每次都可以獲取到唯一ID

sudo docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node2 consul agent -server -bind=172.17.0.3  -join=172.17.0.2 -node-id=$(cat /proc/sys/kernel/random/uuid)  -node=node2
 
sudo docker run -p 8500:8500 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node3 consul agent -server -bind=172.17.0.5  -join=172.17.0.2 -node-id=$(cat /proc/sys/kernel/random/uuid)  -node=node3 -client=172.17.0.5
-join:這個表示啟動的時候,要加入到哪個集群內,這里就是說要加入到節點1的集群 
-node-id:這個貌似版本8才加入的,這里用這個來指定唯一的節點ID,可以查看這個issue 
-client:這個表示注冊或者查詢等一系列客戶端對它操作的IP,如果不指定這個IP,默認是127.0.0.1。
  1. 啟動節點4(client模式)
    docker run -d -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' --name=node4 consul agent -bind=172.17.0.6 -retry-join=172.17.0.2 -node-id=$(cat /proc/sys/kernel/random/uuid) -node=node4
    除了沒有-server,其它都是一樣的,沒有這個就說明這個節點是CLIENT

  2. 查看下集群的狀態
    sudo docker exec -t node1 consul members

    4個節點都列出來了。Status表示它們的狀態,都是alive。Type表示它們的類型,三個SERVER一個CLIENT,和我們之前啟動的一樣。DC表示數據中心,都是dc1。

  3. 節點異常,consul的處理
    LEADER 掛了
    leader掛了,consul會重新選取出新的leader,只要超過一半的SERVER還活着,集群是可以正常工作的。node1是leader,所以把這個容器停了。

docker stop node1
看看其他節點的日志(node2):
sudo docker logs node2

日志打印,心跳檢查node1的ip超時,接着開始選舉。node2被選舉為新的leader。我們查看下現在的leader:
curl http://10.0.4.17:8500/v1/status/leader
返回內容:
"172.17.0.3:8300", 172.17.0.3 就是 node2節點的IP

  1. 注冊個服務
    (1)服務參數解析
{
  "ID": "goodServiceId", //服務id
  "Name": "goodService", //服務名
  "Tags": [              //服務的tag,自定義,可以根據這個tag來區分同一個服務名的服務
    "primary",
    "v1"
  ],
  "Address": "127.0.0.1",//服務注冊到consul的IP,服務發現,發現的就是這個IP
  "Port": 7000,          //服務注冊consul的PORT,發現的就是這個PORT
  "EnableTagOverride": false,
  "Check": {             //健康檢查部分
    "DeregisterCriticalServiceAfter": "90m",
    "HTTP": "http://www.google.com", //指定健康檢查的URL,調用后只要返回20X,consul都認為是健康的
    "Interval": "10s"   //健康檢查間隔時間,每隔10s,調用一次上面的URL
  }
}

(2)注冊服務

curl http://10.0.4.17:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -d '{
  "ID": "centerServiceId",  
  "Name": "centerService",
  "Tags": [
    "primary",
    "v1"
  ],
  "Address": "127.0.0.1",
  "Port": 6000,
  "EnableTagOverride": false,
  "Check": {
    "DeregisterCriticalServiceAfter": "90m",
    "HTTP": "http://www.baidu.com",
    "Interval": "10s"
  }
}'

響應:

HTTP/1.1 200 OK
Vary: Accept-Encoding
X-Consul-Default-Acl-Policy: allow
Date: Tue, 15 Feb 2022 06:42:25 GMT
Content-Length: 0
  1. 發現個服務
    剛剛注冊了名為userService的服務,我們現在發現(查詢)下這個服務
    curl http://10.0.4.17:8500/v1/catalog/service/userService
    響應:
  • 瀏覽器查看單個服務:
    http://mayanan.cn:8500/v1/catalog/service/userService

  • 瀏覽器查看所有服務
    http://mayanan.cn:8500/v1/agent/services

內容有了吧,這個就是我們剛剛注冊的服務的信息,就可以獲取到

服務的名稱是“userService”
服務地址是“127.0.0.1”
服務的端口是“8000”

  1. 存儲個k/v
    設置一個值到user/config/connections 內容為5
    sudo docker exec -t node1 consul kv put user/config/connections 5
  • 獲取特定的值
    sudo docker exec -t node1 consul kv get -detailed user/config/connections
    返回:

  • 刪除個k/v
    sudo docker exec -t node1 consul kv delete user/config/connections

參考文檔:
consul入門教程
consul官方文檔
consul github源碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM