59
58

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 5 years have passed since last update.

Docker コンテナ内からホストの IP アドレスを知る

Posted at

以前 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___gateway_address.sh
ip route | awk 'NR==1 {print $3}'

先ほどの例では 172.17.0.1 となる。

ネットワーク範囲

ip_route___network_range.sh
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___gateway_address.sh
route | awk 'NR==3 {print $2}'

先ほどの例では 172.17.0.1 となる。

ネットワーク範囲

route の場合、ネットワークアドレスとサブネットマスクを別々に取ることになる。

ip_route___network_address.sh
route | awk 'NR==4 {print $1}'
ip_route___subnet_mask.sh
route | awk 'NR==4 {print $3}'

先ほどの例では、順に 172.17.0.0 と 255.255.0.0 が出力される。

59
58
1

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
59
58

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?