Docker は、開発者やオペレーターがアプリケーションを簡単に作成、デプロイ、実行できるようにする、人気のあるオープン ソースのコンテナ化プラットフォームです。 Docker は、単一ホスト上で複数の仮想コンテナを実行することで分離を実現し、それぞれが異なるアプリケーションまたはサービスを実行できます。
しかし、場合によっては、複数の Docker コンテナーが同じホストにデプロイされており、コンテナーが相互にアクセスできないという問題が発生することがあります。コンテナ間の通信はアプリケーションの正常な動作の鍵であるため、これは開発、運用および保守の担当者にとって非常に面倒です。
この記事では、Docker コンテナーが相互に通信できない理由とその解決策について説明します。
各 Docker コンテナにはデフォルトで IP アドレスが割り当てられ、この IP アドレスはホスト マシン上でのみアクセスできます。複数のコンテナに同じ IP アドレスが割り当てられている場合、コンテナは相互にアクセスできません。このとき、コンテナのネットワークアドレスを再設定する必要があります。
まず、 docker network ls コマンドを使用して、Docker のネットワーク構成を表示します。たとえば、次のコマンドを使用してデフォルトのネットワーク情報を表示できます:
$ docker network ls
次に、docker network Inspection コマンドを使用して、コンテナのネットワーク構成を表示できます。たとえば:
$ docker network inspect bridge
コンテナの場合 ネットワーク構成に問題がある場合は、次のコマンドを使用してコンテナを再起動し、IP アドレスを指定できます。
$ docker run -itd --name mycontainer1 --network mynetwork --ip 172.18.0.10 myimage
このコマンドでは、名前、ネットワーク名、および IP アドレスを指定します。コンテナのIPアドレス。
Docker コンテナーが相互にアクセスできないもう 1 つの理由は、セキュリティ グループが正しく構成されていないことです。セキュリティ グループは、コンテナに出入りするネットワーク トラフィックを制御する仮想ファイアウォールです。コンテナのセキュリティ グループ ルールが他のコンテナのアクセスを許可していない場合、コンテナは相互にアクセスできません。
Docker のネットワーク設定を使用して、セキュリティ グループ ルールを構成できます。たとえば、次のコマンドを使用して新しいネットワークを作成し、コンテナ間の通信ルールを指定できます。
$ docker network create --subnet 172.18.0.0/16 mynetwork
このコマンドでは、mynetwork という名前の新しいネットワークを作成し、このネットワークのサブネットを指定します。
次に、docker run コマンドを使用してコンテナを起動し、ネットワークに追加します。たとえば、次のコマンドを使用して 2 つのコンテナを起動し、 mynetwork ネットワークに追加できます。
$ docker run -d --name mycontainer1 --network mynetwork --ip 172.18.0.2 myimage $ docker run -d --name mycontainer2 --network mynetwork --ip 172.18.0.3 myimage
このコマンドでは、2 つのコンテナをそれぞれ起動し、 mynetwork ネットワークに割り当てます。各コンテナが相互に通信できるように、各コンテナの IP アドレスを指定していることに注意してください。
最後に、iptables コマンドを使用してセキュリティ グループ ルールを構成できます。例:
$ iptables -I DOCKER-USER -i mynetwork ! -s 172.18.0.0/16 -d 172.18.0.0/16 -j DROP
このコマンドでは、他のネットワークが mynetwork ネットワークのコンテナにアクセスできないようにするルールを指定します。 。このようにして、コンテナ間の通信が安全であることを保証できます。
Docker コンテナはコンテナ名と IP アドレスを介して相互にアクセスできることがわかっています。ただし、コンテナ名を IP アドレスに解決できない場合、コンテナは相互にアクセスできません。
現時点では、Docker の DNS サーバーを構成する必要があります。 Docker はデフォルトの Google DNS サーバーを使用してドメイン名を解決しますが、他の DNS サーバーを使用することもできます。
Docker の DNS サーバーを構成するには、Docker の daemon.json ファイルを編集します。たとえば、Linux システムでは、次のコマンドを使用してこのファイルを開くことができます:
$ sudo vi /etc/docker/daemon.json
このファイルでは、Docker の DNS サーバーを指定できます。例:
{ "dns": ["8.8.8.8", "8.8.4.4"] }
この構成では、Google の DNS サーバーである 2 つの DNS サーバーを指定します。
完了後、Docker サービスを再起動して構成を有効にします。
$ sudo systemctl restart docker
これで、Docker コンテナーの名前を使用して他のコンテナーにアクセスできるようになります。
結論
Docker コンテナーが相互に通信できない問題は、コンテナーのネットワーク構成、セキュリティ グループ構成、または DNS 構成に問題がある可能性があります。これらの構成を確認し、必要な変更を加えることで、この問題を簡単に解決できます。
以上がDocker コンテナーが相互に通信できない場合はどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。