LoginSignup
17
15

More than 5 years have passed since last update.

Docker事始め - ネットワークについて1

Posted at

Dockerのネットワークについて軽く調べてみました。

環境

  • OS : CentOS release 6.5 (Final)
  • Kernel : 2.6.32-431.17.1.el6.x86_64
  • Docker : docker-io-0.11.1-4.el6.x86_64

ホストOS側のネットワーク

# ifconfig 
docker0   Link encap:Ethernet  HWaddr FE:9B:89:E6:05:BD  
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::c0ad:6ff:fece:6bb0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          <snip>

eth0      Link encap:Ethernet  HWaddr 00:0C:29:EA:83:FF  
          inet addr:192.168.1.174  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:feea:83ff/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          <snip>

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          <snip>

# netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.1.0     *               255.255.255.0   U         0 0          0 eth0
link-local      *               255.255.0.0     U         0 0          0 eth0
172.17.0.0      *               255.255.0.0     U         0 0          0 docker0
default         192.168.0.254   0.0.0.0         UG        0 0          0 eth0

# sysctl -a|grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1

docker0というインタフェースが作成されており、固定IPアドレスが付与されています。
ipv4のフォワード機能も自動で有効になっていました。

コンテナ側のネットワーク

# docker run -i -t centos /bin/bash
bash-4.1#
bash-4.1# ifconfig 
eth0      Link encap:Ethernet  HWaddr 76:93:DD:6B:8C:0D  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::7493:ddff:fe6b:8c0d/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          <snip>

bash-4.1# netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
172.17.0.0      *               255.255.0.0     U         0 0          0 eth0
default         172.17.42.1     0.0.0.0         UG        0 0          0 eth0

コンテナ上ではホストOS上のdocker0に割り振られたネットワークセグメント上のIPアドレスがeth0に付与されています。また、デフォルトゲートウェイはdocker0が指定されています。
ホストOSとコンテナはdocker0を経由してネットワークの疎通が行われているように見えます。
実際に試してみましょう。

疎通を試す

コンテナ ⇒ ホスト

bash-4.1# traceroute 172.17.42.1
bash: traceroute: command not found
# コンテナ側に標準でtracerouteコマンドはないようです。。。CentOSイメージは最小構成なのかな?
bash-4.1# yum -y install traceroute
bash-4.1# traceroute 172.17.42.1
traceroute to 172.17.42.1 (172.17.42.1), 30 hops max, 60 byte packets
 1  172.17.42.1 (172.17.42.1)  0.047 ms !X  0.013 ms !X  0.012 ms !X
bash-4.1# 
bash-4.1# traceroute 192.168.1.174
traceroute to 192.168.1.174 (192.168.1.174), 30 hops max, 60 byte packets
 1  192.168.1.174 (192.168.1.174)  0.046 ms !X  0.015 ms !X  0.011 ms !X
# 2hopかと思ったら1hopでいけるっぽい。。。
bash-4.1# 
bash-4.1# traceroute 192.168.1.175
traceroute to 192.168.1.175 (192.168.1.175), 30 hops max, 60 byte packets
 1  172.17.42.1 (172.17.42.1)  0.048 ms  0.015 ms  0.011 ms
 2  192.168.1.175 (192.168.1.175)  1.184 ms  1.172 ms  1.158 ms
# ホストOS側eth0の別ホストに対してであれば2hop
bash-4.1# 
bash-4.1# traceroute www.opst.co.jp
traceroute to www.opst.co.jp (54.249.236.62), 30 hops max, 60 byte packets
 1  172.17.42.1 (172.17.42.1)  0.038 ms  0.014 ms  0.011 ms
 2  192.168.1.254 (192.168.1.254)  0.352 ms  0.321 ms  0.271 ms
 3  xx.xx.xx.xx
 4  <snip>

bash-4.1# 
# exitコマンドでログアウトするとコンテナが破棄されるため
# Ctrl+p,Ctrl+qでコンテナを起動したままコンテナから抜ける
# 

ホスト ⇒ コンテナ

# traceroute 172.17.42.1
traceroute to 172.17.42.1 (172.17.42.1), 30 hops max, 60 byte packets
 1  172.17.42.1 (172.17.42.1)  0.034 ms  0.010 ms  0.008 ms
# 
# traceroute 172.17.0.2
traceroute to 172.17.0.2 (172.17.0.2), 30 hops max, 60 byte packets
 1  172.17.0.2 (172.17.0.2)  0.499 ms  0.496 ms  0.491 ms
# こちらも1hop。。。

再度ホストOS側のネットワーク

# ifconfig
docker0   Link encap:Ethernet  HWaddr FE:DB:A2:47:0C:29  
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::c0ad:6ff:fece:6bb0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          <snip>

eth0      Link encap:Ethernet  HWaddr 00:0C:29:EA:83:FF  
          inet addr:192.168.3.174  Bcast:192.168.3.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:feea:83ff/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          <snip>

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          <snip>

vethglbLjn Link encap:Ethernet  HWaddr FE:DB:A2:47:0C:29  
          inet6 addr: fe80::fcdb:a2ff:fe47:c29/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          <snip>

コンテナを起動した際にvethインタフェースが作成されるようです。
このインタフェースがナニモノなのかを調べていたら公式サイトのAdvanced networkingに記載がありました。
記載内容によるとvethインタフェースはdocker0インタフェースのブリッジインタフェースのようです。

# ブリッジインタフェースは以下コマンドから確認可能
# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.fedba2470c29       no              vethglbLjn

雑感

  • ホストOSとコンテナのネットワークについてはブリッジで対応している
  • 但しAdvanced networkingを確認していたら、ブリッジ以外のネットワークも可能っぽい
  • 普通に疎通できたのでiptablesは未確認
  • 特殊なことはやっていない

今回はDockerのホストOSとコンテナの疎通について確認しました。
次回はコンテナ上にWebサーバのようなサービスを起動したときの疎通について追ってみたいと思います。

17
15
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
17
15