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/ でアクセスできるようになります。
コメントを残す