5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

dockerコンテナにサブドメインなどもまとめて1つのIPに名前解決する

Last updated at Posted at 2020-03-17

やりたいこと

  1. docker-composeで立ち上げたコンテナから任意のホストに名前解決したい
  2. docker-networkには参加させない(E2EテストやブラウザでURLを打ってアクセスさせるなど)
  3. かつ、サブドメインで同じIPに名前解決したい

// TODO: つまりどういうことだってばよ (説明する)

2までの場合

例として、uyu.pun ドメインを192.168.1.11に受け流すように変更してみます。

// TODO: extra_hostsが何をしているのか

docker-compose.yml
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 ファイルを参照した結果です。(他の項目は省いています)

/etc/hosts
192.168.1.11 uyu.pun

鬼の仕様変更

…ではないと思いますが、サブドメインで同じホストの別ポートにマッピングしたい、といった状況になったとします。

例として、admin.uyu.pun も192.168.1.11に向けてみます。

docker-compose.yml
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

↓出力後

/etc/hosts
192.168.1.11 uyu.pun
192.168.1.11 admin.uyu.pun

この状態でpingを打つと失敗します。どうもhostsファイルの仕様っぽいです。
参考: Hostsファイル:複数の行に同じIPアドレスがあるのは間違っていますか?
ざっくりとしか読んでいませんが、先に書いたほうが優先される?模様。

対策 : コロンより前をスペース区切りで記述する

docker-compose.yml
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ファイルの確認

/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の環境変数を展開する場合は"で囲うようです。

docker-compose.yml
...
extra_hosts:
  - "uyu.pun admin.uyu.pun:${HOST_MACHINE_IP}"
...
.env
HOST_MACHINE_IP=192.168.1.11

課題

記入するドメインが増えると横に長くなっていってしまうので、ymlファイル上では改行してきれいに表示したい。。

おわりに

uyu.punって何?うゆぷん?って方へ
こちら

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?