以前 Docker のコンテナ内から、ホストで立ち上げているサーバーの機能にアクセスするという少し変わった使い方をした。
そのときは Docker 標準のネットワーク設定を使ったためホストのアドレス 172.17.0.1
をスクリプトに直接記述したのだが、この値はネットワークの設定によっては変化する可能性がある。
なんとなく不便。ネットワーク環境に関わらず、ホストのアドレスを正しく扱いたい。
というわけで、コマンドで簡単に抽出する方法を調べてみた。
環境
- Ubuntu 15.04
- ホストもコンテナも同じ。
- Docker 1.9.1
ざっくり言うと
コンテナの eth0 が利用するゲートウェイのアドレスが、コンテナから見えるホストのアドレスになっている。
これを抽出すればいい。
抽出
ip route
Docker 標準のネットワーク設定を使って、コンテナ内でコマンドを実行したときの出力は以下。
$ ip route
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.2
ここから抽出する。
ホストの IP アドレス
ip route | awk 'NR==1 {print $3}'
先ほどの例では 172.17.0.1 となる。
ネットワーク範囲
ip route | awk 'NR==2 {print $1}'
先ほどの例では 172.17.0.0/16 となる。 CIDR 形式。
route
ip
コマンドなんて新しすぎてうちのコンテナにはない、という状況では route
コマンドを使う。
コンテナ内での出力例は以下。
$ route
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.17.0.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 * 255.255.0.0 U 0 0 0 eth0
ホストの IP アドレス
route | awk 'NR==3 {print $2}'
先ほどの例では 172.17.0.1 となる。
ネットワーク範囲
route
の場合、ネットワークアドレスとサブネットマスクを別々に取ることになる。
route | awk 'NR==4 {print $1}'
route | awk 'NR==4 {print $3}'
先ほどの例では、順に 172.17.0.0 と 255.255.0.0 が出力される。