やりたいこと
- docker-composeで立ち上げたコンテナから任意のホストに名前解決したい
- docker-networkには参加させない(E2EテストやブラウザでURLを打ってアクセスさせるなど)
- かつ、サブドメインで同じIPに名前解決したい
// TODO: つまりどういうことだってばよ (説明する)
2までの場合
例として、uyu.pun
ドメインを192.168.1.11に受け流すように変更してみます。
// TODO: extra_hostsが何をしているのか
version: '3'
services:
app:
image: node:13.10.1
ports:
- 3000:3000
# ↓ 足す
extra_hosts:
- 'uyu.pun:192.168.1.11'
command: "node app.js"
volumes:
- ./:/src
working_dir: /src
参考: Docker で Node.js 開発環境を簡単に用意する
ポートについては固定値に変更させていただきました。
↓コンテナ立ち上げ後、シェルで /etc/hosts
ファイルを参照した結果です。(他の項目は省いています)
192.168.1.11 uyu.pun
鬼の仕様変更
…ではないと思いますが、サブドメインで同じホストの別ポートにマッピングしたい、といった状況になったとします。
例として、admin.uyu.pun
も192.168.1.11に向けてみます。
version: '3'
services:
app:
image: node:13.10.1
ports:
- 3000:3000
# 失敗する
extra_hosts:
- 'uyu.pun:192.168.1.11'
- 'admin.uyu.pun:192.168.1.11'
command: 'node app.js'
volumes:
- ./:/src
working_dir: /src
↓出力後
192.168.1.11 uyu.pun
192.168.1.11 admin.uyu.pun
この状態でpingを打つと失敗します。どうもhostsファイルの仕様っぽいです。
参考: Hostsファイル:複数の行に同じIPアドレスがあるのは間違っていますか?
ざっくりとしか読んでいませんが、先に書いたほうが優先される?模様。
対策 : コロンより前をスペース区切りで記述する
version: '3'
services:
app:
image: node:13.10.1
ports:
- 3000:3000
# コロンより前をスペース区切りで記述する
extra_hosts:
- 'uyu.pun admin.uyu.pun:192.168.1.11'
command: 'node app.js'
volumes:
- ./:/src
working_dir: /src
↓起動後の /etc/hosts
ファイルの確認
192.168.1.11 uyu.pun admin.uyu.pun
pingを打ってみます。
# ping uyu.pun
PING uyu.pun (192.168.1.11) 56(84) bytes of data.
From 192.168.1.22 (192.168.1.22) icmp_seq=1 Destination Host Unreachable
^c
# ping admin.uyu.pun
PING uyu.pun (192.168.1.11) 56(84) bytes of data.
From 192.168.1.22 (192.168.1.22) icmp_seq=1 Destination Host Unreachable
無事、2つのドメインを同じIPに名前解決できた。(IPアドレスは適当にしたので疎通できていませんが、期待したIPにpingを投げていることがわかると思います。)
応用
今回これを試したのは、なるべく実運用に近い環境でE2Eテストの実行をしたいという背景でした。
各自のローカルマシンのdockerコンテナ上にあるサーバーにリクエストを向けるために、IPアドレスの部分は変数にし、参照元の.env
ファイルは以下のようにし .gitignoreしています。
ちなみに、.envの環境変数を展開する場合は"で囲うようです。
...
extra_hosts:
- "uyu.pun admin.uyu.pun:${HOST_MACHINE_IP}"
...
HOST_MACHINE_IP=192.168.1.11
課題
記入するドメインが増えると横に長くなっていってしまうので、ymlファイル上では改行してきれいに表示したい。。
おわりに
uyu.punって何?うゆぷん?って方へ
こちら