HashiCorp 的 Consul 是一款多功能工具,可在現(xiàn)代 devops 環(huán)境中提供多種功能。它廣泛用于服務(wù)發(fā)現(xiàn)、運(yùn)行狀況檢查、負(fù)載平衡,尤其是作為分布式鍵值 (KV) 存儲(chǔ)。 consul 中的 KV 存儲(chǔ)非常適合在整個(gè)基礎(chǔ)設(shè)施中以高度可用、一致的方式存儲(chǔ)動(dòng)態(tài)配置數(shù)據(jù)、功能標(biāo)志、秘密和元數(shù)據(jù),以便分布式系統(tǒng)中的服務(wù)可以動(dòng)態(tài)訪問(wèn)它們。使用 docker 配置 Consul
本教程將引導(dǎo)您完成設(shè)置和開發(fā)的過(guò)程 使用 Docker 配置 Consul 的 KV 存儲(chǔ)。到最后,你將擁有一個(gè) 在 Docker 中運(yùn)行的功能齊全的 Consul 實(shí)例,帶有 KV 對(duì) 已配置且可訪問(wèn)。此設(shè)置對(duì)于動(dòng)態(tài)服務(wù)至關(guān)重要 分布式系統(tǒng)中的配置和狀態(tài)管理。
第 1 步 – 拉取 Consul Docker 鏡像
讓我們從 Docker Hub 拉取官方 Consul 鏡像。這張圖片是 由 HashiCorp 維護(hù),包含運(yùn)行 Consul 所需的一切。
登錄到 Ubuntu Droplet 的控制臺(tái)并運(yùn)行:
docker pull hashicorp/consul:latest
Outputlatest: Pulling from hashicorp/consul c8bcd218a73d: Pull complete 5f1ac8227c2a: Pull complete c51fd79d429a: Pull complete 91eff479bde6: Pull complete 4dfcc18e51db: Pull complete 3e2a8bf39bf9: Pull complete bd9ddc54bea9: Pull complete 2054d291fb84: Pull complete Digest: sha256:e244c64df77ab3586f177f1692e98575086eb40343dc82a6320f5e79543490eb Status: Downloaded newer image for hashicorp/consul:latest docker.io/hashicorp/consul:latest
步驟2 — 運(yùn)行Consul容器
現(xiàn)在Consul鏡像已經(jīng)下載完畢,你可以啟動(dòng)一個(gè)新的Consul 容器。該容器將作為您的 Consul 服務(wù)器并且將 允許您與 KV 存儲(chǔ)交互。
要啟動(dòng)容器,運(yùn)行:
docker run -d --name=consul-server -e
OutputCONSUL_BIND_INTERFACE=eth0 -p 8500:8500 -p 8600:8600/udp hashicorp/consul c893b6707686bce8434213975a75c936b834cf25fc84d10b407a11c4fa8ca8ba
這是此命令的作用:
- -d 以分離模式(在后臺(tái))運(yùn)行容器。
- –name=consul-server 為容器分配名稱。
- -e CONSUL_BIND_INTERFACE=eth0 設(shè)置 Consul 應(yīng)綁定到的網(wǎng)絡(luò)接口。這是正確網(wǎng)絡(luò)通信所必需的。
- -p 8500:8500 將 Consul Web ui 和 API 端口映射到主機(jī)。
- -p 8600:8600/udp 映射 DNS 服務(wù)端口 服務(wù)發(fā)現(xiàn)。
這一步至關(guān)重要,因?yàn)樗O(shè)置了您將使用的核心 Consul 服務(wù)配置KV存儲(chǔ)。
第3步 – 驗(yàn)證Consul安裝
為了確保Consul正確運(yùn)行,您需要驗(yàn)證容器狀態(tài)并訪問(wèn)Consul UI。
首先,運(yùn)行 docker ps 列出所有正在運(yùn)行的容器并驗(yàn)證 Consul 容器是否為
? docker ps CONTaiNER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c893b6707686 hashicorp/consul "docker-entrypoint.s…" 51 seconds ago Up 50 seconds 8300-8302/tcp, 8600/tcp, 8301-8302/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8600->8600/udp consul-server
現(xiàn)在,檢查 Consul 是否可以訪問(wèn),打開 Web 瀏覽器,然后導(dǎo)航到 http://localhost:8500. 您應(yīng)該看到 Consul UI。
此驗(yàn)證步驟對(duì)于確認(rèn)您的領(lǐng)事 在將數(shù)據(jù)存儲(chǔ)到 KV 之前,實(shí)例運(yùn)行沒有任何問(wèn)題 store(步驟 5)。
步驟 4 — 配置防火墻(可選)
如果您的 Consul 實(shí)例需要從外部訪問(wèn)(例如,從 集群中的其他節(jié)點(diǎn)),您必須調(diào)整防火墻設(shè)置以 允許必要端口上的流量。
例如,如果您在云實(shí)例上運(yùn)行 Consul,您可以 需要允許端口 8500 (http API) 和 8600 (DNS) 上的入站流量。 具體命令將根據(jù)您的防火墻解決方案(UFW、 iptables 等)。
此步驟確保您的 Consul 實(shí)例可以從其他實(shí)例訪問(wèn) 機(jī)器,這對(duì)于分布式配置至關(guān)重要。
第 5 步 — 存儲(chǔ)鍵值對(duì)
Consul 運(yùn)行后,您現(xiàn)在可以使用 KV 存儲(chǔ)來(lái)存儲(chǔ) 配置數(shù)據(jù)。您可以使用 Consul CLI 添加鍵值對(duì)或 Web UI。
要通過(guò) CLI 存儲(chǔ)鍵值對(duì),運(yùn)行:
docker exec -it consul-server consul kv put config/db_host 192.168.1.100 Success! Data written to: config/db_host
docker exec -it consul-server consul kv put config/db_port 3306 Success! Data written to: config/db_port
這是此命令的作用:
- -it – 從本地系統(tǒng)啟動(dòng)交互式終端到容器。
- consul kv put – kv put 命令將數(shù)據(jù)寫入給定路徑 KV store.
- config/db_host – 存儲(chǔ)路徑value.
- 192.168.1.100 – Value.
使用 Web UI,
- 導(dǎo)航到 Consul UI (http://localhost:8500).
- 點(diǎn)擊“鍵/值”選項(xiàng)卡。
- 單擊“創(chuàng)建”創(chuàng)建一個(gè)新密鑰。
- 輸入密鑰(例如 config/db_host)和值(例如 192.168.1.100)。
這些命令和操作存儲(chǔ)您的服務(wù)可以動(dòng)態(tài)訪問(wèn)的關(guān)鍵配置數(shù)據(jù)
第 6 步 — 檢索鍵值對(duì)
存儲(chǔ)了一些 KV 對(duì)后,您將需要檢索它們以確保它們已正確存儲(chǔ)。
使用 CLI,使用以下命令檢索值命令:
docker exec -it consul-server consul kv get config/db_host 192.168.1.100
使用 Web UI,
- 轉(zhuǎn)到到 Consul 中的“鍵/值”選項(xiàng)卡UI。
- 找到您創(chuàng)建的密鑰并單擊它以查看存儲(chǔ)的值。
檢索 KV 對(duì)是必要的步驟驗(yàn)證您的數(shù)據(jù)是否正確存儲(chǔ)且可訪問(wèn)。
第 7 步 — 使用 Docker 持久保存數(shù)據(jù)卷
默認(rèn)情況下,Docker 容器是短暫的,這意味著任何數(shù)據(jù) 如果容器被移除,存儲(chǔ)在其中的信息將會(huì)丟失。堅(jiān)持 您的 Consul KV 數(shù)據(jù),您應(yīng)該使用 Docker 卷。
- 停止并刪除當(dāng)前 Consul 容器:
docker stop consul-server docker rm consul-server
現(xiàn)在,檢查容器,您應(yīng)該注意到 Consul 容器不再運(yùn)行。
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2.運(yùn)行新的 Consul具有 Docker 卷的容器附:
docker run -d --name=consul-server -e
OutputCONSUL_BIND_INTERFACE=eth0 -p 8500:8500 -p 8600:8600/udp -v consul_data:/consul/data hashicorp/consul 2d2a7d3ff1911c2283e70506d68391a5cbf9c935a2ae447bfb8fa21481989ef1
docker ps
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2d2a7d3ff191 hashicorp/consul "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 8300-8302/tcp, 8600/tcp, 8301-8302/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8600->8600/udp consul-server
-v consul_data:/consul/data 選項(xiàng)將 Docker 卷掛載到容器,確保您的 KV 存儲(chǔ)在容器重新啟動(dòng)后仍然存在。
第 8 步 — 自動(dòng) Consul 啟動(dòng)(可選)
用于生產(chǎn)部署時(shí),您可能希望自動(dòng)啟動(dòng) 使用 Docker Compose 的 Consul 容器。 Docker Compose 簡(jiǎn)化了 多容器 Docker 應(yīng)用程序并使其易于管理
創(chuàng)建一個(gè)包含以下內(nèi)容的 docker-compose.yml 文件:
services: consul: image: hashicorp/consul:latest environment: - CONSUL_BIND_INTERFACE=eth0 volumes: - consul_data:/consul/data ports: - "8500:8500" - "8600:8600/udp" restart: alwaysvolumes: consul_data:
然后,運(yùn)行:
docker-compose up -d
Output[ ] Running 2/2 ? Network work_default Created 0.0s ? Container consul-server Started 0.1s
docker ps
OutputWARN[0000] /Users/anandhkumar/work/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS work-consul-1 hashicorp/consul:latest "docker-entrypoint.s…" consul 40 seconds ago Up 11 seconds 8300-8302/tcp, 8600/tcp, 8301-8302/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8600->8600/udp
這個(gè)命令自動(dòng)啟動(dòng) Consul 并確保它在失敗時(shí)重新啟動(dòng),使其更適合生產(chǎn)使用。
第 9 步 – 清理
完成 Consul 實(shí)例的使用后,您應(yīng)該清理你的 Docker 環(huán)境以釋放資源。
讓我們停止并刪除 Consul容器:
docker stop consul-server docker rm consul-serverdocker ps
outputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
如果您已經(jīng)完成了 Consul,您還可以刪除 Docker圖片:
docker rmi hashicorp/consul
outputhashicorp/consul@sha256:e244c64df77ab3586f177f1692e98575086eb40343dc82a6320f5e79543490eb Deleted: sha256:eff8ccb509560987755a70df8d6c0b9410538d503d99498ae1ea9f48066b0439 Deleted: sha256:b5e6402bbb78eb061d538505a30300ef7f612104eaf0f11b17839a9b29bc5603 Deleted: sha256:1c61ada2ad8074615120d13bd805260d766ae8424cafbda4bded529d6a204d6f Deleted: sha256:9b36da670e2a59f1d81c6e3c9d55906c576b384df51272977e5a9caea7131e74 Deleted: sha256:8c6e52c441c246f60ca146b71204b7d6511df75fa87a0dc0a0f91141964e8fd9 Deleted: sha256:1fce18208235de2be3c419764ec1d469229af5387447d21649c841632c653cef Deleted: sha256:68e0a114c9c35b9aa8cac31fa32b27f886361bc85fcc63f34e882e9128f33a14 Deleted: sha256:3da5b888208a9b19694bfeaf8c74a432b50f44542d717c9e1f3ab273e505855a Deleted: sha256:dea73e9287e6e2f3b7f9fcac4f20767d7badeefa24e52f990f1674e98abfa1a3 Deleted: sha256:201fa22d1f4c7d6e7ec43135c63b2260f303f4864f5eb43569faaa1731628799
清潔up 有助于維護(hù)整潔的開發(fā)環(huán)境,并確保 Docker 資源不會(huì)被不必要地消耗。