コンテナ間通信をしたい時に、どのURLを指定すれば通信できるか分からなかったので、それを調べた時のメモです。
Dockerを単体でrunさせることは想定していないため、docker compose
で起動する前提で記載いたします。
環境
- Docker
- version 20.10.5, build 55c4c88
話さないこと
docker compose
の使い方
要約
- 同一のbridgeのネットワークに所属する
- EXPOSEしているポートを設定する
- 次のドメインのいずれかで接続する
- サービス名
- ホスト名
- コンテナ名
- CONTAINER ID
今回の記事でやること
SpringBootで作成したアプリケーションのコンテナから、PostgreSQLのコンテナに対して接続する。起動後に正常起動していることを確認する。
curl http://localhost:80/actuator/health # 返却値 # {"status":"UP"} # が帰ってきたら、正常起動していることを確認できる
アプリケーションからPostgreSQLに接続しに行っているURLは以下の通りです。
url: jdbc:postgresql://database:5432/database
docker-compose.ymlの設定方法
今回使用するdocker-compose.ymlファイルは以下の通りです。起動はdocker compose up -d
を使用して下さい。
version: '3.8' services: app: image: kirimaru/test-application:latest restart: always ports: - 80:80 database: image: postgres:latest container_name: test-container hostname: test-host environment: POSTGRES_PASSWORD: pass POSTGRES_USER: user POSTGRES_DB: database
今回はサービス名の「database」が一致しているために、アクセスできています。アクセス可能なホスト名は「database」だけでなく、次のURLに変更してもアクセスすることができます。
- container_nameの「test-container」に変更する
- hostnameの「test-host」に変更する
CONTAINER_IDを指定して接続する方法もありますが、名称を固定できないので個人的には非推奨です。
接続可能なホスト名の確認方法
docker inspect
で接続可能なホスト名を確認することができます。先ほどのファイルで起動したpostgres
を元に確認してみましょう。
docker ps # 返却値 # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # 685b4c676004 kirimaru/test-application:latest "java -jar /app.jar" 47 seconds ago Up 18 seconds 0.0.0.0:80->80/tcp deploy_app_1 # 0c5ea064f96a postgres:latest "docker-entrypoint.s…" 47 seconds ago Up 44 seconds 5432/tcp test-container docker inspect 0c5ea064f96a # 返却値 # 大きめのJsonが返却されるので、必要な個所を抜き出します # $[0].Name # "Name": "/test-container", # $[0].NetworkSettings.Networks.deploy_default.Aliases # "Aliases": [ # "0c5ea064f96a", # "database", # "test-host" # ],
このコマンドから、URLのホスト名を次のうちどれかにすると疎通が可能であることが分かります。
- test-container
- container_name
- 0c5ea064f96a
- CONTAINER_ID
- database
- ホスト名
- test-host
- hostname
具体的なURLは以下の通りです。
http://test-container http://0c5ea064f96a http://database http://test-host
接続先PORTの確認
イメージ元ファイルにてEXPOSE
しているポートがありますので、そのポートを指定すると接続できます。
ポートフォーワードでハイポートを指定することはありますが、ハイポートでは接続できませんので注意してください。
次の設定では、コンテナ間通信をするためには5432
ポートにアクセスする必要があります。ハイポートの15432
ではコンテナ間通信はできません。
postgres: image: postgres:latest ports: - "15432:5432"
同一ネットワークに所属させる方法
基本は特に何も設定せずとも、デフォルトネットワークで接続できます。別のネットワークに所属させたい時は、networks
に値を設定します。新規にネットワークを作成する、既存のネットワークを使用する等に関しては、今回の記事では深く紹介しませんので、調べてみてください。
次の設定で新規に作成した「kirimaru-network」に対して、アプリケーションもDBも「kirimaru-network」に所属させることができます。
services: app: # ... 省略 networks: [kirimaru-network] database: # ... 省略 networks: [kirimaru-network] networks: kirimaru-network: driver: bridge
ソースコード
接続できる状態でコミットしています。
docker-compose.yml - github.com
終わりに
意外と接続が簡単にできるせいで、docker-compose.ymlのどの項目が実際に影響しているのかを把握するのに時間がかかりました。
基本は公式ヘルプを読めばいいので、この記事の見どころはdocker inspect
の使い方かもしれませんね。
なかなか調べることが多くて、楽しかったです。
この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。
参考
docker docs: Container networking docs.docker.com
Docker-docs-ja: Composeのネットワーク機能 docs.docker.jp