はじめに
コンテナ同士で通信するときに、docker composeで 1つのymlでコンテナ構築したり、あとからdocker networkで設定入れる必要があると思っていたのですが、コンテナ構築時にextra-hosts で簡単に追加設定できることを知りました。。。
もうちょっと早くに知りたかったという自戒も込めてメモ残しです。。。
確認環境
- windows10 pro
- wsl2(20.04.5 LTS (Focal Fossa))
- Dockerのバージョン
- Docker version 20.10.18, build b40c2f6
- docker-compose version 1.29.2, build 5becea4c
※Docker Desktop ではありません
構成イメージ図
設定方法例
コンテナA
services:
app:
image: tempimage1
# ↓ リクエストする側に以下の設定を入れる
extra_hosts:
- host.docker.internal:host-gateway
コンテナB
services:
app:
image: tempimage2
# 受信ポート指定
ports:
- 50001:50000
設定概要
-
host.docker.internal
については、ホスト名で使える文字列なら何でもよいが、公式のドキュメントでこの名前がつかわれているので、特に変更する必要はないかと - 上記の設定を共通で入れていると、コンテナ内部で (上記の場合であれば、
host.docker.internal:50001
)で通信できる - 外部と内部で違う場合は、外部から接続できるポート番号を指定する
- 上記からわかることではあるが、
ports
等で外部から接続できる設定についてはやり取り可能ではあるが、expose
設定のようにDocker内部のみの接続設定のみを可能にしている場合は、この設定で通信することはできない(この場合はnetworkグループの設定が必要) - ちゃんと設定が入っているかを確認するときは、コンテナ内で
cat /ect/hosts
を実行し、ファイルに設定が追加されていれば問題ない$ cat /etc/hosts 127.0.0.1 localhost <省略...> 172.17.0.1 host.docker.internal 172.30.0.2 f5e65b3fb6ae
余談
socket通信でbindするときのIP設定で、0.0.0.0
を使っていたが、 環境変数の hostname を使用すると内部のIPで名称解決できる(上記のf5e65b3fb6ae
が設定されている)ので、このあたりもうまく使っていきたい
さいごに
知らなくても何とかなっていたが、効率的に管理できる仕組みは積極的に取り入れないと…と思っている次第です。。