分享

docker-compose部署etcd集群的实现步骤

 新用户5326WQsZ 2021-11-21
目录

· 编写docker-compose.yml

· 运行docker-compose

· 检查搭建状态

· 测试节点

· Golang 与 etcd 简单交互

编写docker-compose.yml

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

version: "3.0"

networks:

  etcd-net:           # 网络

    driver: bridge    # 桥接模式

volumes:

  etcd1_data:         # 挂载到本地的数据卷名

    driver: local

  etcd2_data:

    driver: local

  etcd3_data:

    driver: local

###

### etcd 其他环境配置见:https://doczhcn./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

1

2

3

4

5

6

7

8

9

10

11

12

[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]#

检查搭建状态

查看节点启动情况

1

2

3

4

5

[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

查看挂载的数据卷

1

2

3

4

5

[root@centos8 etcdtest]# docker volume ls

DRIVER    VOLUME NAME

local     etcdtest_etcd1_data

local     etcdtest_etcd2_data

local     etcdtest_etcd3_data

1

2

3

4

5

6

7

8

9

10

11

12

13

14

[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

1

2

3

[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

1

2

3

4

[wxf@centos8 ~]$ docker exec -it etcd2 bash

I have no name!@bf989f9512b5:/opt/bitnami/etcd$ etcdctl get name

name

i am wxf

搭建成功!

Golang 与 etcd 简单交互

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多