免费资源网 – https://freexyz.cn/
目录编写docker-compose.yml
运行docker-compose
检查搭建状态
测试节点
Golang 与 etcd 简单交互
编写docker-compose.yml
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运行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]#检查搭建状态
查看节点启动情况
[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搭建成功!
Golang 与 etcd 简单交互
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:%vn”, 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:%sn”, 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:%vn”, 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:%vn”, err) return } for _, ev := range resp.Kvs { fmt.Printf(“Type: %s Key:%s Value:%sn”, “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:%vn”, 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:%vn”, 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 aabbccddI 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
免费资源网 – https://freexyz.cn/
© 版权声明
THE END
暂无评论内容