1. 首页
  2. 技术知识

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

目录

  • 编写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:%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

到此这篇关于docker-compose部署etcd集群的实现步骤的文章就介绍到这了,更多相关docker-compose部署etcd集群内容请搜索共生网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持共生网络!

原创文章,作者:starterknow,如若转载,请注明出处:https://www.starterknow.com/105258.html

联系我们