write
version: "3.0" networks: etcd-net: # network driver: bridge # Bridge mode volumes: etcd1_data: # The data volume name mounted to the local driver: local etcd2_data: driver: local etcd3_data: driver: local ### ### etcd Other environment configurations are shown in: /etcd/index/index-1/configuration### services: etcd1: image: bitnami/etcd:latest # Mirror container_name: etcd1 # Container name --name restart: always # Always restart networks: - etcd-net # The network used --network ports: # Port Mapping -p - "20000:2379" - "20001:2380" environment: # Environment variable --env - ALLOW_NONE_AUTHENTICATION=yes # Allow login without password - ETCD_NAME=etcd1 # etcd's name - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd1:2380 # List this member's partner URL to advertise to other members of the cluster - ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380 # List of URLs used to listen to partner communications - ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 # List of URLs used to listen to client communications - ETCD_ADVERTISE_CLIENT_URLS=http://etcd1:2379 # List the client URL of this member and announce it to other members in the cluster - ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster # Initialized cluster notation for etcd clusters during startup - ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380 # Configure initialization cluster for startup - ETCD_INITIAL_CLUSTER_STATE=new # Initialize cluster status volumes: - etcd1_data:/bitnami/etcd # Mounted data volume 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
Run docker-compose
[root@centos8 etcdtest]# tree . └── 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]#
Check the build status
Check the node startup status
[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
View mounted data volumes
[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": "" } ]
Test node
Write a key from etcd1
[root@centos8 etcdtest]# docker exec -it etcd1 bash I have no name!@5454f5a719a2:/opt/bitnami/etcd$ etcdctl put name "i am wxf" OK
Read a value from etcd2
[wxf@centos8 ~]$ docker exec -it etcd2 bash I have no name!@bf989f9512b5:/opt/bitnami/etcd$ etcdctl get name name i am wxf
Build successfully!
Golang interacts with etcd simply
package main import ( "context" "fmt" "/etcd/client/v3" "time" ) func main() { cli, err := ({ Endpoints: []string{"http://192.168.135.10:20000", "http://192.168.135.10:20002", "http://192.168.135.10:20004"}, DialTimeout: 5 * , }) if err != nil { ("connect to etcd failed, err:%v\n", err) return } defer () ("connect to etcd success") defer () go Watch(cli) Create(cli) Read(cli) Delete(cli) Update(cli) select {} } func Watch(cli *) { rch := ((), "name") // type WatchChan <-chan WatchResponse for wresp := range rch { for _, ev := range { ("Type: %s Key:%s Value:%s\n", , , ) } } ("out") } func Create(cli *) { // put ctx, cancel := ((), *5) _, err := (ctx, "name", "wxf") cancel() if err != nil { ("put to etcd failed, err:%v\n", err) return } } func Read(cli *) { //get ctx, cancel := ((), *5) resp, err := (ctx, "name") cancel() if err != nil { ("get from etcd failed, err:%v\n", err) return } for _, ev := range { ("Type: %s Key:%s Value:%s\n", "READ", , ) } } func Update(cli *) { // put ctx, cancel := ((), *5) _, err := (ctx, "name", "xyy") cancel() if err != nil { ("put to etcd failed, err:%v\n", err) return } } func Delete(cli *) { //del ctx, cancel := ((), *5) _, err := (ctx, "name") cancel() if err != nil { ("delete from etcd failed, err:%v\n", err) return } }
go run
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
This is the article about the implementation steps of docker-compose deployment of etcd cluster. For more related content on docker-compose deployment of etcd cluster, please search for my previous articles or continue browsing the following related articles. I hope everyone will support me in the future!