etcd クラスターをデプロイするための docker-compose の実装手順

etcd クラスターをデプロイするための docker-compose の実装手順

docker-compose.ymlを書く

バージョン: "3.0"

ネットワーク:
  etcd-net: # ネットワークドライバー: bridge # ブリッジモードボリューム:
  etcd1_data: # ローカルデータボリューム名にマウント ドライバー: local
  etcd2_データ:
    ドライバー: ローカル
  etcd3_データ:
    ドライバー: ローカル
###
### etcd その他の環境設定については、https://doczhcn.gitbook.io/etcd/index/index-1/configuration を参照してください。
###
サービス:
  etcd1:
    image: bitnami/etcd:latest # イメージ container_name: etcd1 # コンテナ名 --name
    restart: always # 常にネットワークを再起動します:
      - etcd-net # 使用されるネットワーク --network
    ポート: #ポートマッピング -p
      - 「20000:2379」
      - 「20001:2380」
    環境: # 環境変数 --env
      : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
      - etcd1_data:/bitnami/etcd # マウントされたデータボリューム etcd2:
    イメージ: bitnami/etcd:latest
    コンテナ名: etcd2
    再起動: 常に
    ネットワーク:
      - etcd-net
    ポート:
      - 「20002:2379」
      - 「20003:2380」
    環境:
      - ALLOW_NONE_AUTHENTICATION=はい
      -ETCD_NAME=etcd2
      -ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd2:2380
      -ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
      -ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
      -ETCD_ADVERTISE_CLIENT_URLS=http://etcd2:2379
      -ETCD_INITIAL_CLUSTER_TOKEN=etcd クラスター
      - ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380、etcd2=http://etcd2:2380、etcd3=http://etcd3:2380
      -ETCD_INITIAL_CLUSTER_STATE=新規
    ボリューム:
      - etcd2_data:/bitnami/etcd

  etcd3:
    イメージ: bitnami/etcd:latest
    コンテナ名: etcd3
    再起動: 常に
    ネットワーク:
      - etcd-net
    ポート:
      - 「20004:2379」
      - 「20005:2380」
    環境:
      - ALLOW_NONE_AUTHENTICATION=はい
      -ETCD_NAME=etcd3
      - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd3:2380
      -ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
      -ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
      -ETCD_ADVERTISE_CLIENT_URLS=http://etcd3:2379
      -ETCD_INITIAL_CLUSTER_TOKEN=etcd クラスター
      - ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380、etcd2=http://etcd2:2380、etcd3=http://etcd3:2380
      -ETCD_INITIAL_CLUSTER_STATE=新規
    ボリューム:
      - etcd3_data:/bitnami/etcd

docker-composeを実行する

[root@centos8 etcdtest]# ツリー
。
└── docker-compose.yml

ディレクトリ 0 個、ファイル 1 個
[root@centos8 etcdtest]# docker-compose up -d
[+] 4/4 実行中
 ⠿ ネットワーク etcdtest_etcd-net 作成時間 0.1 秒
 ⠿コンテナetcd3が0.6秒で開始されました
 ⠿コンテナetcd1が0.7秒で開始されました
 ⠿コンテナetcd2が0.7秒で開始されました
[root@centos8 etcdtest]# 

ビルドステータスを確認する

ノードの起動ステータスを確認する

[root@centos8 etcdtest]# docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
89469f98491f bitnami/etcd:latest "/opt/bitnami/script..." 54 秒前 53 秒前にアップ 0.0.0.0:20004->2379/tcp、:::20004->2379/tcp、0.0.0.0:20005->2380/tcp、:::20005->2380/tcp etcd3
5454f5a719a2 bitnami/etcd:latest "/opt/bitnami/script..." 54 秒前 53 秒前にアップ 0.0.0.0:20000->2379/tcp、:::20000->2379/tcp、0.0.0.0:20001->2380/tcp、:::20001->2380/tcp etcd1
bf989f9512b5 bitnami/etcd:latest "/opt/bitnami/script…" 54 秒前 53 秒前にアップ 0.0.0.0:20002->2379/tcp、:::20002->2379/tcp、0.0.0.0:20003->2380/tcp、:::20003->2380/tcp etcd2

マウントされたデータボリュームを表示する

[root@centos8 etcdtest]# docker ボリューム ls
ドライバーボリューム名
ローカル etcdtest_etcd1_data
ローカル etcdtest_etcd2_data
ローカル etcdtest_etcd3_data
[root@centos8 etcdtest]# docker で etcd1 を検査します 

「マウント」: [
    {
        「タイプ」:「ボリューム」、
        「名前」: 「etcdtest_etcd1_data」、
        「ソース」: 「/var/lib/docker/volumes/etcdtest_etcd1_data/_data」、
        「宛先」: 「/bitnami/etcd」、
        "ドライバー": "ローカル",
        "モード": "z",
        「RW」:真、
        「伝播」: 「」
    }
]

テストノード

etcd1からキーを書き込む

[root@centos8 etcdtest]# docker exec -it etcd1 bash
名前がありません!@5454f5a719a2:/opt/bitnami/etcd$ etcdctl put name "i am wxf"
わかりました

etcd2から値を読み取る

[wxf@centos8 ~]$ docker exec -it etcd2 bash
名前がありません!@bf989f9512b5:/opt/bitnami/etcd$ etcdctl get name
名前
私はwxfです

ビルド成功!

Golangとetcd間のシンプルな相互作用

パッケージメイン

輸入 (
 "コンテクスト"
 「fmt」
 「go.etcd.io/etcd/クライアント/v3」
 "時間"
)

関数main() {
 cli、エラー:= clientv3.New(clientv3.Config{
  エンドポイント: []文字列{"http://192.168.135.10:20000", "http://192.168.135.10:20002", "http://192.168.135.10:20004"},
  ダイヤルタイムアウト: 5 * 時間.秒、
 })
 err != nil の場合 {
  fmt.Printf("etcdへの接続に失敗しました、エラー:%v\n", err)
  戻る
 }
 cli.Close() を延期する
 fmt.Println("etcdへの接続成功")
 cli.Close() を延期する

 ウォッチ(cli)

 作成(cli)
 読む(cli)
 削除(cli)
 アップデート(cli)
 {} を選択
}

ウォッチ関数(cli *clientv3.Client) {
 rch := cli.Watch(context.Background(), "name") // 型 WatchChan <-chan WatchResponse
 wresp := range rch {の場合
  _ の場合、ev := 範囲 wresp.Events {
   fmt.Printf("タイプ: %s キー: %s 値: %s\n", ev.Type, ev.Kv.Key, ev.Kv.Value)
  }
 }
 fmt.Println("出力")
}

関数Create(cli *clientv3.Client) {
 // 置く
 ctx、キャンセル:=context.WithTimeout(context.Background()、time.Second*5)
 _, err := cli.Put(ctx, "name", "wxf")
 キャンセル()
 err != nil の場合 {
  fmt.Printf("etcd への put に失敗しました、エラー:%v\n", err)
  戻る
 }
}

read(cli *clientv3.Client)関数{
 //得る
 ctx、キャンセル:=context.WithTimeout(context.Background()、time.Second*5)
 応答、エラー:= cli.Get(ctx, "name")
 キャンセル()
 err != nil の場合 {
  fmt.Printf("etcd からの取得に失敗しました、エラー:%v\n", err)
  戻る
 }
 _ の場合、ev := 範囲 resp.Kvs {
  fmt.Printf("タイプ: %s キー: %s 値: %s\n", "READ", ev.Key, ev.Value)
 }
}

関数Update(cli *clientv3.Client) {
 // 置く
 ctx、キャンセル:=context.WithTimeout(context.Background()、time.Second*5)
 _, err := cli.Put(ctx, "name", "xyy")
 キャンセル()
 err != nil の場合 {
  fmt.Printf("etcd への put に失敗しました、エラー:%v\n", err)
  戻る
 }
}

関数Delete(cli *clientv3.Client) {
 //削除
 ctx、キャンセル:=context.WithTimeout(context.Background()、time.Second*5)
 _, err := cli.Delete(ctx, "名前")
 キャンセル()
 err != nil の場合 {
  fmt.Printf("etcd からの削除に失敗しました、エラー:%v\n", err)
  戻る
 }
}

main.go を実行します

etcdへの接続成功
タイプ: PUT キー:name 値:wxf
タイプ: READ キー:name 値:wxf
タイプ: DELETE キー:name 値:
タイプ: PUT キー:name 値:xyy
タイプ: PUT キー:名前 値:ターミナルのテスト
タイプ: PUT キー:name 値:端末のテスト aabbccdd

名前がありません!@5454f5a719a2:/opt/bitnami/etcd$ etcdctl put name "test for terminator"
わかりました
名前がありません!@5454f5a719a2:/opt/bitnami/etcd$ etcdctl put name "test for terminator aabbccdd"
わかりました

etcd クラスターの docker-compose デプロイメントの実装手順に関するこの記事はこれで終わりです。etcd クラスターの docker-compose デプロイメントに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker Compose マルチコンテナデプロイメントの実装
  • docker-compose を使用して Clickhouse をすばやくデプロイする方法のチュートリアル
  • Docker Compose によるマルチコンテナ サービスの迅速な展開の詳細な例

<<:  UIエンジニアのキャリアについての私たちの考え

>>:  JavaScript関数の使い方の詳細な説明

推薦する

MySQL が uuid または snowflake id を主キーとして使用することを推奨しない理由の詳細な分析

前書き: MySQL でテーブルを設計する場合、MySQL では UUID や非連続かつ非繰り返しの...

ウェブデザインを改善するための 8 つの CSS ツールを共有する

ウェブサイトのデザインを編集または変更する必要がある場合、CSS が重要な役割を果たします。 CSS...

Mac で Docker を使用して Oracle をデプロイする方法

Mac で Docker を使用して Oracle をデプロイする方法まずdockerをインストール...

JS addEventListener() およびattachEvent() メソッドは登録イベントを実装します

JavaScript の DOM イベント モデルでは、オブジェクトの addEventListen...

Linux システムで jmeter を実行し、ローカル メモリを最適化する方法の詳細な説明

1. Linuxシステムにクロスシステムファイル転送ツールをインストールするルートユーザーのルートデ...

docker-compose でデプロイしたときに MySQL にアクセスできなくなる問題の簡単な分析

Docker-ComposeとはCompose プロジェクトは、以前の fig プロジェクトから派生...

HTMLとリソースがどのように読み込まれるかを理解します

このブログのすべてのコンテンツは、クリエイティブ コモンズ ライセンスの下でライセンスされています。...

6つの珍しいHTMLタグ

まず: <abbr> または <acronym>これら 2 つの記号は同じ意...

WeChatミニプログラムユーザー認証による携帯電話番号の取得(getPhoneNumber)

序文ミニプログラムには、ユーザーを取得するための非常に便利な API があり、getPhoneNum...

JSに関する7つの面接の質問、あなたはいくつ正しく答えられますか

序文JavaScript では、これは関数呼び出しコンテキストです。この動作が非常に複雑であるからこ...

docker を使って sonarqube を構築する方法

目次1. Dockerをインストールする2. ソナーイメージをインストールする3. ソナーを使ってコ...

HTML テーブルインライン形式の詳細な説明

インライン形式<colgroup>...</colgroup>属性名 属性値...

HTML でフロートをクリアする 2 つの方法

1. クリアフローティング法1前の親要素の高さを設定します。注: エンタープライズ開発では、可能であ...

MySql バッチに挿入するときにデータの重複を避ける方法

目次序文1. ignore を挿入2. 重複キーの更新時3. を置き換える要約する序文Mysql は...

Reactイベントスロットリング効果が失敗する理由と解決策

目次ここでの問題は次の通りです:解決策1:解決策2: コンストラクタで初期化を割り当てる採掘場の概要...