docker安装etcd:docker离线安装etcd、docker在线安装etcd、etcd镜像下载、etcd配置详解、etcd常用命令、安装常见问题总结

news/2025/2/26 17:34:16

官方网站

官方网址:etcd

二进制包下载:Install | etcd

GitHub社区项目:etcd-io · GitHub

GitHub社区项目版本历史:Releases · etcd-io/etcd · GitHub

一、镜像下载

1、在线下载

在一台能连外网的linux上执行docker镜像拉取命令

docker pull etcd:3.5.18

2、离线包下载

两种方式:

方式一:

-)在一台能连外网的linux上安装docker执行第一步的命令下载镜像

-)导出

# 导出镜像到本地当前目录
docker save -o bitnami_etcd_3_5_18.tar etcd:3.5.18

方式二:

-)Window桌面程序:Docker Desktop

-)下载镜像

-)安装镜像导出插件(说明过程就复用了之前mysql的图)

-)将镜像文件保存到window本地(图略)

3、Community Edition | Docs

Install Etcd on Linux | Docs

官方的下载地址,k8s环境用不上,因为官方没有发布镜像(自行打镜像的除外)

二、安装

1、在线安装

见离线安装(只比离线安装少一步导入动作)

2、离线安装

-)导入镜像

docker load -i bitnami_etcd_3_5_18.tar

-)查看镜像

[docker@GZ***-PM153160 ~]$ docker images
REPOSITORY                                       TAG             IMAGE ID       CREATED         SIZE
bitnami/etcd                                     3.5.18          bdc73d3efea1   4 days ago      190MB

-)创建映射目录

创建redis配置文件目录、数据文件目录,并修改目录权限

sudo mkdir -p /opt/etcd/docker-etcd/conf
sudo mkdir -p /data1/etcd/docker-etcd/data
sudo mkdir -p /data1/etcd/docker-etcd/log
sudo chown -R docker.docker /opt/etcd
# 作者data1目录下全是docker用户程序数据,所以没有指定子目录
sudo chown -R docker.docker /data1
# sudo chown -R docker.docker /data1/etcd

-)启动容器

docker run -d \
  --name my-etcd-server5 \
  -v /data1/etcd-data:/data \
  -e "ETCD_ROOT_PASSWORD=iam***#T123" \
  -p 2379:2379 \
  -p 2380:2380 \
  -d bdc73d3efea1

这个命令做了以下几件事:

  • --name my-etcd-server5:给容器命名为my-etcd-server5

  • -d:让容器在后台运行。

  • -p 6380:6379:将容器6379端口映射到宿主机的6380端口,这是Redis的服务端口。

  • -v 映射数据文件目录和日志文件目录,左边的是外部目录,右边的是容器目录

  •  -e "ETCD_ROOT_PASSWORD=iam***#T123"  环境变量指定密码

-)查看容器

[docker@GZ***-PM153160 ~]$ docker ps 
CONTAINER ID   IMAGE                                     COMMAND                  CREATED          STATUS          PORTS                                                                                                                                             NAMES
bc7bbe2026b6   bdc73d3efea1                              "/opt/bitnami/script…"   10 minutes ago   Up 10 minutes   0.0.0.0:12379->2379/tcp, [::]:12379->2379/tcp, 0.0.0.0:12380->2380/tcp, [::]:12380->2380/tcp                                                      ctc-etcd-server5

-)从容器内部拷贝配置文件

[docker@GZ***-PM153160 ~]$ docker cp db867a1bae9a:/etc/etcd/etcd.conf /opt/etcd/docker-redis/conf/etcd.conf 
Successfully copied 1.54kB to /opt/etcd/docker-etcd/conf/etcd.conf
[docker@GZ***-PM153160 ~]$ 

bitnami版(作者当前版本),一般作者不用这个,可作者写文章时下错了,不过不影响读者参考

[docker@GZ***-PM153160 ~]$ docker cp db867a1bae9a:/opt/bitnami/etcd/conf/etcd.conf /opt/etcd/docker-etcd/conf/etcd.conf 
Successfully copied 1.54kB to /opt/etcd/docker-etcd/conf/etcd.conf
[docker@GZ***-PM153160 ~]$ 

-)调整其他配置(可选)

vi /opt/etcd/docker-etcd/conf/etcd.conf

按需修改后,删除原容器,添加配置文件映射参数后重新创建容器

docker run -d \
  --name my-etcd-server5 \
  -v /data1/etcd-data:/data \
  -e "ETCD_ROOT_PASSWORD=iam***#T123" \
  -p 2379:2379 \
  -p 2380:2380 \
  -d bdc73d3efea1

-)重启容器

[docker@GZ***-PM153160 ~]$ docker restart bc7bbe2026b6
bc7bbe2026b6

三、ETCD配置详解

1、etcd成员相关的配置项

--name 'default'  
  为该成员指定一个易读的名称。

--data-dir '${name}.etcd'  
  数据存储目录的路径。

--wal-dir ''  
  用于存放专用WAL(Write-Ahead Log)的目录路径。

--snapshot-count '100000'  
  触发快照到磁盘的已提交事务数量。

--heartbeat-interval '100'  
  心跳间隔时间(毫秒)。

--election-timeout '1000'  
  选举超时时间(毫秒)。详见调优文档。

--initial-election-tick-advance 'true'  
  是否在启动时加速初始选举计时,从而加快选举速度。

--listen-peer-urls 'http://localhost:2380'  
  用于监听对等节点流量的URL列表。

--listen-client-urls 'http://localhost:2379'  
  用于监听客户端 gRPC 和 HTTP 流量的 URL 列表(当未指定 --listen-client-http-urls 时生效)。

--listen-client-http-urls ''  
  仅用于 HTTP 客户端流量的 URL 列表。启用此标志会将 HTTP 服务从 --listen-client-urls 中移除。

--max-snapshots '5'  
  保留的最大快照文件数量(0表示不限制)。

--max-wals '5'  
  保留的最大WAL文件数量(0表示不限制)。

--quota-backend-bytes '0'  
  当后端大小超过给定配额时触发警报(0表示使用默认低空间配额)。

--backend-bbolt-freelist-type 'map'  
  指定Boltdb后端使用的freelist类型(支持 array 和 map 类型)。

--backend-batch-interval ''  
  提交后端事务前的最大时间间隔。

--backend-batch-limit '0'  
  提交后端事务前的最大操作数。

--max-txn-ops '128'  
  每个事务允许的最大操作数。

--max-request-bytes '1572864'  
  服务器可接受的客户端请求的最大字节数。

--grpc-keepalive-min-time '5s'  
  客户端在发送ping请求前应等待的最短时间间隔。

--grpc-keepalive-interval '2h'  
  服务器向客户端发送ping以检查连接是否存活的频率(0表示禁用)。

--grpc-keepalive-timeout '20s'  
  在关闭无响应连接前的额外等待时间(0表示禁用)。

--socket-reuse-port 'false'  
  启用后允许监听器设置SO_REUSEPORT选项,支持对已使用端口的重新绑定。

--socket-reuse-address 'false'  
  启用后允许监听器设置SO_REUSEADDR选项,支持绑定处于TIME_WAIT状态的地址。

2、Etcd集群引导和发现配置参数

--initial-advertise-peer-urls 'http://localhost:2380'  
  向集群中其他成员宣传的该节点的对等节点URL列表。

--initial-cluster 'default=http://localhost:2380'  
  引导时的初始集群配置。

--initial-cluster-state 'new'  
  初始集群状态('new'表示新集群,'existing'表示已有集群)。

--initial-cluster-token 'etcd-cluster'  
  引导期间用于etcd集群的初始集群令牌。  
  指定该令牌可防止在运行多个集群时出现意外的跨集群交互。

--advertise-client-urls 'http://localhost:2379'  
  向外部公开宣传的该节点的客户端URL列表。  
  这些URL应可供与etcd集群通信的机器访问,etcd客户端库会解析这些URL以连接到集群。

--discovery ''  
  用于集群引导的发现URL。

--discovery-fallback 'proxy'  
  当发现服务失败时的预期行为('exit'或'proxy')。  
  'proxy'仅支持v2 API。

--discovery-proxy ''  
  访问发现服务时使用的HTTP代理。

--discovery-srv ''  
  用于引导集群的DNS SRV域。

--discovery-srv-name ''  
  引导时查询的DNS SRV名称后缀。

--strict-reconfig-check 'true'  
  拒绝可能导致法定人数丧失的重新配置请求。

--pre-vote 'true'  
  启用Raft预投票算法,以防止隔离的节点重新加入集群时引发中断。

--auto-compaction-retention '0'  
  自动压缩的保留时长。0表示禁用自动压缩。

--auto-compaction-mode 'periodic'  
  解释'auto-compaction-retention'的模式,可选'periodic'或'revision'。  
  'periodic'表示基于时间的保留,默认单位为小时(如'5m'表示5分钟)。  
  'revision'表示基于修订号的保留。

--enable-v2 'false'  
  接受etcd V2客户端请求。已被弃用,并将在v3.6中移除。

--v2-deprecation 'not-yet'  
  v2存储的弃用阶段。允许选择更高的兼容模式。支持的值:  
    'not-yet'                // 如果v2存储有有效内容,发出警告(v3.5默认值)。  
    'write-only'             // 不允许自定义v2状态(计划在v3.6中默认启用)。  
    'write-only-drop-data'   // 自定义的v2状态将被删除!  
    'gone'                   // v2存储不再维护(计划在v3.7中成为默认值)。

3、Etcd安全和TLS配置

--cert-file ''  
  客户端服务器TLS证书文件的路径。

--key-file ''  
  客户端服务器TLS密钥文件的路径。

--client-cert-auth 'false'  
  启用客户端证书认证。  
  建议启用客户端证书认证,以防止未经认证的客户端攻击(例如CVE-2023-44487),特别是在将etcd作为公共服务运行时。

--client-crl-file ''  
  客户端证书吊销列表文件的路径。

--client-cert-allowed-hostname ''  
  客户端证书认证允许的TLS主机名。

--trusted-ca-file ''  
  客户端服务器TLS受信任的CA证书文件路径。  
  设置此参数时,无论`--client-cert-auth`的值如何,都会自动启用客户端证书认证。

--auto-tls 'false'  
  使用自动生成的证书进行客户端TLS认证。

--peer-cert-file ''  
  对等节点服务器TLS证书文件的路径。

--peer-key-file ''  
  对等节点服务器TLS密钥文件的路径。

--peer-client-cert-auth 'false'  
  启用对等节点客户端证书认证。  
  建议启用对等节点证书认证,以防止未经认证的伪造对等节点攻击(例如CVE-2023-44487)。

--peer-trusted-ca-file ''  
  对等节点服务器TLS受信任的CA文件路径。

--peer-cert-allowed-cn ''  
  连接到对等端点时,客户端证书所需的CN(通用名称)。

--peer-cert-allowed-hostname ''  
  对等认证中允许的TLS主机名。

--peer-auto-tls 'false'  
  如果未提供`--peer-key-file`和`--peer-cert-file`,则使用自生成证书进行对等TLS认证。

--self-signed-cert-validity '1'  
  自动生成的客户端和对等节点证书的有效期,单位为年,默认值为1。

--peer-crl-file ''  
  对等节点证书吊销列表文件的路径。

--cipher-suites ''  
  支持的TLS密码套件列表,客户端/服务器和对等节点之间使用(空值将由Go自动填充)。

--cors '*'  
  CORS(跨域资源共享)允许的源列表,逗号分隔(空值或`*`表示允许所有源)。

--host-whitelist '*'  
  如果服务器不安全,HTTP客户端请求中可接受的主机名(空值或`*`表示允许所有主机)。

--tls-min-version 'TLS1.2'  
  etcd支持的最低TLS版本。

--tls-max-version ''  
  etcd支持的最高TLS版本(空值将由Go自动填充)。

etcd_208">4、etcd认证相关参数

--auth-token 'simple'  
  指定v3认证的令牌类型及特定选项,特别适用于JWT。格式为"type,var1=val1,var2=val2,..."。  
  可选类型:'simple'或'jwt'。  
  可用变量:  
  - `sign-method`: 指定JWT的签名方法,可选值为 'ES256'、'ES384'、'ES512'、'HS256'、'HS384'、'HS512'、'RS256'、'RS384'、'RS512'、'PS256'、'PS384' 或 'PS512'。  
  - `pub-key`: 指定用于验证JWT的公钥路径。  
  - `priv-key`: 指定用于签署JWT的私钥路径。  
  - `ttl`: 指定JWT令牌的生存时间(TTL)。

--bcrypt-cost 10  
  指定用于哈希认证密码的bcrypt算法的成本/强度。有效值为4到31之间的整数,值越高,计算成本越高,安全性越强。

--auth-token-ttl 300  
  认证令牌的生存时间(TTL),单位为秒。

etcd_227">5、etcd性能监控与指标

--enable-pprof 'false'  
  是否启用通过HTTP服务器提供的运行时性能分析数据。  
  地址为客户端URL加上"/debug/pprof/"。

--metrics 'basic'  
  设置导出指标的详细程度。  
  可选值:  
  - `basic`: 导出基本指标。  
  - `extensive`: 包括服务器端gRPC直方图指标在内的详细指标。

--listen-metrics-urls ''  
  用于监听指标和健康检查端点的URL列表。

etcd_243">6、etcd日志配置

--logger 'zap'  
  当前仅支持使用'Zap'进行结构化日志记录。

--log-outputs 'default'  
  指定日志输出目标。  
  - 可以使用'stdout'或'stderr'来跳过`journald`日志(即使在`systemd`下运行)。  
  - 也可以提供逗号分隔的输出目标列表。

--log-level 'info'  
  配置日志级别。支持的级别包括:  
  - `debug`: 调试信息。  
  - `info`: 普通信息。  
  - `warn`: 警告信息。  
  - `error`: 错误信息。  
  - `panic`: 崩溃信息。  
  - `fatal`: 致命错误信息。

--enable-log-rotation 'false'  
  是否启用日志轮转,仅适用于单个日志输出文件。

--log-rotation-config-json '{"maxsize": 100, "maxage": 0, "maxbackups": 0, "localtime": false, "compress": false}'  
  配置日志轮转(启用时生效)。  
  - `maxsize`: 单个日志文件的最大大小(单位:MB)。  
  - `maxage`: 日志文件的最大保留天数(0表示不限制)。  
  - `maxbackups`: 最大备份数量(0表示不限制)。  
  - `localtime`: 是否使用本地时间。  
  - `compress`: 是否启用gzip压缩。

Etcd 启动重要参数汇总表

分类参数作用备注
节点配置--name设置节点名称,必须唯一。确保集群中节点识别准确。
--data-dir指定数据存储目录。用于持久化存储etcd数据。
集群配置--initial-advertise-peer-urls设置对等节点的广告URL。集群内节点间通信地址。
--listen-peer-urls设置对等节点的监听URL。监听集群内部通信流量。
--listen-client-urls设置客户端访问的监听URL。客户端连接etcd的入口。
--initial-cluster配置初始集群成员列表。启动新集群时必需。
--initial-cluster-state指定集群状态(newexisting)。新建或加入已有集群时使用。
--initial-cluster-token设置集群唯一标识符。防止跨集群的意外交互。
安全配置--cert-file / --key-file设置TLS证书和密钥文件。启用加密通信。
--client-cert-auth启用客户端证书认证。增强安全性,防止未经认证访问。
--trusted-ca-file设置受信任的CA证书路径。验证客户端和对等节点证书。
--peer-client-cert-auth启用对等节点证书认证。提高集群安全性。
--peer-trusted-ca-file设置对等节点的CA证书路径。对等通信的信任链验证。
性能调优--heartbeat-interval设置心跳间隔时间(毫秒)。影响集群同步速度和稳定性。
--election-timeout设置选举超时时间(毫秒)。影响Raft选举速度。
--snapshot-count设置触发快照的事务数。控制快照频率,平衡性能与存储。
--max-txn-ops设置每个事务允许的最大操作数。防止事务过大影响性能。
认证与访问控制--auth-token指定认证令牌类型。支持simplejwt类型。
--auth-token-ttl设置认证令牌的有效时间(秒)。控制令牌过期时间。
日志管理--logger设置日志记录方式。当前仅支持zap
--log-level设置日志级别。支持debuginfowarn等。
--log-outputs设置日志输出目标。可指定stdoutstderr或文件路径。
调试与监控--enable-pprof启用性能分析。通过/debug/pprof/访问性能数据。
--metrics设置导出指标的详细程度。支持basicextensive
说明:

四、常用/基本操作

etcd集群">1. 连接到etcd集群

  • --endpoints:指定要连接的etcd集群的端点地址。可以指定多个,用逗号分隔。
etcdctl --endpoints=127.0.0.1:2379,127.0.0.2:2379 get /
  • --cert-file, --key-file, --ca-file:用于TLS认证的证书文件、密钥文件和CA文件。
etcdctl --endpoints=https://127.0.0.1:2379 --cert-file=cert.pem --key-file=key.pem --ca-file=ca.pem get /

2. 基本操作

  • get:获取一个或多个键的值。
etcdctl get <key> [<range_end>]
  • put:设置或更新一个键值对。
etcdctl put <key> <value>
  • del:删除一个或多个键值对。
etcdctl del <key> [<range_end>]
  • watch:监视一个或多个键的变化。
etcdctl watch <key>

3. 高级操作

  • --prefix:与get、del等命令一起使用,操作以给定前缀开头的所有键。
etcdctl get --prefix /myapp/
  • --limit:限制返回的键值对数量。
etcdctl get --limit=10 /myapp/
  • --rev:指定要获取的特定版本的数据。
etcdctl get --rev=10 /myapp/config
  • --keys-only:只返回键,不返回值。
etcdctl get --keys-only /myapp/
  • --sort-by:按指定的字段排序返回结果(如key、version、create、mod)。
etcdctl get --sort-by=key /myapp/

4. 集群管理

  • member:管理集群成员。

  • list:列出所有集群成员。

etcdctl member list
  • add:添加新成员。
etcdctl member add <member_name>
  • remove:移除成员。
etcdctl member remove <member_id>
  • snapshot:创建etcd数据的快照。
etcdctl snapshot save snapshot.db

5. 其他有用选项

  • --debug:启用调试模式,提供更详细的输出。
etcdctl --debug get /myapp/config
  • --timeout:设置操作的超时时间(秒)。
etcdctl --timeout=5 get /myapp/config
  • --hex:以十六进制格式显示键和值。
etcdctl --hex get /myapp/config

五、遇到的问题总结

1、将镜像推到内网镜像仓库时报错

[zhao****@GZ***-PM153160 ~]$ docker push 10.130.***.106:30089/library/zookeeper:3.9.3
The push refers to repository [10.130.153.***:30089/library/zookeeper]
Get "https://10.130.153.***:30089/v2/": x509: cannot validate certificate for 10.130.153.*** because it doesn't contain any IP SANs

 解决:换成域名

[zhao***@GZ***-PM153160 ~]$ docker login harbor.***.com:30089
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /home/zhaozheng/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded

2、启动报failed to start member

etcdserver: start member f3e5d1ce6bfb3bd6 failed to start member hello on ID f3e5d1ce6bfb3bd6, the member ID is generated from URL and seems conflicting with other members, make sure the URL is unique and this is not a re-start script for removing member
报错问题解释:

这个错误通常发生在尝试以相同的URL重新启动一个已经在集群中的ETCD节点时。当你在集群中已经有了一个具有相同URL的成员时,再次尝试使用相同的URL初始化或启动一个成员会导致冲突。

解决方法:
  • 1、检查现有成员:首先,检查当前集群中的成员是否已经存在具有相同URL的成员。

  • 2、删除冲突的成员:如果存在冲突,你需要从集群中删除该成员。可以使用etcdctl工具来移除成员。例如:

# 首先确保etcdctl指向正确的etcd服务器
export ETCDCTL_API=3
etcdctl --endpoints=http://localhost:2379 member list
etcdctl --endpoints=http://localhost:2379 member remove <member-id>
  • 3、重新启动容器:在删除冲突成员后,重新启动你的ETCD容器。确保使用不同的URL或端口来避免未来的冲突。
docker run -d --name etcd-server \
  -p 2379:2379 -p 2381:2380 \  # 注意端口号的变化以避免冲突
  quay.io/coreos/etcd:latest etcd --name s1 --initial-advertise-peer-urls http://localhost:2381 --listen-peer-urls http://0.0.0.0:2381 --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://localhost:2379 --initial-cluster-token etcd-cluster-1 --initial-cluster s1=http://localhost:2381 --initial-cluster-state new

六、可能会用到的其他命令

-)创建卷

docker volume create etcd_data

-)验证卷

docker volume ls

-)使用卷

docker run --name some-redis -v etcd_data:/data -d etcd:tag

 这种docker卷作者没有用过(实际数据存储位置是docker默认数据目录,默认数据目录可以在docker配置文件中配置修改),有兴趣的可自行尝试~

如果喜欢我的文章,请帮我点赞,谢谢~  


http://www.niftyadmin.cn/n/5868991.html

相关文章

【PGCCC】PostgreSQL 的弊端(第一部分):临时表

PostgreSQL 是世界上最强大的数据库系统之一。我一直对它的强大功能充满热情&#xff0c;尤其是它的现代 SQL 语言功能。 然而&#xff0c;这并不意味着一切都很好。有些地方还是很麻烦。新手用户如果不知道这个问题&#xff0c;可能会遇到麻烦&#xff0c;而且我发现这种情况…

【含文档+PPT+源码】基于微信小程序的农产品自主供销商城系统

项目介绍 本课程演示的是一款基于微信小程序的农产品自主供销商城系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3…

基于RISC-V内核完全自主可控国产化MCU芯片

国科安芯MCU芯片采用开放、灵活的RISC-V指令集架构&#xff0c;RISC-V的开源特性不仅大幅降低研发成本&#xff0c;更赋予芯片设计高度定制化能力。例如&#xff0c;国科安芯的AS32S601抗辐照MCU基于32位RV32IMZicsr指令集&#xff0c;主频达180MHz&#xff0c;内置2MB Flash与…

使用 Containerd 通过 HTTP 协议拉取 Harbor 私有镜像仓库的镜像

在 Kubernetes 1.24及以上版本环境中&#xff0c;docker不再被支持&#xff0c;主要使用Containerd 是常用的容器运行。默认情况下&#xff0c;Containerd 使用 HTTPS 协议与镜像仓库通信。然而&#xff0c;在某些场景下&#xff08;如测试环境或内部网络&#xff09;&#xff…

【TVM教程】为 NVIDIA GPU 自动调度神经网络

Apache TVM 是一个深度的深度学习编译框架&#xff0c;适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →https://tvm.hyper.ai/ 作者&#xff1a;Lianmin Zheng 针对特定设备和工作负载的自动调优对于获得最佳性能至关重要。本文介绍如何使用 auto-sched…

python与C系列语言的差异总结(3)

与其他大部分编程语言不一样&#xff0c;Python使用空白符&#xff08;whitespace&#xff09;和缩进来标识代码块。也就是说&#xff0c;循环体、else条件从句之类的构成&#xff0c;都是由空白符加上冒号(:)来确定的。大部分编程语言都是使用某种大括号来标识代码块的。下面的…

android 新增native binder service 方式(二)

接上篇文章&#xff0c;实现binder service 的第二种方式&#xff0c;这种在系统里面比较常见 先看下整体目录结构&#xff0c;整体差别不大。 一 android.bp 编译aidl 文件 aidl_interface {name: "libserviceaidl",srcs: ["aidl/com/test/IService.aidl&qu…

Imagination通过最新的D系列GPU IP将效率提升至新高度

Imagination DXTP GPU IP在加速移动设备和其他电力受限设备上的图形和计算工作负载时&#xff0c;能够延长电池续航时间。 英国伦敦 – 2025年2月25日 – 今日&#xff0c;Imagination Technologies&#xff08;“Imagination”&#xff09;宣布推出其最新的GPU IP——Imagina…