きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Dockerのコンテナ間通信をする方法をまとめる

コンテナ間通信をしたい時に、どの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に変更してもアクセスすることができます。

  1. container_nameの「test-container」に変更する
  2. 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

f:id:nainaistar:20210603234501p:plain