Docker 内側から親OSのサーバにアクセスする

Stackoverflow とかに良く載っている話ですが、すぐ忘れてしまうので、備忘録がてら載せておきます。

2つの Docker イメージが例えばポート 80 をオープンしていたとして、 コンテナ #1 がコンテナ #2 にアクセスする状況を考えます。コンテナ #2 のポート 80 は親 OS のポート 2480 に対応されているので、コンテナ#1 から親 OS の 2480 を呼び出せればコンテナ #1 からコンテナ #2 へのアクセスが可能です。

コンテナ#1において、親の仮想アドレスは 192.168.11.1 となっているため、http://192.168.11.1:2480/ でコンテナ#2 のアクセスが可能になります。

Docker は一度イメージに割り当てた IP アドレスは動かさないように設計しているようです。

コンテナ#1 が接続する仮想ネットワークを知るにはいくつか方法があります。

  • Docker イメージ内から netstat -nr を使う方法
    デフォルトルートは必ず親OS向けとなるため、親OSに割り当てられた仮想インタフェースアドレスを容易に推測できます。
    netstat コマンドがない場合、apt get install net-tools でインストール可能です。
  • docker inspect <ID> | grep IPAddress を使う方法
    docker ps で左端に表示される ID を docker inspect コマンドの引数とし、”IPAddress” という文字列で検索すると、コンテナのIPアドレスを知ることができます。ここから親OSのIPアドレスを推察します。

ホスト名でアクセスしたい場合は docker-compose.yml なら extra_hosts キーを追加します、

extra_hosts:
  - "app2.localhost:192.168.11.1"

を追加しておけば、コンテナ#1から http://app2.localhost:2480/ でアクセスできるようになります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です