docker-compose部署etcd 集群

首页 / 新闻资讯 / 正文

version: "3.0"  networks:   etcd-net:           # 网络     driver: bridge    # 桥接模式  volumes:   etcd1_data:         # 挂载到本地的数据卷名     driver: local   etcd2_data:     driver: local   etcd3_data:     driver: local ### ### etcd 其他环境配置见:https://doczhcn.gitbook.io/etcd/index/index-1/configuration ### services:   etcd1:     image: bitnami/etcd:latest  # 镜像     container_name: etcd1       # 容器名 --name     restart: always             # 总是重启     networks:       - etcd-net                # 使用的网络 --network     ports:                      # 端口映射 -p       - "20000:2379"       - "20001:2380"     environment:                # 环境变量 --env       - ALLOW_NONE_AUTHENTICATION=yes                       # 允许不用密码登录       - ETCD_NAME=etcd1                                     # etcd 的名字       - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd1:2380  # 列出这个成员的伙伴 URL 以便通告给集群的其他成员       - ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380           # 用于监听伙伴通讯的URL列表       - ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379         # 用于监听客户端通讯的URL列表       - ETCD_ADVERTISE_CLIENT_URLS=http://etcd1:2379        # 列出这个成员的客户端URL,通告给集群中的其他成员       - ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster             # 在启动期间用于 etcd 集群的初始化集群记号       - ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380 # 为启动初始化集群配置       - ETCD_INITIAL_CLUSTER_STATE=new                      # 初始化集群状态     volumes:       - etcd1_data:/bitnami/etcd                            # 挂载的数据卷    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 
[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]#  

查看节点启动情况

[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 

查看挂载的数据卷

[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": ""     } ]  

从etcd1写一个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读一个value

[wxf@centos8 ~]$ docker exec -it etcd2 bash I have no name!@bf989f9512b5:/opt/bitnami/etcd$ etcdctl get name name i am wxf 

搭建成功!

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