Docker を使用してスタンドアロン Pulsar とクラスター化された Redis をデプロイする方法 (開発アーティファクト)

Docker を使用してスタンドアロン Pulsar とクラスター化された Redis をデプロイする方法 (開発アーティファクト)

1. はじめに:

現在のインターネット技術アーキテクチャでは、MQ、Redis、Zookeeper など、さまざまなミドルウェアが次々と登場しています。これらのミドルウェアは、一般的にマスタースレーブアーキテクチャまたはクラスターアーキテクチャで導入されています。企業では、開発環境、テスト環境、本番環境にそれぞれ 1 セットずつ導入するのが一般的です。

開発を行う場合、通常は開発環境に接続します。しかし、一般企業の開発環境はイントラネット上でしか利用できず、帰宅すると会社がVPNを提供してくれないと利用できません。時々VPNがありますが、それでも開発には不便です。例えば、現在使用している MQ ミドルウェアは Pulsar を使用していますが、Pulsar のテナントと名前空間は自動的に作成できないため、日常的な開発には非常に不便で、必要なときにその都度 DBA を探すしかありません。

したがって、通常は一連のサーバーをローカルに展開しますが、自分で展開するには 2 つの困難があります。

ミドルウェアには、RabbitMQ などの独自の実装言語があります。RabbitMQ をデプロイするときは、まず Erlang 言語をインストールする必要があります。クラスター アーキテクチャを導入すると、大量のシステム リソースが消費され、すでにリソースが制限されているラップトップの動作がさらに遅くなり、開発が非常に困難になります。

2. ドッカー:

Docker は上記の問題を完全に解決し、デプロイメントを非常に簡単にします。以下は私が実際に使用しているミドルウェアの例です。

A. パルサー:

前述のとおり、Pulsar テナントと名前空間は自動的に作成することはできません。これらを使用したい場合は、作成を手伝ってくれる担当の同僚を見つけるしかありません。最近取り組んだ機能であるブロードキャスト センターとメンバー エクスポートはどちらも Pulsar を使用していますが、同僚に迷惑をかけたくなかったし、自宅で作業することが多いため、公式 Web サイトに直接アクセスして、ローカルに展開する方法を調べました。

公式サイトでは、圧縮パッケージ、Docker、Kubernetes を使用したさまざまなデプロイメント方法が紹介されています。もちろん、Docker デプロイ方法があり、Docker デプロイ方法を使用する必要があります。とにかく、イメージをプルしてコンテナを起動するだけでよいので、非常に便利です。

次のコマンド:

docker run -it -d -p 6650:6650 -p 8080:8080 -v data -v conf --name=mypulsar apachepulsar/pulsar:2.6.1 bin/pulsar スタンドアロン

コマンドは非常に簡単です。pulsar のポート番号 6650 と 8080 を開き、それらをホスト マシンの対応するポート番号にバインドして、ホスト マシンの ip:port に直接アクセスしてコンテナーにアクセスできるようにします。次に、データが失われないように、Pulsar のデータと conf をホストにマウントします。次に、pulsar standalone コマンドを使用して、Pulsar のスタンドアロン バージョンを起動します。

次に、テナントまたは名前空間を作成する必要がある場合は、コンテナーに直接入力して作成できます。
コンテナを入力します:

docker exec -it mypulsar /bin/bash

テナントおよび名前空間を追加、削除、変更、確認するためのコマンドについて:

## 1 テナント# どのテナントが存在するかを確認します (public はシステムのデフォルトのテナントです)
pulsar-admin テナントリスト
##テナントの作成 pulsar-admin tenants create my-tenant
#テナントの削除 pulsar-admin tenants delete my-tenant
## 2 名前空間#指定されたテナントの下の名前空間を表示する pulsar-admin namespaces list my-tenant
#指定されたテナント名前空間を作成する pulsar-admin namespaces create my-tenant/my-namespace
#指定されたテナント名前空間を削除します pulsar-admin namespaces delete my-tenant/my-namespace

B. レディス:

Redis 一般的に、私たちが制作するアーキテクチャは Cluster を使用しますが、Redis のクラスタを自分でデプロイする場合は、かなり面倒です。以前、Linux に Redis Cluster をデプロイする という記事を書きました。

Docker を使用すると非常に簡単になります。

1 カスタムネットワーク

1.1 Redis専用のネットワークを作成する

Redis クラスター内の各ノードは専用のネットワークを共有するため、ノードは相互にアクセスでき、各ノード間のネットワーク通信に --link を使用する必要がなくなります。

docker network create コマンドによって作成されたネットワークは、デフォルトでブリッジ モードになります。

winfun@localhost ~ % docker network create redis-net --subnet 172.26.0.0/16
5001355940f43474d59f5cb2d78e4e9eeb0a9827e53d8f9e5b55e7d3c5285a09
winfun@localhost ~ % docker ネットワークリスト
ネットワーク ID 名前 ドライバー スコープ
4d88d473e947 ブリッジ ブリッジ ローカル
79a915fafbb5 ホスト ホスト ローカル
f56e362d3c68 なし null ローカル
5001355940f4 redis-net ブリッジ ローカル
winfun@localhost ~ %

1.2 カスタムネットワークの詳細を表示する

コマンド docker network inspect redis-net を使用してカスタム ネットワークの詳細を表示すると、現在ネットワーク内にコンテナがないことがわかります。

winfun@localhost mydata % docker ネットワーク検査 redis-net
[
 {
 「名前」: 「redis-net」、
 「ID」: 「aed8340bbf8ab86cedc1d990eb7612854ba2b0bd4eae0f978ff95eadc3dbcf65」、
 「作成日」: 「2020-10-22T08:46:55.695434Z」、
 「スコープ」:「ローカル」、
 「ドライバー」:「ブリッジ」、
 「IPv6を有効にする」:false、
 「IPAM」: {
 "ドライバー": "デフォルト",
 「オプション」: {},
 「設定」: [
 {
  「サブネット」: 「172.26.0.0/16」
 }
 ]
 },
 「内部」:偽、
 「接続可能」: false、
 「イングレス」:偽、
 "設定元": {
 「ネットワーク」: 「」
 },
 "ConfigOnly": false、
 「コンテナ」: {},
 「オプション」: {},
 「ラベル」: {}
 }
]

2 展開を開始する

2.1 6つのRedisノード構成を作成する

$(seq 1 6) のポートの場合; \
する \
mkdir -p /Users/winfun/mydata/redis/node-${port}/conf
/Users/winfun/mydata/redis/node-${port}/conf/redis.conf をタッチします。
cat << EOF >/Users/winfun/mydata/redis/node-${port}/conf/redis.conf
ポート 6379
0.0.0.0 をバインド
クラスタ対応 はい
クラスター構成ファイル nodes.conf
クラスターノードタイムアウト 5000
クラスターアナウンスIP 172.26.0.1${ポート}
クラスターアナウンスポート 6379
クラスターアナウンスバスポート 16379
追加のみ はい
終了
終わり

2.2 コンテナを起動する

$(seq 1 6) のポートの場合; \
する \
docker run -p 637${ポート}:6379 -p 1637${ポート}:16379 --name redis-${ポート} \
-v /Users/winfun/mydata/redis/node-${port}/data:/data \
-v /Users/winfun/mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis-net --ip 172.26.0.1${ポート} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
終わり

2.3 正常に起動した6つのコンテナを表示する

winfun@localhost mydata % docker ps | grep redis
ed5972e988e8 redis:5.0.9-alpine3.11 "docker-entrypoint.s..." 11 秒前 10 秒前にアップ 0.0.0.0:6376->6379/tcp、0.0.0.0:16376->16379/tcp redis-6
61cd467bc803 redis:5.0.9-alpine3.11 "docker-entrypoint.s..." 12 秒前 11 秒前にアップ 0.0.0.0:6375->6379/tcp、0.0.0.0:16375->16379/tcp redis-5
113943ba6586 redis:5.0.9-alpine3.11 "docker-entrypoint.s..." 12 秒前 11 秒前にアップ 0.0.0.0:6374->6379/tcp、0.0.0.0:16374->16379/tcp redis-4
5fc3c838851c redis:5.0.9-alpine3.11 "docker-entrypoint.s..." 13 秒前 12 秒前にアップ 0.0.0.0:6373->6379/tcp、0.0.0.0:16373->16379/tcp redis-3
f7d4430f752b redis:5.0.9-alpine3.11 "docker-entrypoint.s..." 13 秒前 12 秒前にアップ 0.0.0.0:6372->6379/tcp、0.0.0.0:16372->16379/tcp redis-2
bd3e4a593427 redis:5.0.9-alpine3.11 "docker-entrypoint.s..." 14 秒前 13 秒前にアップ 0.0.0.0:6371->6379/tcp、0.0.0.0:16371->16379/tcp redis-1

3 ネットワークを再度確認する

3.1 ネットワーク内のコンテナを表示する

上記のコンテナを起動したときに、redis-net ネットワークの使用を指定したので、まず redis-net ネットワークの情報を確認します。
「Containers」には、開始した 6 つのコンテナー、つまり 6 つの Redis ノードが含まれていることがわかります。

winfun@localhost mydata % docker ネットワーク検査 redis-net
[
 {
 「名前」: 「redis-net」、
 「ID」: 「aed8340bbf8ab86cedc1d990eb7612854ba2b0bd4eae0f978ff95eadc3dbcf65」、
 「作成日」: 「2020-10-22T08:46:55.695434Z」、
 「スコープ」:「ローカル」、
 「ドライバー」:「ブリッジ」、
 「IPv6を有効にする」:false、
 「IPAM」: {
 "ドライバー": "デフォルト",
 「オプション」: {},
 「設定」: [
 {
  「サブネット」: 「172.26.0.0/16」
 }
 ]
 },
 「内部」:偽、
 「接続可能」: false、
 「イングレス」:偽、
 "設定元": {
 「ネットワーク」: 「」
 },
 "ConfigOnly": false、
 「コンテナ」: {
 "113943ba6586a4ac21d1c068b0535d5b4ef37da50141d648d30dab47eb47d3af": {
 「名前」: 「redis-4」、
 "エンドポイントID": "3fe3b4655f39f90ee4daf384254d3f7548cddd19c384e0a26edb6a32545e5b30",
 "Macアドレス": "02:42:ac:1a:00:0e",
 "IPv4アドレス": "172.26.0.14/16",
 "IPv6アドレス": ""
 },
 "5fc3c838851c0ca2f629457bc3551135567b4e9fb155943711e07a91ebe9827f": {
 「名前」: 「redis-3」、
 "エンドポイントID": "edd826ca267714bea6bfddd8c5d6a5f3c71c50bd50381751ec40e9f8e8160dce",
 "Macアドレス": "02:42:ac:1a:00:0d",
 "IPv4アドレス": "172.26.0.13/16",
 "IPv6アドレス": ""
 },
 "61cd467bc8030c4db9a4404b718c5c927869bed71609bec91e17ff0da705ae26": {
 「名前」: 「redis-5」、
 "エンドポイントID": "7612c44ab2479ab62341eba2e30ab26f4c523ccbe1aa357fc8b7c17a368dba61",
 "Macアドレス": "02:42:ac:1a:00:0f",
 "IPv4アドレス": "172.26.0.15/16",
 "IPv6アドレス": ""
 },
 "bd3e4a593427aab4750358330014422500755552c8b470f0fd7c1e88221db984": {
 「名前」: 「redis-1」、
 "エンドポイントID": "400153b712859c5c17d99708586f30013bb28236ba0dead516cf3d01ea071909",
 "Macアドレス": "02:42:ac:1a:00:0b",
 "IPv4アドレス": "172.26.0.11/16",
 "IPv6アドレス": ""
 },
 "ed5972e988e8301179249f6f9e82c8f9bb4ed801213fe49af9d3f31cbbe00db7": {
 「名前」: 「redis-6」、
 "エンドポイントID": "b525b7bbdd0b0150f66b87d55e0a8f1208e113e7d1d421d1a0cca73dbb0c1e47",
 "Macアドレス": "02:42:ac:1a:00:10",
 "IPv4アドレス": "172.26.0.16/16",
 "IPv6アドレス": ""
 },
 "f7d4430f752b5485c5a90f0dc6d1d9a826d782284b1badbd203c12353191bc57": {
 「名前」: 「redis-2」、
 "エンドポイントID": "cbdc77cecda1c8d80f566bcc3113f37c1a7983190dbd7ac2e9a56f6b7e4fb21f",
 "Macアドレス": "02:42:ac:1a:00:0c",
 "IPv4アドレス": "172.26.0.12/16",
 "IPv6アドレス": ""
 }
 },
 「オプション」: {},
 「ラベル」: {}
 }
]

3.2 コンテナが相互に通信できるかどうかを確認する

また、redis-1 を使用して redis-2 で ping コマンドを実行し、ネットワークが相互に通信できるかどうかを確認することもできます。

winfun@localhost mydata % docker exec -it redis-1 ping redis-2
PING redis-2 (172.26.0.12): 56 データバイト
172.26.0.12 からの 64 バイト: seq=0 ttl=64 time=0.136 ms
172.26.0.12 からの 64 バイト: seq=1 ttl=64 time=0.190 ms
172.26.0.12 からの 64 バイト: seq=2 ttl=64 time=0.483 ms
^C
--- redis-2 ping 統計 ---
3 パケット送信、3 パケット受信、パケット損失 0%
往復の最小/平均/最大 = 0.136/0.269/0.483 ミリ秒

4 クラスターを作成する

4.1 redis-cli コマンドを使用してクラスターを作成します。

winfun@localhost conf % docker exec -it redis-1 /bin/bash
OCI ランタイム exec に失敗しました: exec に失敗しました: container_linux.go:349: コンテナ プロセスの開始により "exec: \"/bin/bash\" が発生しました: stat /bin/bash: そのようなファイルまたはディレクトリはありません: 不明
# sh のみ使用できます。redis イメージには bash がありません
winfun@localhost mydata % docker exec -it redis-1 /bin/sh
/データ # cd /usr/local/bin/
/usr/local/bin # redis-cli --cluster 作成 172.26.0.11:6379 172.26.0.12:6379 17
2.26.0.13:6379 172.26.0.14:6379 172.26.0.15:6379 172.26.0.16:6379 --cluster-repl
イカス1 
>>> 6 つのノードでハッシュ スロットの割り当てを実行しています...
マスター[0] -> スロット0 - 5460
マスター[1] -> スロット5461 - 10922
マスター[2] -> スロット 10923 - 16383
レプリカ 172.26.0.15:6379 を 172.26.0.11:6379 に追加しています
レプリカ 172.26.0.16:6379 を 172.26.0.12:6379 に追加しています
レプリカ 172.26.0.14:6379 を 172.26.0.13:6379 に追加しています
6de9e9eef91dbae773d8ee1d629c87e1e7e19b82 172.26.0.11:6379
 スロット:[0-5460] (5461スロット) マスター
43e173849bed74f5bd389f9b272ecf0399ae448f 172.26.0.12:6379
 スロット:[5461-10922] (5462スロット) マスター
1e504dc62b7ccc426d513983ca061d1657532fb6 172.26.0.13:6379
 スロット:[10923-16383] (5461 スロット) マスター
92b95f18226903349fb860262d2fe6932d5a8dc2 172.26.0.14:6379
 1e504dc62b7ccc426d513983ca061d1657532fb6 を複製します
7e5116ba9ee7bb70a68f4277efcbbbb3dcfd18af 172.26.0.15:6379
 6de9e9eef91dbae773d8ee1d629c87e1e7e19b82 を複製します
203e3e33b9f4233b58028289d0ad2dd56e7dfe45 172.26.0.16:6379
 43e173849bed74f5bd389f9b272ecf0399ae448f を複製する
上記の設定を行えますか? (同意する場合は「はい」と入力してください): はい
>>> ノード構成が更新されました
>>> 各ノードに異なる構成エポックを割り当てる
>>> クラスターに参加するためにCLUSTER MEETメッセージを送信する
クラスターの参加を待機中
...
>>> クラスター チェックを実行しています (ノード 172.26.0.11:6379 を使用)
6de9e9eef91dbae773d8ee1d629c87e1e7e19b82 172.26.0.11:6379
 スロット:[0-5460] (5461スロット) マスター
 追加のレプリカ 1 個
92b95f18226903349fb860262d2fe6932d5a8dc2 172.26.0.14:6379
 スロット: (0 スロット) スレーブ
 1e504dc62b7ccc426d513983ca061d1657532fb6 を複製します
203e3e33b9f4233b58028289d0ad2dd56e7dfe45 172.26.0.16:6379
 スロット: (0 スロット) スレーブ
 43e173849bed74f5bd389f9b272ecf0399ae448f を複製する
1e504dc62b7ccc426d513983ca061d1657532fb6 172.26.0.13:6379
 スロット:[10923-16383] (5461 スロット) マスター
 追加のレプリカ 1 個
7e5116ba9ee7bb70a68f4277efcbbbb3dcfd18af 172.26.0.15:6379
 スロット: (0 スロット) スレーブ
 6de9e9eef91dbae773d8ee1d629c87e1e7e19b82 を複製します
43e173849bed74f5bd389f9b272ecf0399ae448f 172.26.0.12:6379
 スロット:[5461-10922] (5462スロット) マスター
 追加のレプリカ 1 個
[OK] すべてのノードがスロット構成に同意します。
>>> 空きスロットがあるか確認します...
>>> スロットのカバレッジを確認してください...
[OK] 16384 スロットすべてがカバーされました。

4.2 redis-cli を使用して現在のノードに接続し、クラスター情報を表示します。

/usr/local/bin # redis-cli -c
127.0.0.1:6379> クラスター情報
クラスター状態:正常
割り当てられたクラスタースロット:16384
クラスタースロットOK:16384
クラスタースロットp失敗:0
クラスタースロット失敗:0
クラスターの既知のノード:6
クラスターサイズ:3
クラスター現在のエポック:6
クラスター_マイ_エポック:1
クラスター統計メッセージping送信:91
クラスター統計メッセージ送信:95
クラスター統計送信メッセージ:186
クラスター統計メッセージping受信:90
クラスター統計メッセージ受信数:91
クラスター統計メッセージ会議受信数:5
クラスター統計受信メッセージ:186

4.3 キーを追加してみる

# キーを設定し、このキーがノード redis-3 [192.168.0.13] に対応するスロット [12539] に割り当てられていることを示すプロンプトを返します。
127.0.0.1:6379> キーを設定 hello
-> 172.26.0.13:6379 にあるスロット [12539] にリダイレクトされました
わかりました
# そして redis-cli はノード redis-3[172.26.0.13] に切り替わります
172.26.0.13:6379>

5 テスト

この時点で、Docker を使用して Redis クラスターをローカルに正常にデプロイできたと言えます。
次に、コード内でRedisを直接使用できるかどうかをテストします。

/**
 * Redis クラスターのテスト * @author winfun
 * @日付 2020/10/21 午後 5:48**/
パブリッククラス TestCluster {

 パブリック静的void main(String[] args)は例外をスローします{

 Set<HostAndPort> ノード = new HashSet<>(3);
 ノードを追加します(新しいホストとポート("127.0.0.1",6371));
 ノードを追加します(新しいホストとポート("127.0.0.1",6372));
 ノードを追加します(新しいホストとポート("127.0.0.1",6373));

 JedisCluster クラスター = 新しい JedisCluster(ノード);
 文字列値 = cluster.get("key");
 System.out.println("get: キーはキー、値は "+値);
 文字列結果 = cluster.set("key2","hello world");
 System.out.println("set: キーは key2、結果は "+result);
 クラスターを閉じます。
 }
}

しかし、結果は満足のいくものではなく、例外が返されます。

このことから、Docker にデプロイした Redis クラスターに接続するのはおそらく不可能であると推測できます。
したがって、次回デバッグするときには、JedisCluster がクラスター ノードについてどのような情報を取得するかを確認します。
以下のように表示されます。

ローカル IP とマップされたポートを使用して JedisCluster を構成した場合でも、同じことがわかります。

しかし、予想外に、JedisCluster 自体がクラスター メタデータを再度取得します。このとき、ノードの IP アドレスはすべてカスタム ネットワーク redis-net によって割り当てられたサブネットであり、ホスト マシンにアクセスできない可能性があります (この問題については、ホスト タイプのカスタム ネットワークの使用を検討できます)。

6 アプリケーションはカスタムネットワークにも展開されます

それでどうやってテストするのでしょうか?

簡単な SpringBoot プロジェクトを作成し、Dockerfile を使用してプロジェクトによって生成された jar パッケージに基づいてイメージを構築し、Docker を使用してそれをデプロイし、デプロイされたコンテナーをカスタム ネットワーク redis-net に追加して、最後にテストします。

6.1 SpringBootプロジェクトを作成する

構成は次のとおりです。

6.1.1 pom.xml:

主にWebとRedisのスターターを紹介しました。

<依存関係>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-redis</artifactId>
</依存関係>
<依存関係>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
</依存関係>

6.1.2 プロジェクト application.properties:

サーバーポート=8080
# アプリケーションは Redis クラスターと同じネットワークにデプロイされるため、ここでコンテナ名を直接記述することもできます。
#spring.redis.cluster.nodes=redis-1:6379、redis-2:6379、redis-3:6379
spring.redis.cluster.nodes=172.26.0.11:6379,172.26.0.12:6379,172.26.0.13:6379

6.1.3 コントローラーは次のとおりです。

/**
 * RedisCluster テスト * @author winfun
 * @日付 2020/10/22 午後 3:19**/
@リクエストマッピング("/redisCluster")
@レストコントローラ
パブリッククラスRedisClusterController {

 オートワイヤード
 プライベート StringRedisTemplate redisTemplate;

 /***
 * 文字列: キーに応じて値を取得します
 * @author ウィンファン
 * @param キー キー
 * @return {@link 文字列 }
 **/
 @GetMapping("/get/{キー}")
 パブリック文字列 get(@PathVariable("key") 文字列キー){
 redisTemplate.opsForValue().get(key); を返します。
 }

 /***
 * 文字列: キー/値のペアを設定 * @author winfun
 * @param キー キー
 	 * @param 値 値
 * @return {@link 文字列 }
 **/
 @GetMapping("/set/{キー}/{値}")
 パブリック文字列セット(@PathVariable("key") 文字列キー、@PathVariable("value") 文字列値){
 redisTemplate.opsForValue().set(キー、値);
 「成功」を返します。
 }
}

6.2 プロジェクトをパッケージ化してイメージを生成する

6.2.1 プロジェクトをJarパッケージにパッケージ化する

mvn クリーンパッケージ

6.2.2 画像を生成する

Dockerfile ファイルを記述します。

java:8より
メンテナー winfun

#jar名はプロジェクトにパッケージ化されたjarです
redis-cluster-test-0.0.1-SNAPSHOT.jar app.jar を追加します。
エクスポーズ8080
エントリポイント ["java","-jar","app.jar"]

次に、Dockerfile の現在のディレクトリに移動し、次のコマンドを実行します。

ローカルホスト上の redis-cluster を docker build -t winfun/rediscluster でテストします。 
ビルド コンテキストを Docker デーモンに送信 25.84 MB
ステップ 1/5: java:8 から
8: library/javaから取得
5040bd298390: プル完了 
fce5728aad85: プル完了 
76610ec20bf5: プル完了 
60170fec2151: プル完了 
e98f73de8f0d: プル完了 
11f7af24ed9c: プル完了 
49e2d6393f32: プル完了 
bb9cdec9c7f3: プル完了 
ダイジェスト: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
ステータス: Java の新しいイメージをダウンロードしました:8
 ---> d23bdf5b1b1b
ステップ 2/5: MAINTAINER winfun
 ---> a99086ed7e68 で実行中
中間コンテナ a99086ed7e68 を削除しています
 ---> f713578122fc
ステップ 3/5: redis-cluster-test-0.0.1-SNAPSHOT.jar app.jar を追加します。
 ---> 12ca98d789b8
ステップ4/5: EXPOSE 8080
 ---> 833a06f2dd32 で実行中
中間コンテナ 833a06f2dd32 を削除しています
 ---> 82f4e078510d
ステップ 5/5: ENTRYPOINT ["java","-jar","app.jar"]
 ---> 517a1ea7f138 で実行中
中間コンテナ517a1ea7f138の削除
 ---> ed8a66ef4eb9
ed8a66ef4eb9 の構築に成功しました
winfun/rediscluster:latest のタグ付けに成功しました

6.3 コンテナを起動してテストする

6.3.1 コンテナを起動し、上で作成したカスタムネットワーク redis-net に追加します。

ビルド後、 docker psコマンドを使用してイメージを確認できます。

winfun@localhost ~ % docker イメージ | grep rediscluster
winfun/rediscluster 最新 ed8a66ef4eb9 52 分前 669MB

docker runコマンドを使用してこのイメージを実行し、コンテナを起動します。

winfun@localhost ~ % docker run -it -d -p 8787:8080 --name myrediscluster winfun/rediscluster
705998330f7e6941f5f96d187050d29c4a59f1b16348ebeb5ab0dbc6a1cd63e1

docker network connectを使用して、このコンテナを上記のカスタム ネットワーク redis-net に追加します。

winfun@localhost ~ % docker ネットワーク接続 redis-net myrediscluster

カスタム ネットワーク redis-net の詳細を表示すると、コンテナー内に myrediscluster コンテナーが見つかり、このコンテナーにカスタム ネットワーク redis-net の IP アドレスが割り当てられていることがわかります。
以下のように表示されます。

6.3.2 この時点で、ブラウザで RedisClusterController インターフェースを直接呼び出すことができます。

キー/値を設定します:

キーに応じて値を取得します。

上記からわかるように、全く問題はありません。

ただし、インターフェースをテストするたびに、イメージを再構築してデプロイする必要があります。

6.4 ブリッジモードとホストモード

上記で作成したカスタム ネットワーク redis-net のモードはブリッジ モード、つまりブリッジであることは誰もが知っています。

最大の特徴は、Docker内のコンテナのネットワークをホストマシンから分離することです。コンテナのIPとホストマシンのIPはアクセスできません。そのため、JedisClusterを使用してRedisクラスターを操作する場合、JedisClusterがDocker内のコンテナのIPとしてクラスターのノード情報を取得すると、アクセスできなくなります。

したがって、この問題を解決するには、ホスト モードを使用できます。その原理は、コンテナーがホスト マシンのネットワーク環境を共有するというものです。この場合、JedisCluster が Redis クラスターにアクセスしても問題はありません。

はい、そうだと思います。Redis クラスターをホスト モードで何度もデプロイしようとしましたが、redis-cli コマンドを使用したデプロイと操作に問題はありませんでした。しかし、JedisCluster を使用してクラスターにアクセスすると、クラスター ノードの情報さえ取得されません。 !

ぜひご自身で試してみる必要がありますので、詳細については以下の記事を参照してください。
docker redis5.0 clusterの実装 クラスタ構築

7. 最後

ここまでで、皆さんも Docker の威力を実感されたと思います。開発中にうまく使用すれば、それはまさに開発のための魔法の武器となります。最小限のシステム リソースを使用して、さまざまなミドルウェアを含む完全な開発環境をローカルに簡単に構築できます。

スタンドアロン Pulsar の Docker デプロイメントとクラスター アーキテクチャ Redis (開発成果物) に関するこの記事はこれで終わりです。Redis クラスターの Docker デプロイメントに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • ApacheとTomcatによるクラスタ環境構築プロセスの分析
  • Apache と Tomcat でクラスターを構築する (負荷分散)
  • Apache Pulsar クラスタの構築と展開の詳細なプロセス

<<:  MySQL 完全崩壊: クエリフィルタ条件の詳細な説明

>>:  JS 開発効率を上げる4つの超実践的なヒント

推薦する

ウェブページ上の写真プレビューナビゲーションを設計するためのヒント

<br />ナビゲーションとは、ウェブサイトの上部にあることが多いナビゲーション バーの...

一般的な nginx コマンドをシェル スクリプトに組み込む方法の詳細な説明

1. nginxシェルスクリプトを保存するフォルダを作成する /usr/local/タスク/ngin...

上下に空白行があるフォームを挿入する解決策

ウェブページを作成するときに、フォームを挿入した後、フォームの上下に空白行が表示されることがよくあり...

Vueは視覚的なドラッグページエディタを実装します

目次ドラッグアンドドロップの実装ドラッグイベントドラッグして開始リリースゾーンでの移動境界処理、角度...

ウェブページでメモの詳細が灰色になる問題に対処する

1. IE では、相対的な配置、つまり <div style="background...

Nodeはリクエスト追跡にasync_hooksモジュールを使用します

async_hooks モジュールは、Node.js バージョン 8.0.0 に正式に追加された実験...

CSS3 の Flex レイアウトの詳細な分析

Flexbox レイアウト モジュールは、コンテナー内のスペースをより効率的に配分する方法を提供する...

VMware 仮想マシンでの Centos8 ブリッジの静的 IP 設定方法

1. ネットワーク接続方法がブリッジされていることを確認する物理ネットワーク接続ステータスのコピーを...

Linux システムで HugePages をすばやく構成するための完全な手順

序文Linux システムの HugePages と Oracle データベースの最適化については、関...

Vue3におけるキーの役割と動作原理についての簡単な説明

このキー属性の機能は何ですか?まずは公式の説明を見てみましょう。 kekey 属性は主に、新しいノー...

iOS WeChat H5ページのゴム反発効果の落とし穴記録

ビジネス要件最近開発したプロジェクトの一つに、WeChat公式アカウントに関連したH5ページがありま...

デザイン参考 WordPressウェブサイト構築成功事例

これら 16 のサイトはそれぞれ注意深く読む価値があり、どのサイトでも推奨されている Web サイト...

この記事ではJavaScriptのガベージコレクションの仕組みを説明します

目次1. 概要2. メモリ管理3. ガベージコレクション4. GCアルゴリズムの紹介5. 参照カウン...

Google Web Fonts でウェブサイトに無制限のフォントを追加

長い間、リソースの制約により、使用できるフォントが限られていたため、Web サイトの開発は妨げられて...

仮想マシンに Linux rhel7.3 オペレーティング システムをインストールする (具体的な手順)

仮想化ソフトウェアをインストールする仮想マシンにオペレーティング システムをインストールする前に、ホ...