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プロジェクトはログインと登録の効果を実現します

推薦する

CSS で TikTok テキスト揺れエフェクトを実装する例

日々の開発において、フロントエンドの学生はアニメーションやデザインについてよく議論します。デザイナー...

CentOS7 に MySQL データベースをインストールしてデバッグする詳細な手順 [例]

この例では、デバッグ用の MySQL データベースをダウンロードしてインストールする必要があります。...

ウェブページエクスペリエンス: 計画と設計

1. デザインの方向性を明確にする<br />まず、どのユーザーを対象にデザインするのか...

デザイン理論: コンテンツプレゼンテーションのための 10 のヒント

<br /> テキスト、記号、リンクの3つの側面に焦点を当て、主に中国語で、個人的な執筆...

Office ファイルのオンライン プレビュー用の Vue サンプル コード

最近、電子アーカイブに取り組んでおり、バックエンドではファイルの Huawei Cloud OSS ...

シンプルなスネークを実現するためのネイティブjsキャンバス

この記事では、参考までに、簡単なスネークゲームを実装するためのjsキャンバスの具体的なコードを共有し...

SQL インジェクションの詳細

1. SQL インジェクションとは何ですか? SQL インジェクションは、入力パラメータに SQL ...

PostgreSQL正規表現の一般的な機能の概要

PostgreSQL正規表現の一般的な機能の概要正規表現は、複雑なデータ処理を必要とするプログラムに...

MySQL の同時実行性の問題と解決策の分析

目次1. 背景2. テーブルロックによるクエリの遅延3. オンラインでテーブル構造を変更するとどのよ...

Ubuntu システムに Theano と Keras をインストールする方法

注: システムは Ubuntu 14.04LTS、32 ビット オペレーティング システムです。Py...

LinuxでLVMディスクを拡張する詳細な手順

1.ハードディスクを追加する2. パーティションの状態を確認します: fdisk -l 3. パーテ...

エラー 1862 (HY000): パスワードの有効期限が切れています。ログインするには、..... を使用してパスワードを変更する必要があります。

エラーメッセージ:エラー 1862 (HY000): パスワードの有効期限が切れています。ログインす...

HttpsページでBaiduシェアを使用するためのソリューション

サイト全体で https アクセスを有効にしてから、共有コードが利用できなくなり、有効になっていた小...

CentOS6.5 でファイル共有サービス Samba を構築するチュートリアル

Samba サービス:このコンテンツはサンバサービス学習者の参考用ですケースの説明:企業の管理者は、...

Centos7.3 での mysql5.7 のインストールと設定のチュートリアル

この記事では、MySQL 5.7のインストールと設定のチュートリアルを参考までに紹介します。具体的な...