docker-compose部署etcd 集群

简介: docker-compose部署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


目录
相关文章
|
18天前
|
网络安全 Docker 容器
|
5天前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
10天前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
48 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
13天前
|
消息中间件 Linux RocketMQ
在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
通过以上步骤,你可以在Red Hat Enterprise Linux 9上使用Docker快速安装并部署RocketMQ。这种方法不仅简化了安装过程,还提供了一个灵活的环境来管理和扩展消息队列系统。RocketMQ作为一款高性能的分布式消息系统,通过Docker可以实现快速部署和高效管理。
35 2
|
14天前
|
消息中间件 Linux RocketMQ
在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
通过以上步骤,你可以在Red Hat Enterprise Linux 9上使用Docker快速安装并部署RocketMQ。这种方法不仅简化了安装过程,还提供了一个灵活的环境来管理和扩展消息队列系统。RocketMQ作为一款高性能的分布式消息系统,通过Docker可以实现快速部署和高效管理。
24 3
|
16天前
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
153 2
|
17天前
|
弹性计算 数据库连接 Nacos
阿里云ECS服务器在docker中部署nacos
docker pull nacos 失败,docker部署nacos遇到的问题,nacos数据库连接,nacos端口映射
76 1
|
3月前
|
运维 Java Devops
阿里云云效操作报错合集之部署docker时遇到报错,该怎么办
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
运维 Kubernetes 前端开发
【云原生】阿里云服务器部署 Docker Swarm集群
阿里云服务器 一键部署 Docker Swarm 集群!
670 0
【云原生】阿里云服务器部署 Docker Swarm集群
|
弹性计算 数据可视化 关系型数据库
使用阿里云部署基于docker的mysql云服务
本篇文章将介绍如何使用阿里云安装docker、部署mysql服务,并远程连接至远端mysql
680 1
使用阿里云部署基于docker的mysql云服务
下一篇
无影云桌面