Dockerコンテナーは、単なる分離ではありません。Dockerコンテナーは、相互に直接通信する必要があるプロセスを管理するためによく使用されます。ただし、通信するには、多くの場合、各コンテナのIPアドレスを知っている必要があります。これは、いくつかのコマンドで見つけることができます。
ユーザー定義のブリッジの使用を検討してください
Dockerネットワーキングは少し複雑です。デフォルトで起動されたコンテナは、デフォルトの「ブリッジネットワーク」に配置され、プライベートIPアドレスがあれば、他のコンテナと直接通信できます。これは真の分離のためにオフにすることができますが、デフォルトではオフになりません。
ポートをバインドしたくない場合は、このアドレスを使用してホストOSから通信することもできます。これは、IPアドレスを介してコンテナに直接アクセスする主な使用例ですが、ポートをバインドする必要があります(ファイアウォールでインターネットから閉じたままにしておくことができます)。
ただし、IPアドレスは一時的なものであり、コンテナを停止および開始すると簡単に壊れることがあります。コンテナー間の通信については、Dockerはユーザー定義のブリッジネットワークを介したソリューションを提供します。これは、複数のコンテナーが相互に通信している場合に使用する必要があります。
デフォルト以外のネットワークに追加されたコンテナは、エイリアスを介して相互にアクセスでき、プライベートIPに自動的に解決されます。新しいネットワークを作成し、それらのネットワークでコンテナを実行し、既存のコンテナをネットワークに接続できます。その後、エイリアスをホスト名として使用して他のコンテナにアクセスできます。たとえば、ここのNGINXコンテナは、接続文字列mongodb://mongohost:27017
を使用してMongoDBインスタンスにアクセスできます。 。
docker network create example docker run --net example --name nginx -d nginx docker network connect example --alias mongohost mongodb
ブリッジを使用することには多くの利点があり、従来の--link
よりも推奨されます オプション。デフォルトネットワークで機能します。主な問題は、ユーザー定義ネットワーク内のコンテナは、公開されているかどうかに関係なく、互いのポートに公開されることですが、複数のネットワークを設定できるため、通常は問題になりません。
もう1つの欠点は、ユーザー定義のネットワークはより優れた分離を提供するため、プライベートIPアドレスを使用してネットワーク全体のコンテナーにアクセスできないことです。デフォルトネットワーク内のすべてのコンテナは相互に通信できますが、コンテナが削除されてユーザー定義ネットワークに配置されると、その機能は無効になります。ただし、デフォルトのネットワークとユーザー定義のネットワークの両方でコンテナを起動することもできるため、コンテナを他のユーザーに表示することを選択しても問題ありません。
DockerからIPアドレスを取得する
ただし、IPアドレスだけが必要な場合は、ホストOSから取得するのは非常に簡単です。まず、情報を取得するコンテナのIDまたは名前を見つける必要があります。これは、次の方法で実行できます。
docker ps
次に、docker inspect
を実行します 、コンテナに関するすべての情報を含む巨大なJSONファイルを返します。ただし、関心があるのはIPアドレスだけなので、-f
を使用してフォーマットオプションを渡すことができます。 アドレスだけに絞り込みます。
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' name_or_id
このコマンドはうまく機能しますが、IDが必要な1つのコンテナの情報のみを返します。より具体的なソリューションが必要な場合は、docker network inspect
を使用できます。 これは、指定されたネットワーク内のすべてのコンテナーに関する情報を出力し、オプションでJSONルックアップテーブルとしてフォーマットします:
docker network inspect bridge -f '{{json .Containers}}'
コンテナからネットワーク構成を取得する
Dockerコンテナーは実際には単なる分離メカニズムであり、コンテナーに入ってifconfig
などの通常のLinuxコマンドを実行することを妨げるものは何もありません。 その方法でIPアドレスを取得します。
そのためには、docker ps
でコンテナ名またはIDを取得する必要があります 、次にexec -it
を実行します 、この場合、すべてのIP情報を印刷します:
docker exec -it b94ef3169cd4 ip a