# Docker-多节点Etcd部署

### 1. 环境说明

| 节点    | IP           |
| ----- | ------------ |
| etcd1 | 10.10.239.31 |
| etcd2 | 10.10.239.32 |
| etcd3 | 10.10.239.33 |

### 2. 部署

#### etcd1

ymal文件

```yaml
version: "3.0"
services:
  etcd:
    image: bitnami/etcd:latest
    container_name: etcd1
    restart: always
    ports:
      - "2379:2379"
      - "2380:2380"
    environment:
      - ALLOW_NONE_AUTHENTICATION=yes #示例中我们不设置密码
      - ETCD_NAME=etcd1 #节点自己的名字
      - ETCD_ADVERTISE_CLIENT_URLS=http://10.10.239.31:2379  #告知集群自己的客户端地址
      - ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 #设置监听客户端通讯的URL列表
      - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://10.10.239.31:2380 #告知集群自己集群通讯地址
      - ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380 #用于监听伙伴通讯的URL列表
      - ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster #etcd 集群的初始化集群记号
      - ETCD_INITIAL_CLUSTER=etcd1=http://10.10.239.31:2380,etcd2=http://10.10.239.32:2380,etcd3=http://10.10.239.33:2380 #集群成员
      - ETCD_INITIAL_CLUSTER_STATE=new #初始化集群状态
    volumes:
      - ./data:/bitnami/etc
```

持久化

如果此时启动，会在当前目录下创建 ./data 目录，挂载到容器的 /bitnami/etcd ，但我们要注意的是，容器中启动etcd的用户并不是root用户，很可能没有在目录下创建文件的权限。我们有两个方案：

【方法一】给777权限（不建议）

【方法二】所属主改成对应宿主机用户（建议）

方法二操作：

* 先给./data目录777权限
* 查看新生成的文件属主是宿主机哪个用户，就将./data目录属主改为哪个用户
* 再将权限改回755或750，重启容器

启动服务

```bash
[root@centos-01 etcd1]# docker-compose up -d
```

查看结果

```bash
[root@centos-01 etcd1]# docker-compose ps
Name               Command               State                       Ports
-----------------------------------------------------------------------------------------------
etcd1   /opt/bitnami/scripts/etcd/ ...   Up      0.0.0.0:2379->2379/tcp, 0.0.0.0:2380->2380/tcp
```

### etcd2

ymal文件

```yaml
version: "3.0"
services:
  etcd:
    image: bitnami/etcd:latest
    container_name: etcd2
    restart: always
    ports:
      - "2379:2379"
      - "2380:2380"
    environment:
      - ALLOW_NONE_AUTHENTICATION=yes
      - ETCD_NAME=etcd2
      - ETCD_ADVERTISE_CLIENT_URLS=http://10.10.239.32:2379
      - ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
      - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://10.10.239.32:2380
      - ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
      - ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
      - ETCD_INITIAL_CLUSTER=etcd1=http://10.10.239.31:2380,etcd2=http://10.10.239.32:2380,etcd3=http://10.10.239.33:2380
      - ETCD_INITIAL_CLUSTER_STATE=new
    volumes:
      - ./data:/bitnami/etcd
```

持久化（同上）

#### etcd3

启动动服务（同上）

yaml文件

```bash
version: "3.0"
services:
  etcd:
    image: bitnami/etcd:latest
    container_name: etcd3
    restart: always
    ports:
      - "2379:2379"
      - "2380:2380"
    environment:
      - ALLOW_NONE_AUTHENTICATION=yes
      - ETCD_NAME=etcd3
      - ETCD_ADVERTISE_CLIENT_URLS=http://10.10.239.33:2379
      - ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
      - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://10.10.239.33:2380
      - ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
      - ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
      - ETCD_INITIAL_CLUSTER=etcd1=http://10.10.239.31:2380,etcd2=http://10.10.239.32:2380,etcd3=http://10.10.239.33:2380
      - ETCD_INITIAL_CLUSTER_STATE=new
    volumes:
      - ./data:/bitnami/etcd
```

持久化（同上）

启动服务（同上）

### 3. 验证

#### 3.1 查看集群状态

查看集群成员

```bash
I have no name!@555187fb758c:/opt/bitnami/etcd$ etcdctl --write-out=table  member list
+------------------+---------+-------+--------------------------+--------------------------+------------+
|        ID        | STATUS  | NAME  |        PEER ADDRS        |       CLIENT ADDRS       | IS LEARNER |
+------------------+---------+-------+--------------------------+--------------------------+------------+
| 57d6f74aaa8d5d3e | started | etcd1 | http://10.10.239.31:2380 | http://10.10.239.31:2379 |      false |
| 9107e491ab549324 | started | etcd3 | http://10.10.239.33:2380 | http://10.10.239.33:2379 |      false |
| e7b147006e212ca5 | started | etcd2 | http://10.10.239.32:2380 | http://10.10.239.32:2379 |      false |
+------------------+---------+-------+--------------------------+--------------------------+------------+

```

查看本节点状态

```bash
I have no name!@555187fb758c:/opt/bitnami/etcd$ etcdctl --write-out=table  member list
+------------------+---------+-------+--------------------------+--------------------------+------------+
|        ID        | STATUS  | NAME  |        PEER ADDRS        |       CLIENT ADDRS       | IS LEARNER |
+------------------+---------+-------+--------------------------+--------------------------+------------+
| 57d6f74aaa8d5d3e | started | etcd1 | http://10.10.239.31:2380 | http://10.10.239.31:2379 |      false |
| 9107e491ab549324 | started | etcd3 | http://10.10.239.33:2380 | http://10.10.239.33:2379 |      false |
| e7b147006e212ca5 | started | etcd2 | http://10.10.239.32:2380 | http://10.10.239.32:2379 |      false |
+------------------+---------+-------+--------------------------+--------------------------+------------+

```

查看本节点健康状态

\`\`\``I have no` `name!@555187fb758c:/opt/bitnami/etcd$ etcdctl --write-out=table  endpoint health+----------------+--------+------------+-------+|    ENDPOINT    | HEALTH |    TOOK    | ERROR |+----------------+--------+------------+-------+| 127.0.0.1:2379 |   true` `| 3.736825ms |       |+----------------+--------+------------+-------`

### 3.2 读写测试

登录其中一个节点，进入容器，写一条数据\
zai

```bash
[root@centos-01 etcd3]# docker exec -it etcd1 bash
I have no name!@788dd01aaa79:/opt/bitnami/etcd$ etcdctl put name "kkk"
OK
```

登录另一个节点，进入容器，读取数据

```bash
[root@centos-01 etcd3]# docker exec -it etcd3 bash
I have no name!@788dd01aaa79:/opt/bitnami/etcd$ etcdctl get name
name
kkk
```

|   |   |
| - | - |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://close.gitbook.io/yun-wei-bi-ji/kubernetes/etcd/docker-duo-jie-dian-etcd-bu-shu.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
