SoFunction
Updated on 2025-03-09

Implementation steps for deploying etcd clusters by docker-compose

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!