Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Docker基礎+docker0.9, 0.10概要
Search
Kazuyuki Mori
April 11, 2014
Programming
59
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Docker基礎+docker0.9, 0.10概要
Kazuyuki Mori
April 11, 2014
More Decks by Kazuyuki Mori
See All by Kazuyuki Mori
ライブ配信サーバー完全に理解した
mainyaa
2
840
BitMech 探索的 トレーディングシステム fin-py study #1
mainyaa
0
55
GoPiGo2で遊んでみた
mainyaa
0
44
Electron(旧atom shell)基礎+入門
mainyaa
0
47
Docker基礎+Docker0.9/0.10概要
mainyaa
0
41
Other Decks in Programming
See All in Programming
継続モナドとリアクティブプログラミング
yukikurage
3
620
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
500
自作OSでスライド発表する
uyuki234
1
3.9k
FDEが実現するAI駆動経営の現在地
gonta
2
170
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.2k
AIエージェントで 変わるAndroid開発環境
takahirom
2
690
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
600
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.6k
【やさしく解説 設計編 #1】「ドメイン駆動」と「実装駆動」ってなに? 〜設計の考え方を、たとえ話で学ぼう〜
panda728
PRO
1
120
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.1k
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
1.1k
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
520
Featured
See All Featured
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
180
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.1k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
610
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
240
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
360
Visualization
eitanlees
152
17k
Git: the NoSQL Database
bkeepers
PRO
432
67k
Google's AI Overviews - The New Search
badams
0
1.1k
Transcript
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という仮想ブリッジ上 で実行される(ip link, brctrl) • コンテナの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マスカレード
$ 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 docker0
ホストネットワークで実行 • 良い: ◦ 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-source refs: 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 host2 host1 br0 gre0 br0 gre0 GRE tunnel
Docker + Open vSwitch • 良い点: ◦ 安全。ポータビリティも保ちつつ多数のホストに展開でき る •
悪い点: ◦ IPが被ってしまうおそれがあるため、 goldmann/docker-dhcp などの、DHCPを使う refs: http://d.hatena.ne.jp/xlis/20130317/1363507787
ロックインを避けつつスケール •
ロックインを避けつつスケール • オープンソースのオーケストレーションツールを 使おう ◦ libswarm ◦ Serf, Consul, etcd+fleet
• メンバー追加イベント発行されたら、そのIPを SkyDNSやHAProxyに登録するだけ
まとめ •
まとめ • Dockerは特別なことしてないよ ◦ Dockerのネットワークを隔離してホストネットワークで動 かせばかなり速くなるよ • Docker時代に合わせてネットワークも柔軟にし てみよう ◦
もちろん、インフラがコードになっていることを前提で。開 発環境ではfigを使おう
まとめ • 結局プロヴィジョン環境と環境変数の共有が重 要。 • コンテナIPの解決はSerfやConsulに任せよう • シンプルさを保とう
Thanks Image by Countney McNealy https://www.flickr.com/photos/courageousferret/4500059665