Dive into Docker
ネットワーク
@mainyaa
Image by Countney McNealy https://www.flickr.com/photos/courageousferret/4500059665
Who
● @mainyaa
● Kazuyuki Mori
● フロントエンドからバックエンドまでやる系エンジニア
● AngualrJSとDocker大好き
● Topgate, Inc. - http://www.topgate.co.jp/
● Happy New World - http://d.hatena.ne.jp/mainyaa
Dockerのネットワークの問題
●
Dockerのネットワークの問題
● 複数ホストでlinkしたいです><
● 本番の環境は決まっているのだからそれに合
わせてチューニングしたい
● 開発の時とプロダクションを意識しないで複数コ
ンテナを連携させたい
● ロックインを避けつつスケールしたい
コンテナ間通信の3つの方法
● -link
● ホストネットワークで実行
● Open vSwitch
潜水してみよう!
DockerのNetworking
● 確認してみよう!
● $ ip a
● ifconfigとか使ってるのはおっさんらしいです
><
● http://opcdiary.net/?p=28500
● RHEL7ではsystem-config-networkは廃止、
ifconfigやrouteなどのnet-toolsが非推奨
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast
state UP group default qlen 1000
link/ether 42:01:0a:f0:63:2d brd ff:ff:ff:ff:ff:ff
inet 10.240.99.45/32 brd 10.240.99.45 scope global eth0
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
state UNKNOWN group default
link/ether 9e:7a:ac:ed:32:30 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast
state UP group default qlen 1000
link/ether 42:01:0a:f0:63:2d brd ff:ff:ff:ff:ff:ff
inet 10.240.99.45/32 brd 10.240.99.45 scope global eth0
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
state UNKNOWN group default
link/ether 9e:7a:ac:ed:32:30 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
DockerのNetworking
● Dockerコンテナはdocker0という仮想ブリッジ上
で実行される
● コンテナのeth0はvethXXXXという仮想インター
フェイスと接続される
● コンテナが実行時にコンテナごとに異なるipアド
レスが払い出される
$ sudo docker run base ip a
...
18: eth0: <NO-CARRIER,BROADCAST,UP,LOWER_UP> mtu
1460 qdisc pfifo_fast state DOWN qlen 1000
link/ether ca:2b:5e:2e:ce:78 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.9/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::c82b:5eff:fe2e:ce78/64 scope link tentative
valid_lft forever preferred_lft forever
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen
1000
link/ether 42:01:0a:f0:eb:dd brd ff:ff:ff:ff:ff:ff
inet 10.240.235.221/32 brd 10.240.235.221 scope global eth0
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc noqueue state UP group default
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
23: vethd07b: <BROADCAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast master docker0 state UP group default
qlen 1000
link/ether 52:4f:9d:fe:a0:72 brd ff:ff:ff:ff:ff:ff
25: veth572b: <BROADCAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast master docker0 state UP group default
qlen 1000
link/ether a2:0d:00:82:ef:fa brd ff:ff:ff:ff:ff:ff
29: vethad91: <BROADCAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast master docker0 state UP group default
qlen 1000
link/ether 82:a9:af:0d:73:a2 brd ff:ff:ff:ff:ff:ff
-link
● docker run -link <name>:<alias>
○ 既に起動しているDockerコンテナに接続する
○ Dockerが相手の環境変数とホスト名を設定してくれる
refs: http://deeeet.com/writing/2014/05/11/docker-network/
--name=node1 --name=node2
Ubuntu
Docker
eth0
172.17.0.1
eth0
docker0
vethd07b
172.17.0.2
eth0
veth572b
10.240.99.45
172.17.0.0/16
-icc=[true|false]
docker run --link
refs: http://deeeet.com/writing/2014/05/11/docker-network/
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen
1000
link/ether 42:01:0a:f0:eb:dd brd ff:ff:ff:ff:ff:ff
inet 10.240.235.221/32 brd 10.240.235.221 scope global eth0
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc noqueue state UP group default
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
23: vethd07b: <BROADCAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast master docker0 state UP group default
qlen 1000
link/ether 52:4f:9d:fe:a0:72 brd ff:ff:ff:ff:ff:ff
25: veth572b: <BROADCAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast master docker0 state UP group default
qlen 1000
link/ether a2:0d:00:82:ef:fa brd ff:ff:ff:ff:ff:ff
$ sudo docker run --link redis1:redis1 base env
HOME=/
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=92b3a500b0ef
TERM=xterm
REDIS1_PORT=tcp://172.17.0.2:6379
REDIS1_PORT_6379_TCP=tcp://172.17.0.2:6379
REDIS1_PORT_6379_TCP_ADDR=172.17.0.2
REDIS1_PORT_6379_TCP_PORT=6379
REDIS1_PORT_6379_TCP_PROTO=tcp
REDIS1_NAME=/happy_colden/redis1
$ sudo docker run --link redis1:redis1 base cat /etc/hosts
172.17.0.4 950990b968c2
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 redis1
-link
● 良い:
○ 手軽で便利。安全。Dockerが勝手にポートを振り分けて
くれる
● 悪い:
○ $ sudo docker inspect --format ' {{ .NetworkSettings.
IPAddress }} ' <container id>
○ スケールしない
○ 異なるホストにはlinkできない
ホストネットワーク機能
●
ホストネットワーク機能
● docker run --net=host
● docker 0.9から使用可能
● 仮想ブリッジ(vethXXXXやdocker0)を経由しな
いでコンテナ立ち上げ
● コンテナのIP = ホストOSのIP
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state
UP group default qlen 1000
link/ether 42:01:0a:f0:eb:dd brd ff:ff:ff:ff:ff:ff
inet 10.240.235.221/32 brd 10.240.235.221 scope global eth0
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc noqueue
state UP group default
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
$ sudo docker run --net=host base ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu
1460 qdisc pfifo_fast state UP qlen 1000
link/ether 42:01:0a:f0:eb:dd brd ff:ff:ff:ff:ff:ff
inet 10.240.235.221/32 brd 10.240.235.221 scope global eth0
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP>
mtu 1460 qdisc noqueue state DOWN
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
Host
Docker
node1 node2
refs: http://mogproject.blogspot.jp/2014/03/docker-how-networking-of-mac.html
eth0 10.240.99.45
ホストネットワークで実行
● 良い:
○ docker run -pでポート開放も、コンテナのIPを調べる必
要もなくなって便利
○ 仮想ブリッジもiptablesを通さないので速い
ホストネットワークで実行
● 悪い:
○ ポートが被らないようにしないといけない
○ 安全性が犠牲になるため、本番環境での運用は完全に
別ネットワークにしないといけない
●
image by openvswitch: http://openvswitch.org/
Open vSwitch
● オープンソースの仮想スイッチ
● 柔軟なネットワークが可能になる
○ 転送機能: Bridge, VLAN, STP, LACP, GRE, GRE
over IPsec, CAPWAP
○ 管理機能: NetFlow, sFlow
○ 制御機能: OpenFlow 1.0,1.1,1.2
● sudo apt-get install openvswitch-controller
openvswitch-switch openvswitch-datapath-
sourcerefs: http://www.slideshare.net/kotto_hihihi/openv-switch
Docker + Open vSwitch
● Dockerデーモンのオプションに-b=noneを指定する
● 全てのコンテナをdocker0ブリッジを経由する
● docker0ブリッジはOpen vSwitchから作られたbr0ブリッジ
に接続される
● GRE Tunnelで異なるホスト間のブリッジを接続し、バーチャ
ルなネットワーク空間172.16.42.2/24を構築する
●
refs: http://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/
Open vSwitch Open vSwitch
Docker
eth0
172.16.4
2.21
eth0
docker0
172.16.4
2.14
eth0
refs: http://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/
Docker
eth0
172.16.4
2.13
eth0
docker0
172.16.4
2.15
eth0
host2host1
br0 gre0 br0gre0
GRE tunnel
Docker + Open vSwitch
● 良い点:
○ 安全。ポータビリティも保ちつつ多数のホストに展開でき
る
● 悪い点:
○ IPが被ってしまうおそれがあるため、goldmann/docker-
dhcp などの、DHCPを使う
refs: http://d.hatena.ne.jp/xlis/20130317/1363507787
ロックインを避けつつスケール
●
ロックインを避けつつスケール
● オープンソースのオーケストレーションツールを
使おう
○ SerfやConsul
○ etcd+fleet
● メンバー追加イベント発行されたら、そのIPを
SkyDNSやHAProxyに登録するだけ
まとめ
●
まとめ
● Dockerは特別なことしてないよ
○ Dockerのネットワークを隔離してホストネットワークで動
かせばかなり速くなるよ
● Docker時代に合わせてネットワークも柔軟にし
てみよう
○ もちろん、インフラがコードになっていることを前提で。開
発環境ではfigを使おう
まとめ
● 結局プロヴィジョン環境と環境変数の共有が重
要。
● コンテナIPの解決はSerfやConsulに任せよう
● 複雑になりすぎないように注意
時間が余ったらデモ
● 4つのコンテナをfigで作り、Serfで繋ぐ
● git clone https://github.com/mainyaa/fig-
example-4-container
● https://github.com/centurylinklabs/fig2coreos
時間が余ったらデモ
● Docker + Open vSwitch

Dive into dockerネットワーク

  • 1.
    Dive into Docker ネットワーク @mainyaa Imageby Countney McNealy https://www.flickr.com/photos/courageousferret/4500059665
  • 2.
    Who ● @mainyaa ● KazuyukiMori ● フロントエンドからバックエンドまでやる系エンジニア ● AngualrJSとDocker大好き ● Topgate, Inc. - http://www.topgate.co.jp/ ● Happy New World - http://d.hatena.ne.jp/mainyaa
  • 3.
  • 4.
    Dockerのネットワークの問題 ● 複数ホストでlinkしたいです>< ● 本番の環境は決まっているのだからそれに合 わせてチューニングしたい ●開発の時とプロダクションを意識しないで複数コ ンテナを連携させたい ● ロックインを避けつつスケールしたい
  • 5.
  • 6.
  • 7.
    DockerのNetworking ● 確認してみよう! ● $ip a ● ifconfigとか使ってるのはおっさんらしいです >< ● http://opcdiary.net/?p=28500 ● RHEL7ではsystem-config-networkは廃止、 ifconfigやrouteなどのnet-toolsが非推奨
  • 8.
    $ ip a 1:lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000 link/ether 42:01:0a:f0:63:2d brd ff:ff:ff:ff:ff:ff inet 10.240.99.45/32 brd 10.240.99.45 scope global eth0 valid_lft forever preferred_lft forever 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default link/ether 9e:7a:ac:ed:32:30 brd ff:ff:ff:ff:ff:ff inet 172.17.42.1/16 scope global docker0 valid_lft forever preferred_lft forever
  • 9.
    $ ip a 1:lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000 link/ether 42:01:0a:f0:63:2d brd ff:ff:ff:ff:ff:ff inet 10.240.99.45/32 brd 10.240.99.45 scope global eth0 valid_lft forever preferred_lft forever 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default link/ether 9e:7a:ac:ed:32:30 brd ff:ff:ff:ff:ff:ff inet 172.17.42.1/16 scope global docker0 valid_lft forever preferred_lft forever
  • 10.
  • 11.
    $ sudo dockerrun base ip a ... 18: eth0: <NO-CARRIER,BROADCAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state DOWN qlen 1000 link/ether ca:2b:5e:2e:ce:78 brd ff:ff:ff:ff:ff:ff inet 172.17.0.9/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::c82b:5eff:fe2e:ce78/64 scope link tentative valid_lft forever preferred_lft forever
  • 12.
    $ ip a 1:lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000 link/ether 42:01:0a:f0:eb:dd brd ff:ff:ff:ff:ff:ff inet 10.240.235.221/32 brd 10.240.235.221 scope global eth0 valid_lft forever preferred_lft forever 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc noqueue state UP group default link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff inet 172.17.42.1/16 scope global docker0 valid_lft forever preferred_lft forever 23: vethd07b: <BROADCAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast master docker0 state UP group default qlen 1000 link/ether 52:4f:9d:fe:a0:72 brd ff:ff:ff:ff:ff:ff 25: veth572b: <BROADCAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast master docker0 state UP group default qlen 1000 link/ether a2:0d:00:82:ef:fa brd ff:ff:ff:ff:ff:ff 29: vethad91: <BROADCAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast master docker0 state UP group default qlen 1000 link/ether 82:a9:af:0d:73:a2 brd ff:ff:ff:ff:ff:ff
  • 13.
    -link ● docker run-link <name>:<alias> ○ 既に起動しているDockerコンテナに接続する ○ Dockerが相手の環境変数とホスト名を設定してくれる refs: http://deeeet.com/writing/2014/05/11/docker-network/
  • 14.
  • 15.
  • 16.
    $ ip a 1:lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000 link/ether 42:01:0a:f0:eb:dd brd ff:ff:ff:ff:ff:ff inet 10.240.235.221/32 brd 10.240.235.221 scope global eth0 valid_lft forever preferred_lft forever 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc noqueue state UP group default link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff inet 172.17.42.1/16 scope global docker0 valid_lft forever preferred_lft forever 23: vethd07b: <BROADCAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast master docker0 state UP group default qlen 1000 link/ether 52:4f:9d:fe:a0:72 brd ff:ff:ff:ff:ff:ff 25: veth572b: <BROADCAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast master docker0 state UP group default qlen 1000 link/ether a2:0d:00:82:ef:fa brd ff:ff:ff:ff:ff:ff
  • 17.
    $ sudo dockerrun --link redis1:redis1 base env HOME=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=92b3a500b0ef TERM=xterm REDIS1_PORT=tcp://172.17.0.2:6379 REDIS1_PORT_6379_TCP=tcp://172.17.0.2:6379 REDIS1_PORT_6379_TCP_ADDR=172.17.0.2 REDIS1_PORT_6379_TCP_PORT=6379 REDIS1_PORT_6379_TCP_PROTO=tcp REDIS1_NAME=/happy_colden/redis1
  • 18.
    $ sudo dockerrun --link redis1:redis1 base cat /etc/hosts 172.17.0.4 950990b968c2 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 redis1
  • 19.
    -link ● 良い: ○ 手軽で便利。安全。Dockerが勝手にポートを振り分けて くれる ●悪い: ○ $ sudo docker inspect --format ' {{ .NetworkSettings. IPAddress }} ' <container id> ○ スケールしない ○ 異なるホストにはlinkできない
  • 20.
  • 21.
    ホストネットワーク機能 ● docker run--net=host ● docker 0.9から使用可能 ● 仮想ブリッジ(vethXXXXやdocker0)を経由しな いでコンテナ立ち上げ ● コンテナのIP = ホストOSのIP
  • 22.
    $ ip a 1:lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000 link/ether 42:01:0a:f0:eb:dd brd ff:ff:ff:ff:ff:ff inet 10.240.235.221/32 brd 10.240.235.221 scope global eth0 valid_lft forever preferred_lft forever 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc noqueue state UP group default link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff inet 172.17.42.1/16 scope global docker0 valid_lft forever preferred_lft forever
  • 23.
    $ sudo dockerrun --net=host base ip a 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP qlen 1000 link/ether 42:01:0a:f0:eb:dd brd ff:ff:ff:ff:ff:ff inet 10.240.235.221/32 brd 10.240.235.221 scope global eth0 valid_lft forever preferred_lft forever 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1460 qdisc noqueue state DOWN link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff inet 172.17.42.1/16 scope global docker0 valid_lft forever preferred_lft forever
  • 24.
  • 25.
    ホストネットワークで実行 ● 良い: ○ dockerrun -pでポート開放も、コンテナのIPを調べる必 要もなくなって便利 ○ 仮想ブリッジもiptablesを通さないので速い
  • 26.
    ホストネットワークで実行 ● 悪い: ○ ポートが被らないようにしないといけない ○安全性が犠牲になるため、本番環境での運用は完全に 別ネットワークにしないといけない
  • 27.
    ● image by openvswitch:http://openvswitch.org/
  • 28.
    Open vSwitch ● オープンソースの仮想スイッチ ●柔軟なネットワークが可能になる ○ 転送機能: Bridge, VLAN, STP, LACP, GRE, GRE over IPsec, CAPWAP ○ 管理機能: NetFlow, sFlow ○ 制御機能: OpenFlow 1.0,1.1,1.2 ● sudo apt-get install openvswitch-controller openvswitch-switch openvswitch-datapath- sourcerefs: http://www.slideshare.net/kotto_hihihi/openv-switch
  • 29.
    Docker + OpenvSwitch ● Dockerデーモンのオプションに-b=noneを指定する ● 全てのコンテナをdocker0ブリッジを経由する ● docker0ブリッジはOpen vSwitchから作られたbr0ブリッジ に接続される ● GRE Tunnelで異なるホスト間のブリッジを接続し、バーチャ ルなネットワーク空間172.16.42.2/24を構築する ● refs: http://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/
  • 30.
    Open vSwitch OpenvSwitch Docker eth0 172.16.4 2.21 eth0 docker0 172.16.4 2.14 eth0 refs: http://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/ Docker eth0 172.16.4 2.13 eth0 docker0 172.16.4 2.15 eth0 host2host1 br0 gre0 br0gre0 GRE tunnel
  • 31.
    Docker + OpenvSwitch ● 良い点: ○ 安全。ポータビリティも保ちつつ多数のホストに展開でき る ● 悪い点: ○ IPが被ってしまうおそれがあるため、goldmann/docker- dhcp などの、DHCPを使う refs: http://d.hatena.ne.jp/xlis/20130317/1363507787
  • 32.
  • 33.
    ロックインを避けつつスケール ● オープンソースのオーケストレーションツールを 使おう ○ SerfやConsul ○etcd+fleet ● メンバー追加イベント発行されたら、そのIPを SkyDNSやHAProxyに登録するだけ
  • 34.
  • 35.
    まとめ ● Dockerは特別なことしてないよ ○ Dockerのネットワークを隔離してホストネットワークで動 かせばかなり速くなるよ ●Docker時代に合わせてネットワークも柔軟にし てみよう ○ もちろん、インフラがコードになっていることを前提で。開 発環境ではfigを使おう
  • 36.
  • 37.
    時間が余ったらデモ ● 4つのコンテナをfigで作り、Serfで繋ぐ ● gitclone https://github.com/mainyaa/fig- example-4-container ● https://github.com/centurylinklabs/fig2coreos
  • 38.