For

2023.4.29

docker-compose.ymlで定義したコンテナがホストPCやDockerのnetwork内でどう見えるか

概要

複数のdocker-compose.ymlで定義した同一docker networkにおける各コンテナの見え方と、ホストPCから見た各コンテナの見え方をまとめました。

環境

今回は以下の docker-compose.yml ファイルで定義されたserviceが起動している状態を例にします。
ファイル内容はservice名、ポート番号、networksの定義部分のみ記載します。
ポート番号については、説明用にあえてホストPC側のポート番号はDockerネットワーク側に1足した番号にしています。

docker-compose.yml - A

yml_____docker-compose.yml - A_____services:
  frontend:
    # ...
    ports:
      - 3001:3000

networks:
  sample-network:
    external: true


docker-compose.yml - B

yml_____docker-compose.yml - B_____services:
  backend:
    # ...
    ports:
      - 4001:4000
  db:
    # ...
    ports:
      - 5433:5432

networks:
  sample-network:
    external: true


コンテナの見え方


①同一docker-compose.ymlのコンテナ間

これが一番シンプルで、単純に <<HOST_NAME>>:<<DOCKER_NETWORK_PORT>> で良いので db:5432 となります。
Dockerネットワーク内の中の通信なのでポート番号はDockerネットワーク内でのポート番号を指定します。

②異なるdocker-compose.ymlのコンテナ間

異なる docker-compose.yml で定義されていますが、それぞれ sample-network という同じネットワークとなるように定義しているため、①と同じく <<HOST_NAME>>:<<DOCKER_NETWORK_PORT>> で良いので backend:4000 となります。

③Host PCとコンテナ間

例えば図のDB Viewerからdbのコンテナに接続したい場合 <<HOST_NAME>>:<<HOST_PC_PORT>> となるので localhost:5433 となります。
localhostの5433ポートがDockerネットワークの5432ポートに転送されるので、DB ViewerのようなHost PC上で動作しているアプリケーションからはHOST_NAMEとしてlocalhostを指定します。