一. 环境准备

  1. root@VM-12-11-ubuntu:~# cat /etc/lsb-release 
    # DISTRIB_ID=Ubuntu
    # DISTRIB_RELEASE=24.04
    # DISTRIB_CODENAME=noble
    # DISTRIB_DESCRIPTION="Ubuntu 24.04 LTS"
  2. 安装 docker-ce 以及 docker-compose, 参考此文Ubuntu 24.04 LTS 部署 docker 过程记录-CSDN博客
  3. 拉取官方 etcd 镜像:
docker pull quay.io/coreos/etcd:v3.5.16

二. 单机部署 etcd 集群 (3 节点)

        以下两个方法均可。

方法一:

# 创建网络
docker network create etcd-net

# 启动 etcd0
docker run -d --name etcd0 --net etcd-net \
  -p 2379:2379 -p 2380:2380 \
  quay.io/coreos/etcd:v3.5.16 \
  etcd --name etcd0 \
  --initial-advertise-peer-urls http://etcd0:2380 \
  --listen-peer-urls http://0.0.0.0:2380 \
  --listen-client-urls http://0.0.0.0:2379 \
  --advertise-client-urls http://etcd0:2379 \
  --initial-cluster-token etcd-cluster-1 \
  --initial-cluster etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380 \
  --initial-cluster-state new

# 启动 etcd1
docker run -d --name etcd1 --net etcd-net \
  quay.io/coreos/etcd:v3.5.16 \
  etcd --name etcd1 \
  --initial-advertise-peer-urls http://etcd1:2380 \
  --listen-peer-urls http://0.0.0.0:2380 \
  --listen-client-urls http://0.0.0.0:2379 \
  --advertise-client-urls http://etcd1:2379 \
  --initial-cluster-token etcd-cluster-1 \
  --initial-cluster etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380 \
  --initial-cluster-state new

# 启动 etcd2
docker run -d --name etcd2 --net etcd-net \
  quay.io/coreos/etcd:v3.5.16 \
  etcd --name etcd2 \
  --initial-advertise-peer-urls http://etcd2:2380 \
  --listen-peer-urls http://0.0.0.0:2380 \
  --listen-client-urls http://0.0.0.0:2379 \
  --advertise-client-urls http://etcd2:2379 \
  --initial-cluster-token etcd-cluster-1 \
  --initial-cluster etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380 \
  --initial-cluster-state new

        此方法可以不需安装 docker-compose。

方法二:

docker-compose.yml

version: '3'
services:
  etcd0:
    image: quay.io/coreos/etcd:v3.5.16
    container_name: etcd0
    command: >
      etcd --name etcd0
      --initial-advertise-peer-urls http://etcd0:2380
      --listen-peer-urls http://0.0.0.0:2380
      --listen-client-urls http://0.0.0.0:2379
      --advertise-client-urls http://etcd0:2379
      --initial-cluster-token etcd-cluster-1
      --initial-cluster etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
      --initial-cluster-state new
    networks:
      - etcd-net
    ports:
      - "2379:2379"
      - "2380:2380"

  etcd1:
    image: quay.io/coreos/etcd:v3.5.16
    container_name: etcd1
    command: >
      etcd --name etcd1
      --initial-advertise-peer-urls http://etcd1:2380
      --listen-peer-urls http://0.0.0.0:2380
      --listen-client-urls http://0.0.0.0:2379
      --advertise-client-urls http://etcd1:2379
      --initial-cluster-token etcd-cluster-1
      --initial-cluster etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
      --initial-cluster-state new
    networks:
      - etcd-net

  etcd2:
    image: quay.io/coreos/etcd:v3.5.16
    container_name: etcd2
    command: >
      etcd --name etcd2
      --initial-advertise-peer-urls http://etcd2:2380
      --listen-peer-urls http://0.0.0.0:2380
      --listen-client-urls http://0.0.0.0:2379
      --advertise-client-urls http://etcd2:2379
      --initial-cluster-token etcd-cluster-1
      --initial-cluster etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
      --initial-cluster-state new
    networks:
      - etcd-net

networks:
  etcd-net:
    driver: bridge

        启动

docker-compose up -d

三. 验证集群角色

docker exec -it etcd0 etcdctl --endpoints=http://etcd0:2379,http://etcd1:2379,http://etcd2:2379 endpoint status --write-out=table

四. 功能验证(写入/读取)

# 写入
docker exec -it etcd0 etcdctl \
  --endpoints=http://etcd0:2379,http://etcd1:2379,http://etcd2:2379 \
  put foo bar

# 读取
docker exec -it etcd1 etcdctl \
  --endpoints=http://etcd0:2379,http://etcd1:2379,http://etcd2:2379 \
  get foo

五. 涉及到的其他内容

  • 使用 docker info 查看 Registry/Mirror
docker info | grep "Registry" -C 3

  • 如何查看 etcd-net 是否创建成功
docker network ls

  • 进入容器内执行网络命令

···官方的 quay.io/coreos/etcd 镜像是一个极简容器镜像,没有安装 bash

#进入 容器内命令行界面
docker run -it --rm --net=container:00df7fd11ea1 busybox sh
  • docker run
    启动一个新的容器。

  • -it

    • -i(interactive)保持 STDIN 打开,允许交互。

    • -t(tty)分配一个伪终端。
      → 两个结合起来,就是我们常见的 交互式 shell 终端

  • --rm
    退出时自动删除这个容器(不留垃圾)。

  • --net=container:00df7fd11ea1
    关键点 ⚡
    这表示新建的 busybox 容器不会用自己的网络栈,而是 直接加入到 ID 为 00df7fd11ea1 的容器的网络命名空间
    所以新容器和 etcd 容器 共享同一个网络(IP、端口、路由、接口都一样)。

    • 举个例子:在 busybox 容器里执行 ip addr,看到的就是 etcd 容器的 IP。

  • busybox
    使用的镜像,这个镜像很小(只有几 MB),带有一个极简的 Linux 工具集。

  • sh
    容器启动后执行的命令。这里是调用 busybox 自带的 /bin/sh,进入交互式 shell

  • 只执行命令,不进入交互式 shell
docker exec -it 00df7fd11ea1 etcd --version
docker exec -it 00df7fd11ea1 etcdctl member list
docker exec -it 00df7fd11ea1 etcdctl endpoint health

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐