--- title: 在容器中运行 etcd 集群 weight: 4200 description: 使用静态引导在 Docker 中运行 etcd categories: [任务] upstream_link: "https://github.com/etcd-io/website/blob/824597935df6e95992ef61c07e3222f4f796ca6c/content/en/docs/v3.7/op-guide/container.md" aliases: [/etcd/op-guide/container/] --- 本文指南展示了如何使用 Docker 以 [静态引导过程](/zh/docs/etcd/op-guide/clustering/#static)运行 etcd。 ## Docker {#docker} 为使 Docker 主机外部的客户端能够访问 etcd API,请使用容器的主机 IP 地址。有关获取 IP 地址的详细信息,请参见 [`docker inspect`](https://docs.docker.com/engine/reference/commandline/inspect)。或者,可向 `docker run` 命令指定 `--net=host` 标志,以跳过将容器置于独立网络栈中的操作。 ### 运行单节点 etcd {#running-a-single-node-etcd} 配置 etcd 时,请使用主机 IP 地址: ``` export NODE1=192.168.1.21 ``` 配置 Docker 卷以存储 etcd 数据: ``` docker volume create --name etcd-data export DATA_DIR="etcd-data" ``` 运行最新版本的 etcd(`v3.7.0`,撰写本文时的版本): ``` ETCD_VERSION=v3.7.0 REGISTRY=quay.io/coreos/etcd # available from v3.2.5 REGISTRY=gcr.io/etcd-development/etcd docker run \ -p 2379:2379 \ -p 2380:2380 \ --volume=${DATA_DIR}:/etcd-data \ --name etcd ${REGISTRY}:${ETCD_VERSION} \ /usr/local/bin/etcd \ --data-dir=/etcd-data --name node1 \  --initial-advertise-peer-urls http://${NODE1}:2380 --listen-peer-urls http://0.0.0.0:2380 \  --advertise-client-urls http://${NODE1}:2379 --listen-client-urls http://0.0.0.0:2379 \ --initial-cluster node1=http://${NODE1}:2380 ``` 列出集群成员: ``` etcdctl --endpoints=http://${NODE1}:2379 member list ``` ### 运行一个 3 节点 etcd 集群 {#running-a-3-node-etcd-cluster} ``` REGISTRY=quay.io/coreos/etcd # available from v3.2.5 REGISTRY=gcr.io/etcd-development/etcd # For each machine ETCD_VERSION=v3.7.0 TOKEN=my-etcd-token CLUSTER_STATE=new NAME_1=etcd-node-0 NAME_2=etcd-node-1 NAME_3=etcd-node-2 HOST_1=10.20.30.1 HOST_2=10.20.30.2 HOST_3=10.20.30.3 CLUSTER=${NAME_1}=http://${HOST_1}:2380,${NAME_2}=http://${HOST_2}:2380,${NAME_3}=http://${HOST_3}:2380 DATA_DIR=/var/lib/etcd # For node 1 THIS_NAME=${NAME_1} THIS_IP=${HOST_1} docker run \ -p 2379:2379 \ -p 2380:2380 \ --volume=${DATA_DIR}:/etcd-data \ --name etcd ${REGISTRY}:${ETCD_VERSION} \ /usr/local/bin/etcd \ --data-dir=/etcd-data --name ${THIS_NAME} \  --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://0.0.0.0:2380 \  --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://0.0.0.0:2379 \ --initial-cluster ${CLUSTER} \ --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN} # For node 2 THIS_NAME=${NAME_2} THIS_IP=${HOST_2} docker run \ -p 2379:2379 \ -p 2380:2380 \ --volume=${DATA_DIR}:/etcd-data \ --name etcd ${REGISTRY}:${ETCD_VERSION} \ /usr/local/bin/etcd \ --data-dir=/etcd-data --name ${THIS_NAME} \  --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://0.0.0.0:2380 \  --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://0.0.0.0:2379 \ --initial-cluster ${CLUSTER} \ --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN} # For node 3 THIS_NAME=${NAME_3} THIS_IP=${HOST_3} docker run \ -p 2379:2379 \ -p 2380:2380 \ --volume=${DATA_DIR}:/etcd-data \ --name etcd ${REGISTRY}:${ETCD_VERSION} \ /usr/local/bin/etcd \ --data-dir=/etcd-data --name ${THIS_NAME} \  --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://0.0.0.0:2380 \  --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://0.0.0.0:2379 \ --initial-cluster ${CLUSTER} \ --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN} ``` 使用 API 版本 3 运行 `etcdctl`: ``` docker exec etcd /usr/local/bin/etcdctl put foo bar ``` ## 裸金属 {#bare-metal} 要在裸金属上部署一个由 3 个节点组成的 etcd 集群,可参考 [baremetal 仓库](https://github.com/coreos/coreos-baremetal/tree/master/examples) 中的示例。 ## 挂载证书卷 {#mounting-a-certificate-volume} etcd 发行版容器不包含默认的根证书。如需使用由根证书机构信任的证书(例如用于发现),请将证书目录挂载到 etcd 容器中: ``` ETCD_VERSION=v3.7.0 REGISTRY=quay.io/coreos/etcd # available from v3.2.5 REGISTRY=docker://gcr.io/etcd-development/etcd rkt run \ --insecure-options=image \ --volume etcd-ssl-certs-bundle,kind=host,source=/etc/ssl/certs/ca-certificates.crt \ --mount volume=etcd-ssl-certs-bundle,target=/etc/ssl/certs/ca-certificates.crt \ ${REGISTRY}:${ETCD_VERSION} -- --name my-name \ --initial-advertise-peer-urls http://localhost:2380 --listen-peer-urls http://localhost:2380 \ --advertise-client-urls http://localhost:2379 --listen-client-urls http://localhost:2379 \ --discovery https://discovery.etcd.io/c11fbcdc16972e45253491a24fcf45e1 ``` ``` ETCD_VERSION=v3.7.0 REGISTRY=quay.io/coreos/etcd # available from v3.2.5 REGISTRY=gcr.io/etcd-development/etcd docker run \ -p 2379:2379 \ -p 2380:2380 \ --volume=/etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt \ ${REGISTRY}:${ETCD_VERSION} \ /usr/local/bin/etcd --name my-name \ --initial-advertise-peer-urls http://localhost:2380 --listen-peer-urls http://localhost:2380 \ --advertise-client-urls http://localhost:2379 --listen-client-urls http://localhost:2379 \ --discovery https://discovery.etcd.io/86a9ff6c8cb8b4c4544c1a2f88f8b801 ```