dive into dockerネットワーク

38
Dive into Docker ネットワーク @mainyaa Image by Countney McNealy https://www.flickr.com/photos/courageousferret/4500059665

Upload: kazuyuki-mori

Post on 08-Sep-2014

5.489 views

Category:

Technology


6 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Dive into dockerネットワーク

Dive into Dockerネットワーク@mainyaa

Image by Countney McNealy https://www.flickr.com/photos/courageousferret/4500059665

Page 2: Dive into dockerネットワーク

Who

● @mainyaa

● Kazuyuki Mori

● フロントエンドからバックエンドまでやる系エンジニア

● AngualrJSとDocker大好き

● Topgate, Inc. - http://www.topgate.co.jp/

● Happy New World - http://d.hatena.ne.jp/mainyaa

Page 3: Dive into dockerネットワーク

Dockerのネットワークの問題

Page 4: Dive into dockerネットワーク

Dockerのネットワークの問題

● 複数ホストでlinkしたいです><

● 本番の環境は決まっているのだからそれに合

わせてチューニングしたい

● 開発の時とプロダクションを意識しないで複数コ

ンテナを連携させたい

● ロックインを避けつつスケールしたい

Page 5: Dive into dockerネットワーク

コンテナ間通信の3つの方法

● -link

● ホストネットワークで実行

● Open vSwitch

Page 6: Dive into dockerネットワーク

潜水してみよう!

Page 7: Dive into dockerネットワーク

DockerのNetworking

● 確認してみよう!

● $ ip a

● ifconfigとか使ってるのはおっさんらしいです

><

● http://opcdiary.net/?p=28500

● RHEL7ではsystem-config-networkは廃止、

ifconfigやrouteなどのnet-toolsが非推奨

Page 8: Dive into dockerネットワーク

$ 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

Page 9: Dive into dockerネットワーク

$ 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

Page 10: Dive into dockerネットワーク

DockerのNetworking

● Dockerコンテナはdocker0という仮想ブリッジ上

で実行される

● コンテナのeth0はvethXXXXという仮想インター

フェイスと接続される

● コンテナが実行時にコンテナごとに異なるipアド

レスが払い出される

Page 11: Dive into dockerネットワーク

$ 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

Page 12: Dive into dockerネットワーク

$ ip a1: 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 forever2: 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 forever3: 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 forever23: 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:ff25: 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:ff29: 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

Page 13: Dive into dockerネットワーク

-link

● docker run -link <name>:<alias>○ 既に起動しているDockerコンテナに接続する

○ Dockerが相手の環境変数とホスト名を設定してくれる

refs: http://deeeet.com/writing/2014/05/11/docker-network/

Page 14: Dive into dockerネットワーク

--name=node1 --name=node2

Page 15: Dive into dockerネットワーク

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/

Page 16: Dive into dockerネットワーク

$ ip a1: 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 forever2: 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 forever3: 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 forever23: 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:ff25: 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

Page 17: Dive into dockerネットワーク

$ sudo docker run --link redis1:redis1 base envHOME=/PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binHOSTNAME=92b3a500b0efTERM=xtermREDIS1_PORT=tcp://172.17.0.2:6379REDIS1_PORT_6379_TCP=tcp://172.17.0.2:6379REDIS1_PORT_6379_TCP_ADDR=172.17.0.2REDIS1_PORT_6379_TCP_PORT=6379REDIS1_PORT_6379_TCP_PROTO=tcpREDIS1_NAME=/happy_colden/redis1

Page 18: Dive into dockerネットワーク

$ sudo docker run --link redis1:redis1 base cat /etc/hosts172.17.0.4 950990b968c2127.0.0.1 localhost::1 localhost ip6-localhost ip6-loopbackfe00::0 ip6-localnetff00::0 ip6-mcastprefixff02::1 ip6-allnodesff02::2 ip6-allrouters172.17.0.2 redis1

Page 19: Dive into dockerネットワーク

-link

● 良い:

○ 手軽で便利。安全。Dockerが勝手にポートを振り分けて

くれる

● 悪い:

○ $ sudo docker inspect --format ' {{ .NetworkSettings.

IPAddress }} ' <container id>

○ スケールしない

○ 異なるホストにはlinkできない

Page 20: Dive into dockerネットワーク

ホストネットワーク機能

Page 21: Dive into dockerネットワーク

ホストネットワーク機能

● docker run --net=host

● docker 0.9から使用可能

● 仮想ブリッジ(vethXXXXやdocker0)を経由しな

いでコンテナ立ち上げ

● コンテナのIP = ホストOSのIP

Page 22: Dive into dockerネットワーク

$ ip a1: 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 forever2: 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 forever3: 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

Page 23: Dive into dockerネットワーク

$ sudo docker run --net=host base ip a2: 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 forever3: 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

Page 24: Dive into dockerネットワーク

Host

Docker

node1 node2

refs: http://mogproject.blogspot.jp/2014/03/docker-how-networking-of-mac.html

eth0 10.240.99.45

Page 25: Dive into dockerネットワーク

ホストネットワークで実行

● 良い:

○ docker run -pでポート開放も、コンテナのIPを調べる必

要もなくなって便利

○ 仮想ブリッジもiptablesを通さないので速い

Page 26: Dive into dockerネットワーク

ホストネットワークで実行

● 悪い:○ ポートが被らないようにしないといけない

○ 安全性が犠牲になるため、本番環境での運用は完全に

別ネットワークにしないといけない

Page 27: Dive into dockerネットワーク

image by openvswitch: http://openvswitch.org/

Page 28: Dive into dockerネットワーク

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

Page 29: Dive into dockerネットワーク

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/

Page 30: Dive into dockerネットワーク

Open vSwitch Open vSwitch

Docker

eth0

172.16.42.21

eth0

docker0

172.16.42.14

eth0

refs: http://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/

Docker

eth0

172.16.42.13

eth0

docker0

172.16.42.15

eth0

host2host1

br0 gre0 br0gre0

GRE tunnel

Page 31: Dive into dockerネットワーク

Docker + Open vSwitch

● 良い点:

○ 安全。ポータビリティも保ちつつ多数のホストに展開でき

● 悪い点:

○ IPが被ってしまうおそれがあるため、goldmann/docker-

dhcp などの、DHCPを使う

refs: http://d.hatena.ne.jp/xlis/20130317/1363507787

Page 32: Dive into dockerネットワーク

ロックインを避けつつスケール

Page 33: Dive into dockerネットワーク

ロックインを避けつつスケール

● オープンソースのオーケストレーションツールを

使おう

○ SerfやConsul

○ etcd+fleet

● メンバー追加イベント発行されたら、そのIPを

SkyDNSやHAProxyに登録するだけ

Page 34: Dive into dockerネットワーク

まとめ

Page 35: Dive into dockerネットワーク

まとめ

● Dockerは特別なことしてないよ

○ Dockerのネットワークを隔離してホストネットワークで動

かせばかなり速くなるよ

● Docker時代に合わせてネットワークも柔軟にし

てみよう

○ もちろん、インフラがコードになっていることを前提で。開

発環境ではfigを使おう

Page 36: Dive into dockerネットワーク

まとめ

● 結局プロヴィジョン環境と環境変数の共有が重

要。

● コンテナIPの解決はSerfやConsulに任せよう

● 複雑になりすぎないように注意

Page 37: Dive into dockerネットワーク

時間が余ったらデモ

● 4つのコンテナをfigで作り、Serfで繋ぐ

● git clone https://github.com/mainyaa/fig-

example-4-container

● https://github.com/centurylinklabs/fig2coreos

Page 38: Dive into dockerネットワーク

時間が余ったらデモ

● Docker + Open vSwitch