docker-compose部署etcd集群的實(shí)現(xiàn)步驟
編寫docker-compose.yml
version: "3.0"
networks:
etcd-net: # 網(wǎng)絡(luò)
driver: bridge # 橋接模式
volumes:
etcd1_data: # 掛載到本地的數(shù)據(jù)卷名
driver: local
etcd2_data:
driver: local
etcd3_data:
driver: local
###
### etcd 其他環(huán)境配置見:https://doczhcn.gitbook.io/etcd/index/index-1/configuration
###
services:
etcd1:
image: bitnami/etcd:latest # 鏡像
container_name: etcd1 # 容器名 --name
restart: always # 總是重啟
networks:
- etcd-net # 使用的網(wǎng)絡(luò) --network
ports: # 端口映射 -p
- "20000:2379"
- "20001:2380"
environment: # 環(huán)境變量 --env
- ALLOW_NONE_AUTHENTICATION=yes # 允許不用密碼登錄
- ETCD_NAME=etcd1 # etcd 的名字
- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd1:2380 # 列出這個(gè)成員的伙伴 URL 以便通告給集群的其他成員
- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380 # 用于監(jiān)聽伙伴通訊的URL列表
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 # 用于監(jiān)聽客戶端通訊的URL列表
- ETCD_ADVERTISE_CLIENT_URLS=http://etcd1:2379 # 列出這個(gè)成員的客戶端URL,通告給集群中的其他成員
- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster # 在啟動(dòng)期間用于 etcd 集群的初始化集群記號(hào)
- ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380 # 為啟動(dòng)初始化集群配置
- ETCD_INITIAL_CLUSTER_STATE=new # 初始化集群狀態(tài)
volumes:
- etcd1_data:/bitnami/etcd # 掛載的數(shù)據(jù)卷
etcd2:
image: bitnami/etcd:latest
container_name: etcd2
restart: always
networks:
- etcd-net
ports:
- "20002:2379"
- "20003:2380"
environment:
- ALLOW_NONE_AUTHENTICATION=yes
- ETCD_NAME=etcd2
- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd2:2380
- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_ADVERTISE_CLIENT_URLS=http://etcd2:2379
- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
- ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
- ETCD_INITIAL_CLUSTER_STATE=new
volumes:
- etcd2_data:/bitnami/etcd
etcd3:
image: bitnami/etcd:latest
container_name: etcd3
restart: always
networks:
- etcd-net
ports:
- "20004:2379"
- "20005:2380"
environment:
- ALLOW_NONE_AUTHENTICATION=yes
- ETCD_NAME=etcd3
- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd3:2380
- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_ADVERTISE_CLIENT_URLS=http://etcd3:2379
- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
- ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
- ETCD_INITIAL_CLUSTER_STATE=new
volumes:
- etcd3_data:/bitnami/etcd
運(yùn)行docker-compose
[root@centos8 etcdtest]# tree . └── docker-compose.yml 0 directories, 1 file [root@centos8 etcdtest]# docker-compose up -d [+] Running 4/4 ⠿ Network etcdtest_etcd-net Created 0.1s ⠿ Container etcd3 Started 0.6s ⠿ Container etcd1 Started 0.7s ⠿ Container etcd2 Started 0.7s [root@centos8 etcdtest]#
檢查搭建狀態(tài)
查看節(jié)點(diǎn)啟動(dòng)情況
[root@centos8 etcdtest]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 89469f98491f bitnami/etcd:latest "/opt/bitnami/script…" 54 seconds ago Up 53 seconds 0.0.0.0:20004->2379/tcp, :::20004->2379/tcp, 0.0.0.0:20005->2380/tcp, :::20005->2380/tcp etcd3 5454f5a719a2 bitnami/etcd:latest "/opt/bitnami/script…" 54 seconds ago Up 53 seconds 0.0.0.0:20000->2379/tcp, :::20000->2379/tcp, 0.0.0.0:20001->2380/tcp, :::20001->2380/tcp etcd1 bf989f9512b5 bitnami/etcd:latest "/opt/bitnami/script…" 54 seconds ago Up 53 seconds 0.0.0.0:20002->2379/tcp, :::20002->2379/tcp, 0.0.0.0:20003->2380/tcp, :::20003->2380/tcp etcd2
查看掛載的數(shù)據(jù)卷
[root@centos8 etcdtest]# docker volume ls DRIVER VOLUME NAME local etcdtest_etcd1_data local etcdtest_etcd2_data local etcdtest_etcd3_data
[root@centos8 etcdtest]# docker inspect etcd1
"Mounts": [
{
"Type": "volume",
"Name": "etcdtest_etcd1_data",
"Source": "/var/lib/docker/volumes/etcdtest_etcd1_data/_data",
"Destination": "/bitnami/etcd",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
]
測(cè)試節(jié)點(diǎn)
從etcd1寫一個(gè)key
[root@centos8 etcdtest]# docker exec -it etcd1 bash I have no name!@5454f5a719a2:/opt/bitnami/etcd$ etcdctl put name "i am wxf" OK
從etcd2讀一個(gè)value
[wxf@centos8 ~]$ docker exec -it etcd2 bash I have no name!@bf989f9512b5:/opt/bitnami/etcd$ etcdctl get name name i am wxf
搭建成功!
Golang 與 etcd 簡(jiǎn)單交互
package main
import (
"context"
"fmt"
"go.etcd.io/etcd/client/v3"
"time"
)
func main() {
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{"http://192.168.135.10:20000", "http://192.168.135.10:20002", "http://192.168.135.10:20004"},
DialTimeout: 5 * time.Second,
})
if err != nil {
fmt.Printf("connect to etcd failed, err:%v\n", err)
return
}
defer cli.Close()
fmt.Println("connect to etcd success")
defer cli.Close()
go Watch(cli)
Create(cli)
Read(cli)
Delete(cli)
Update(cli)
select {}
}
func Watch(cli *clientv3.Client) {
rch := cli.Watch(context.Background(), "name") // type WatchChan <-chan WatchResponse
for wresp := range rch {
for _, ev := range wresp.Events {
fmt.Printf("Type: %s Key:%s Value:%s\n", ev.Type, ev.Kv.Key, ev.Kv.Value)
}
}
fmt.Println("out")
}
func Create(cli *clientv3.Client) {
// put
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
_, err := cli.Put(ctx, "name", "wxf")
cancel()
if err != nil {
fmt.Printf("put to etcd failed, err:%v\n", err)
return
}
}
func Read(cli *clientv3.Client) {
//get
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
resp, err := cli.Get(ctx, "name")
cancel()
if err != nil {
fmt.Printf("get from etcd failed, err:%v\n", err)
return
}
for _, ev := range resp.Kvs {
fmt.Printf("Type: %s Key:%s Value:%s\n", "READ", ev.Key, ev.Value)
}
}
func Update(cli *clientv3.Client) {
// put
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
_, err := cli.Put(ctx, "name", "xyy")
cancel()
if err != nil {
fmt.Printf("put to etcd failed, err:%v\n", err)
return
}
}
func Delete(cli *clientv3.Client) {
//del
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
_, err := cli.Delete(ctx, "name")
cancel()
if err != nil {
fmt.Printf("delete from etcd failed, err:%v\n", err)
return
}
}
go run main.go
connect to etcd success
Type: PUT Key:name Value:wxf
Type: READ Key:name Value:wxf
Type: DELETE Key:name Value:
Type: PUT Key:name Value:xyy
Type: PUT Key:name Value:test for terminal
Type: PUT Key:name Value:test for terminal aabbccdd
I have no name!@5454f5a719a2:/opt/bitnami/etcd$ etcdctl put name "test for terminal"
OK
I have no name!@5454f5a719a2:/opt/bitnami/etcd$ etcdctl put name "test for terminal aabbccdd"
OK
到此這篇關(guān)于docker-compose部署etcd集群的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)docker-compose部署etcd集群內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker run 運(yùn)行容器自動(dòng)結(jié)束的解決
這篇文章主要介紹了docker run 運(yùn)行容器自動(dòng)結(jié)束的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-11-11
Docker部署Java應(yīng)用程序的實(shí)現(xiàn)步驟
本文主要介紹了Docker部署Java應(yīng)用程序的實(shí)現(xiàn)步驟,通過將Java應(yīng)用程序打包成一個(gè)Docker鏡像,可以實(shí)現(xiàn)快速部署、資源隔離和靈活擴(kuò)展,感興趣的可以了解一下2024-03-03
使用 VPS 下載 Docker 鏡像并導(dǎo)入到本地服務(wù)器的過程
這篇文章主要介紹了使用 VPS 下載 Docker 鏡像并導(dǎo)入到本地服務(wù)器,通過使用 VPS 下載 Docker 鏡像并將其傳輸?shù)奖镜胤?wù)器,我們可以克服網(wǎng)絡(luò)限制,更靈活地管理和部署 Docker 鏡像,需要的朋友可以參考下2024-08-08
在Docker Compose中獲取最新鏡像的多種方法總結(jié)
Docker 鏡像是 Docker 容器的基礎(chǔ),鏡像包含了應(yīng)用程序所需的所有文件和依賴,Docker-Compose 默認(rèn)不會(huì)自動(dòng)拉取最新的鏡像版本,這可能會(huì)導(dǎo)致使用過時(shí)的鏡像,從而錯(cuò)過重要的更新,為了確保 Docker-Compose 始終使用最新的鏡像,我們可以采用多種方法,以下將詳細(xì)介紹這些方法2024-08-08
Docker Buildx構(gòu)建多平臺(tái)鏡像的實(shí)現(xiàn)
本文主要介紹了Docker Buildx構(gòu)建多平臺(tái)鏡像的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

