陆必秋 發表於 2025-12-5 14:14:27

docker部署etcd实践过程

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">第 1 步:创建网络</a></li><li><a href="#_label1">第 2 步:启动 Etcd 服务器实例</a></li><li><a href="#_label2">第 3 步:启动您的 Etcd 客户端实例</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_0">查询</a></li><li><a href="#_lab2_2_1">etcd存取</a></li></ul><li><a href="#_label3">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>第 1 步:创建网络</h2>
<div class="jb51code"><pre class="brush:bash;"> docker network create app-tier --driver bridge
</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>第 2 步:启动 Etcd 服务器实例</h2>
<p>使用命令的&ndash;network app-tier参数docker run将 Etcd 容器附加到app-tier网络</p>
<div class="jb51code"><pre class="brush:bash;"> docker run -d --name Etcd-server \
    --network app-tier \
    --publish 2379:2379 \
    --publish 2380:2380 \
    --env ALLOW_NONE_AUTHENTICATION=yes \
    --env ETCD_ADVERTISE_CLIENT_URLS=http://etcd-server:2379 \
    bitnami/etcd:latest
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>第 3 步:启动您的 Etcd 客户端实例</h2>
<div class="jb51code"><pre class="brush:bash;">docker run -it --rm \
    --network app-tier \
    --env ALLOW_NONE_AUTHENTICATION=yes \
    bitnami/etcd:latest etcdctl --endpoints http://etcd-server:2379 put /message Hello
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120510573410.png" /></p>
<div class="jb51code"><pre class="brush:bash;">docker run -it --rm --network app-tier --env ALLOW_NONE_AUTHENTICATION=yes   bitnami/etcd:latest etcdctl --endpoints http://etcd-server:2379 get/message Hello</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120510573456.png" /></p>
<p class="maodian"><a name="_lab2_2_0"></a></p><h3>查询</h3>
<div class="jb51code"><pre class="brush:bash;">package main

import (
        "context"
        "fmt"
        "time"

        "github.com/coreos/etcd/clientv3"
)

func main() {
        /*
           DialTimeout time.Duration `json:"dial-timeout"`
           Endpoints []string `json:"endpoints"`
        */
        cli, err := clientv3.New(clientv3.Config{
                Endpoints:   []string{"192.168.8.111:2379"},
                DialTimeout: 5 * time.Second,
        })
        if err != nil {
                fmt.Println("connect failed, err:", err)
                return
        }

        fmt.Println("连接成功")
        defer cli.Close()
        //---------------------------------

        //设置1秒超时,访问etcd有超时控制
        ctx, cancel := context.WithTimeout(context.Background(), time.Second)
        cancel()
       
        //取值,设置超时为1秒
        ctx, cancel = context.WithTimeout(context.Background(), time.Second)
        resp, err := cli.Get(ctx, "/message")
        cancel()
        if err != nil {
                fmt.Println("get failed, err:", err)
                return
        }
        for _, ev := range resp.Kvs {
                fmt.Printf("%s : %s\n", ev.Key, ev.Value)
        }
}

</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120510573476.png" /></p>
<p class="maodian"><a name="_lab2_2_1"></a></p><h3>etcd存取</h3>
<div class="jb51code"><pre class="brush:bash;">package main

import (
    "context"
    "fmt"
    "github.com/coreos/etcd/clientv3"
    "time"
)

func main() {

    cli, err := clientv3.New(clientv3.Config{
      Endpoints:   []string{"localhost:2379", "localhost:22379", "localhost:32379"},
      DialTimeout: 5 * time.Second,
    })
    if err != nil {
      fmt.Println("connect failed, err:", err)
      return
    }

    fmt.Println("连接成功")
    defer cli.Close()
    //设置1秒超时,访问etcd有超时控制
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    //操作etcd
    _, err = cli.Put(ctx, "/test/conf/", "sample_value")
    //操作完毕,取消etcd
    cancel()
    if err != nil {
      fmt.Println("put failed, err:", err)
      return
    }
    //取值,设置超时为1秒
    ctx, cancel = context.WithTimeout(context.Background(), time.Second)
    resp, err := cli.Get(ctx, "/test/conf/")
    cancel()
    if err != nil {
      fmt.Println("get failed, err:", err)
      return
    }
    for _, ev := range resp.Kvs {
      fmt.Printf("%s : %s\n", ev.Key, ev.Value)
    }
}
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120510573478.png" /></p>
<p>官网文档:</p>
<div class="jb51code"><pre class="brush:bash;">https://etcd.io/docs/v3.5/dev-guide/interacting_v3/
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>总结</h2>
<p>以上为个人经验,希望能给大家一个参考,也希望大家多多支持琼殿技术社区。</p>
頁: [1]
查看完整版本: docker部署etcd实践过程