Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

Who ● @mainyaa ● Kazuyuki Mori ● フロントエンドからバックエンドまでやる系エンジニア ● AngualrJSとDocker大好き ● Topgate, Inc. - http://www.topgate.co.jp/ ● Happy New World - http://d.hatena.ne.jp/mainyaa

Slide 3

Slide 3 text

Dockerのネットワークの問題 ●

Slide 4

Slide 4 text

Dockerのネットワークの問題 ● 複数ホストでlinkしたいです>< ● 本番の環境は決まっているのだからそれに合 わせてチューニングしたい ● 開発の時とプロダクションを意識しないで複数コ ンテナを連携させたい ● ロックインを避けつつスケールしたい

Slide 5

Slide 5 text

コンテナ間通信の3つの方法 ● -link ● ホストネットワークで実行 ● Open vSwitch

Slide 6

Slide 6 text

潜水してみよう!

Slide 7

Slide 7 text

DockerのNetworking ● 確認してみよう! ● $ ip a ● ifconfigとか使ってるのはおっさんらしいです >< ● http://opcdiary.net/?p=28500 ● RHEL7ではsystem-config-networkは廃止、 ifconfigやrouteなどのnet-toolsが非推奨

Slide 8

Slide 8 text

$ ip a 1: lo: 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: 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: 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

Slide 9

Slide 9 text

$ ip a 1: lo: 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: 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: 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

Slide 10

Slide 10 text

DockerのNetworking ● Dockerコンテナはdocker0という仮想ブリッジ上 で実行される(ip link, brctrl) ● コンテナのeth0はvethXXXXという仮想インター フェイスと接続される ● コンテナが実行時にコンテナごとに異なるipアド レスが払い出される

Slide 11

Slide 11 text

$ sudo docker run base ip a ... 18: eth0: 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

Slide 12

Slide 12 text

$ ip a 1: lo: 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: 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: 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: 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: 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: 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

Slide 13

Slide 13 text

-link ● docker run -link : ○ 既に起動しているDockerコンテナに接続する ○ Dockerが相手の環境変数とホスト名を設定してくれる refs: http://deeeet.com/writing/2014/05/11/docker-network/

Slide 14

Slide 14 text

--name=node1 --name=node2

Slide 15

Slide 15 text

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マスカレード

Slide 16

Slide 16 text

$ ip a 1: lo: 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: 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: 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: 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: 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

Slide 17

Slide 17 text

$ 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

Slide 18

Slide 18 text

$ 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

Slide 19

Slide 19 text

-link ● 良い: ○ 手軽で便利。安全。Dockerが勝手にポートを振り分けて くれる ● 悪い: ○ $ sudo docker inspect --format ' {{ .NetworkSettings.IPAddress }} ' ○ スケールしない ○ 異なるホストにはlinkできない

Slide 20

Slide 20 text

ホストネットワーク機能 ●

Slide 21

Slide 21 text

ホストネットワーク機能 ● docker run --net=host ● docker 0.9から使用可能 ● 仮想ブリッジ(vethXXXXやdocker0)を経由しな いでコンテナ立ち上げ ● コンテナのIP = ホストOSのIP

Slide 22

Slide 22 text

$ ip a 1: lo: 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: 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: 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

Slide 23

Slide 23 text

$ sudo docker run --net=host base ip a 2: eth0: 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: 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

Slide 24

Slide 24 text

Host Docker node1 node2 refs: http://mogproject.blogspot.jp/2014/03/docker-how-networking-of-mac.html eth0 10.240.99.45 docker0

Slide 25

Slide 25 text

ホストネットワークで実行 ● 良い: ○ docker run -pでポート開放も、コンテナのIPを調べる必 要もなくなって便利 ○ 仮想ブリッジもiptablesを通さないので速い

Slide 26

Slide 26 text

ホストネットワークで実行 ● 悪い: ○ ポートが被らないようにしないといけない ○ 安全性が犠牲になるため、本番環境での運用は完全に 別ネットワークにしないといけない

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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-source refs: http://www.slideshare.net/kotto_hihihi/openv-switch

Slide 29

Slide 29 text

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/

Slide 30

Slide 30 text

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 host2 host1 br0 gre0 br0 gre0 GRE tunnel

Slide 31

Slide 31 text

Docker + Open vSwitch ● 良い点: ○ 安全。ポータビリティも保ちつつ多数のホストに展開でき る ● 悪い点: ○ IPが被ってしまうおそれがあるため、 goldmann/docker-dhcp などの、DHCPを使う refs: http://d.hatena.ne.jp/xlis/20130317/1363507787

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

ロックインを避けつつスケール ● オープンソースのオーケストレーションツールを 使おう ○ libswarm ○ Serf, Consul, etcd+fleet ● メンバー追加イベント発行されたら、そのIPを SkyDNSやHAProxyに登録するだけ

Slide 34

Slide 34 text

まとめ ●

Slide 35

Slide 35 text

まとめ ● Dockerは特別なことしてないよ ○ Dockerのネットワークを隔離してホストネットワークで動 かせばかなり速くなるよ ● Docker時代に合わせてネットワークも柔軟にし てみよう ○ もちろん、インフラがコードになっていることを前提で。開 発環境ではfigを使おう

Slide 36

Slide 36 text

まとめ ● 結局プロヴィジョン環境と環境変数の共有が重 要。 ● コンテナIPの解決はSerfやConsulに任せよう ● シンプルさを保とう

Slide 37

Slide 37 text

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