准备工作
- 安装好 docker 与 docker-compose
- 下载etcd镜像:docker pull bitnami/etcd:latest
- 最好关闭防火墙。如果遇到外部主机能ping通linux,但是不能访问docker容器的情况,需要开启防火墙,然后再关掉防火墙,最后重启docker即可。
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.yml如何使用
- 随便创建一个文件夹,并进入,例如:mkdir etcd & cd etcd
- vim docker-compose.yml,将上面的配置全部拷贝进去
- 在etcd文件夹运行 docker-compose up 或者后台启动 docker-compose up -d
- 停止运行 docker-compose down
检查搭建状态
- docker ps # 查看节点启动情况
- docker volume ls # 查看挂载的数据卷
- docker volume inspect etcd_etcd1_data # 查看指定数据卷的挂载详情
注:没有加internal选项时,自动生成卷名时会加上项目名前缀 - docker exec -it etcd1 bash # 进入节点etcd1
- etcdctl put foo “Hello world” # 设置 foo => “Hello world”
- docker exec -it etcd2 bash # 进入节点etcd2
- etcdctl get foo # 获取key为 foo 所对应的 value,如果能获得且为Hello world,即搭建成功
Golang 与 etcd 简单交互
package main
import (
"context"
"log"
"time"
"go.etcd.io/etcd/client/v3"
)
func main() {
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{"http://192.168.1.147:20000", "http://192.168.1.147:20002", "http://192.168.1.147:20004"},
DialTimeout: 5 * time.Second,
})
if err != nil {
panic(err)
}
defer cli.Close()
testKey := "/test/key"
testValue := "I love docker"
_, err = cli.Put(context.Background(), testKey, testValue)
if err != nil {
log.Fatal("Put failed:", err)
}
res, err := cli.Get(context.Background(), testKey)
if err != nil {
log.Fatal("Get failed:", err)
}
kvs := res.Kvs
val := string(kvs[0].Value)
log.Println("result:", val == testValue)
}