Dockerコンテナ間で通信する3つの方法

Dockerコンテナ間で通信する3つの方法

Docker コンテナは互いに分離されており、相互にアクセスできないことは誰もが知っていますが、依存するサービスがある場合はどうなるでしょうか?コンテナ相互アクセス問題を解決するために、次の 3 つの方法が導入されています。

方法1: 仮想IPアクセス

Docker をインストールすると、Docker はデフォルトで内部ブリッジ ネットワーク docker0 を作成します。作成された各コンテナーには仮想ネットワーク カードが割り当てられ、コンテナーは IP に基づいて相互にアクセスできるようになります。

[root@33fcf82ab4dd /]# [root@CentOS ~]# ifconfig
......
docker0: flags=4163<UP、ブロードキャスト、実行中、マルチキャスト> mtu 1500
    inet 172.17.0.1 ネットマスク 255.255.0.0 ブロードキャスト 0.0.0.0
    inet6 fe80::42:35ff:feac:66d8 プレフィックス長 64 スコープID 0x20<リンク>
    ether 02:42:35:ac:66:d8 txqueuelen 0 (イーサネット)
    RXパケット 4018 バイト 266467 (260.2 KiB)
    RXエラー 0 ドロップ 0 オーバーラン 0 フレーム 0
    TXパケット 4226 バイト 33935667 (32.3 MiB)
    TXエラー 0 ドロップ 0 オーバーラン 0 キャリア 0 衝突 0
......

Centosイメージを実行し、IPアドレスを確認します: 172.17.0.7

[root@CentOS ~]# docker run -it --name centos-1 docker.io/centos:latest
[root@6d214ff8d70a /]# ifconfig
eth0: flags=4163<UP、ブロードキャスト、実行中、マルチキャスト> mtu 1500
    inet 172.17.0.7 ネットマスク 255.255.0.0 ブロードキャスト 0.0.0.0
    inet6 fe80::42:acff:fe11:7 プレフィックス長 64 スコープID 0x20<リンク>
    ether 02:42:ac:11:00:07 txqueuelen 0 (イーサネット)
    RXパケット 16バイト 1296 (1.2 KiB)
    RXエラー 0 ドロップ 0 オーバーラン 0 フレーム 0
    TXパケット 8バイト 648 (648.0 B)
    TXエラー 0 ドロップ 0 オーバーラン 0 キャリア 0 衝突 0

同じコマンドを実行して別のコンテナを起動し、IPアドレスを確認します: 172.17.0.8

[root@CentOS ~]# docker run -it --name centos-2 docker.io/centos:latest
[root@33fcf82ab4dd /]# ifconfig
eth0: flags=4163<UP、ブロードキャスト、実行中、マルチキャスト> mtu 1500
    inet 172.17.0.8 ネットマスク 255.255.0.0 ブロードキャスト 0.0.0.0
    inet6 fe80::42:acff:fe11:8 プレフィックス長 64 スコープID 0x20<リンク>
    ether 02:42:ac:11:00:08 txqueuelen 0 (イーサネット)
    RXパケット 8バイト 648 (648.0 B)
    RXエラー 0 ドロップ 0 オーバーラン 0 フレーム 0
    TXパケット 8バイト 648 (648.0 B)
    TXエラー 0 ドロップ 0 オーバーラン 0 キャリア 0 衝突 0

コンテナ内の ping テストの結果は次のとおりです。

[root@33fcf82ab4dd /]# 172.17.0.7にpingを実行
PING 172.17.0.7 (172.17.0.7) 56(84) バイトのデータ。
172.17.0.7 からの 64 バイト: icmp_seq=1 ttl=64 time=0.205 ms
172.17.0.7 からの 64 バイト: icmp_seq=2 ttl=64 time=0.119 ms
172.17.0.7 からの 64 バイト: icmp_seq=3 ttl=64 time=0.118 ms
172.17.0.7 からの 64 バイト: icmp_seq=4 ttl=64 time=0.101 ms

この方法では各コンテナの IP アドレスを知る必要があり、実際の使用では現実的ではありません。

方法2: リンク

コンテナを実行するときにパラメータを追加する

最初のコンテナを実行する

docker run -it --name centos-1 docker.io/centos:latest

2番目のコンテナを実行する

[root@CentOS ~]# docker run -it --name centos-2 --link centos-1:centos-1 docker.io/centos:latest

--link: パラメータの最初の centos-1 はコンテナ名で、2 番目の centos-1 は定義されたコンテナ エイリアスです (エイリアスを使用してコンテナにアクセスします)。使いやすさを考慮して、エイリアスは通常、コンテナ名にデフォルト設定されます。

テスト結果は次のとおりです。

[root@e0841aa13c5b /]# ping centos-1
PING centos-1 (172.17.0.7) 56(84) バイトのデータ。
centos-1 (172.17.0.7) からの 64 バイト: icmp_seq=1 ttl=64 time=0.210 ms
centos-1 (172.17.0.7) からの 64 バイト: icmp_seq=2 ttl=64 time=0.116 ms
centos-1 (172.17.0.7) からの 64 バイト: icmp_seq=3 ttl=64 time=0.112 ms
centos-1 (172.17.0.7) からの 64 バイト: icmp_seq=4 ttl=64 time=0.114 ms

この方法では、コンテナの作成順序に要件があります。クラスター内の複数のコンテナが相互にアクセスする必要がある場合、この方法はあまり便利ではありません。

方法3: ブリッジネットワークを作成する

1. Dockerをインストールした後、次のコマンドを実行してブリッジネットワークを作成します: docker network create testnet

新しく作成されたブリッジ テストネットが照会されます。

2. コンテナを実行してテストネット ネットワークに接続します。

使用方法: docker run -it --name <コンテナ名> ---network <ブリッジ> --network-alias <ネットワークエイリアス> <イメージ名>

[root@CentOS ~]# docker run -it --name centos-1 --network testnet --network-alias centos-1 docker.io/centos:latest
[root@CentOS ~]# docker run -it --name centos-2 --network testnet --network-alias centos-2 docker.io/centos:latest

3. あるコンテナから別のコンテナに ping を実行します。テスト結果は次のとおりです。

[root@fafe2622f2af /]# ping centos-1
PING centos-1 (172.20.0.2) 56(84) バイトのデータ。
centos-1.testnet (172.20.0.2) からの 64 バイト: icmp_seq=1 ttl=64 time=0.158 ms
centos-1.testnet (172.20.0.2) からの 64 バイト: icmp_seq=2 ttl=64 time=0.108 ms
centos-1.testnet (172.20.0.2) からの 64 バイト: icmp_seq=3 ttl=64 time=0.112 ms
centos-1.testnet (172.20.0.2) からの 64 バイト: icmp_seq=4 ttl=64 time=0.113 ms

4. コンテナ内のサービスにアクセスする場合は、次の方法で<ネットワークエイリアス>: <サービスポート番号>にアクセスできます。

ネットワークをカスタマイズする場合はこの方法を使用することをお勧めします。ネットワークエイリアスを使用するため、IPが変わるかどうかを気にする必要はありません。Docker内の明るいネットワークに接続していれば、相互にアクセスできます。複数のブリッジを確立して、異なるネットワーク セグメントに分離することができます。

以上がDockerコンテナ相互アクセスの3つの方法の詳細です。Dockerコンテナ相互アクセスの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Docker でリモートの安全なアクセスを有効にする方法の詳細なグラフィック チュートリアル
  • DockerにTomcatコンテナを追加したときにホームページにアクセスできない問題の解決方法
  • 独立した IP を介して Windows コンテナ イントラネットの Docker に直接アクセスする方法
  • Centos Docker ブリッジ モードでホスト Redis サービスにアクセスできないというトラブルシューティングの経験
  • Dockerを使用して外部からアクセス可能なMySQLを構築する詳細な説明
  • dockerコンテナがIP経由でホストマシンにアクセスできない問題を解決する方法の詳細な説明
  • Dockerでローカルマシン(ホストマシン)にアクセスする方法
  • Dockerコンテナを使用してホストネットワークにアクセスする方法
  • 実行後にdocker nginxにアクセスできない問題の解決策
  • Dockerコンテナ内の独立IPにアクセスする方法

<<:  異なる列を持つテーブルのクエリ結果のSQLマージ操作

>>:  Vueプロジェクトはログインと登録の効果を実現します

推薦する

MySQL inndbジョイントインデックスを正しく使用する方法を徹底的に理解するためのケーススタディ

最近確認された5件のデータを照会するビジネスがあります。 `id`、`title` を選択 `th_...

Angular Cookie の読み取りおよび書き込み操作コード

Angular Cookie の読み取りおよび書き込み操作のコードは次のようになります。 var a...

JSはアニメーションのレイアウト変換を実装します

JS でアニメーションを記述する場合、移動前に相対位置を絶対位置に変換してからアニメーション機能を実...

Nginxを使ってサーバー内で複数コンテナの共存を実現する方法

背景Tencent Linux クラウド ホストがあり、その上に Docker (ServiceDo...

Dockerのプロセスとイメージを実行するための基本コマンドの詳細な説明

目次1. ワークフローを実行する2. ミラーリングの基本コマンド1. ワークフローを実行するDock...

Vue ページレンダリングにおけるキーの適用例チュートリアル

導入フロントエンドプロジェクトの開発プロセスでは、el-table によって表示される結果列がコンポ...

MySQL で重複レコードをクエリして削除する方法の完全なガイド

序文この記事では主に、MySQL で重複レコードをクエリして削除する方法を紹介します。参考と学習のた...

Dockerコンテナでユーザーを切り替えるときに権限が不足する問題を解決する方法

Docker コンテナでユーザーを切り替えると、権限が不十分であるというメッセージが表示されます。解...

クリーンなXHTML構文

XHTML を書くには、明確な HTML 構文が必要です。 XHTMLを書くには、きれいなHTML構...

Mysql Workbench クエリ mysql データベース メソッド

Mysql Workbench はオープンソースのデータベース クライアントです。このオープンソース...

MYSQL フルバックアップ、マスタースレーブレプリケーション、カスケードレプリケーション、および半同期の概要

MySQL フルバックアップ1. バイナリログを有効にし、データベースから分離して別々に保存する v...

Vueシングルページアプリケーションの事前レンダリング方法の例

目次序文vue-cli 2.0 バージョンvue-cli 3.0 バージョン要約する序文vue-cl...

Windows と Linux 間のリモート デスクトップ接続

Linux へのリモート デスクトップ接続といえば、まず VNC の使用を思い浮かべるかもしれません...

JavaScriptで計算機機能を実現するプロセスの詳細な説明

目次1. 電卓機能の紹介2. 計算機ページのデザイン1. ナビゲーションバー2. データ部分3. i...