docker 搭建etcd集群/单机

文章目录

  • 前言
  • 目录结构
  • docker-compose.yml 如下
  • golang测试代码

前言

  1. 基于docker环境和docker-compose
  2. 当前etcd 3.3.8

目录结构

docker 搭建etcd集群/单机_第1张图片

etcd1,2,3 组成集群
etcd0 单机

deltaprojects/etcdkeeper etcd可视化管理工具
docker 搭建etcd集群/单机_第2张图片

docker-compose.yml 如下

# cd etcd/ 
docker compose up .
version: '3.8'
networks:
  etcd_net:
    name: etcd_net

services:
  etcd0:
    image: quay.io/coreos/etcd
    container_name: etcd0
    command: etcd -name etcd0 -advertise-client-urls http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380
    ports:
      - 2379:2379
      - 2479:2380
    volumes:
      - ./etcd0/data:/etcd-data
    networks:
      - etcd_net

  etcd1:
    image: quay.io/coreos/etcd
    container_name: etcd1
    command: etcd -name etcd1 -advertise-client-urls http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380 -initial-cluster-token etcd-cluster -initial-cluster "etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380" -initial-cluster-state new
    ports:
      - 2380:2379
      - 2480:2380
    volumes:
      - ./etcd1/data:/etcd-data
    networks:
      - etcd_net

  etcd2:
    image: quay.io/coreos/etcd
    container_name: etcd2
    command: etcd -name etcd2 -advertise-client-urls http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380 -initial-cluster-token etcd-cluster -initial-cluster "etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380" -initial-cluster-state new
    ports:
      - 2381:2379
      - 2481:2380
    volumes:
      - ./etcd2/data:/etcd-data
    networks:
      - etcd_net

  etcd3:
    image: quay.io/coreos/etcd
    container_name: etcd3
    command: etcd -name etcd3 -advertise-client-urls http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380 -initial-cluster-token etcd-cluster -initial-cluster "etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380" -initial-cluster-state new
    ports:
      - 2382:2379
      - 2482:2380
    volumes:
      - ./etcd3/data:/etcd-data
    networks:
      - etcd_net

  etcdkeeper:
    image: deltaprojects/etcdkeeper
    container_name: etcdkeeper
    ports:
      - 8088:8080
    links:
      - etcd0
      - etcd1
      - etcd2
      - etcd3
    networks:
      - etcd_net

golang测试代码

package main

import (
	"context"
	"fmt"
	"go.etcd.io/etcd/client/v3"
	"time"
)

func main() {
	cli := InitEtcd([]string{"http://127.0.0.1:2482", "http://127.0.0.1:2480", "http://127.0.0.1:2481"})
	defer cli.Close()

	ctx0, _ := context.WithTimeout(context.Background(), time.Second*10)
	go Watch(cli, ctx0, "/node")
	time.Sleep(time.Second)

	ctx, _ := context.WithTimeout(context.Background(), time.Second*5)
	err := Put(cli, ctx, "/node", "1")
	if err != nil {
		panic(err)
	}
	ctx, _ = context.WithTimeout(context.Background(), time.Second*5)
	err = Read(cli, ctx, "/node")
	if err != nil {
		panic(err)
	}
	ctx, _ = context.WithTimeout(context.Background(), time.Second*5)
	err = Put(cli, ctx, "/node", "2")
	if err != nil {
		panic(err)
	}
	ctx, _ = context.WithTimeout(context.Background(), time.Second*5)
	err = Read(cli, ctx, "/node")
	if err != nil {
		panic(err)
	}
	ctx, _ = context.WithTimeout(context.Background(), time.Second*5)
	err = Delete(cli, ctx, "/node")
	if err != nil {
		panic(err)
	}
	select {
	case <-ctx0.Done():
	}
}

func InitEtcd(addr []string) *clientv3.Client {
	cli, err := clientv3.New(clientv3.Config{
		Endpoints:   addr,
		DialTimeout: 5 * time.Second,
	})
	if err != nil {
		panic(fmt.Sprintf("connect to etcd failed, err:%v\n", err))
	}
	fmt.Println("connect to etcd success")
	return cli
}

func Watch(cli *clientv3.Client, ctx context.Context, key string) {
	rch := cli.Watch(ctx, key, clientv3.WithPrefix()) // 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)
		}
	}
}

func Put(cli *clientv3.Client, ctx context.Context, key string, value string) error {
	defer ctx.Done()
	_, err := cli.Put(ctx, key, value)
	return err
}

func Read(cli *clientv3.Client, ctx context.Context, key string) error {
	defer ctx.Done()
	resp, err := cli.Get(ctx, key)
	if err != nil {
		return err
	}
	for _, ev := range resp.Kvs {
		fmt.Printf("Type: %s Key:%s Value:%s\n", "READ~~~~", ev.Key, ev.Value)
	}
	return nil
}

func Delete(cli *clientv3.Client, ctx context.Context, key string) error {
	defer ctx.Done()
	_, err := cli.Delete(ctx, key)
	return err
}


/*
GOROOT=/Users/zyj/go/go1.16 #gosetup
GOPATH=/Users/zyj/go #gosetup
/Users/zyj/go/go1.16/bin/go build -o /private/var/folders/18/c2k36qyx3hl6d3dg8ccs876r0000gn/T/___go_build_lib_demo_etcd lib_demo/etcd #gosetup
/private/var/folders/18/c2k36qyx3hl6d3dg8ccs876r0000gn/T/___go_build_lib_demo_etcd #gosetup
connect to etcd success
Type: PUT Key:/node Value:1
Type: READ~~~~ Key:/node Value:1
Type: PUT Key:/node Value:2
Type: READ~~~~ Key:/node Value:2
Type: DELETE Key:/node Value:

Process finished with exit code 0
*/

你可能感兴趣的:(docker,#,docker,compose,#,etcd,docker,etcd,容器)