Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Docker基礎+docker0.9, 0.10概要
Search
Kazuyuki Mori
April 11, 2014
Programming
64
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
870
BitMech 探索的 トレーディングシステム fin-py study #1
mainyaa
0
57
GoPiGo2で遊んでみた
mainyaa
0
46
Electron(旧atom shell)基礎+入門
mainyaa
0
50
Docker基礎+Docker0.9/0.10概要
mainyaa
0
44
Other Decks in Programming
See All in Programming
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
4
12k
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
520
App Intentsのビルドプロセスを支える技術
kntkymt
0
430
Building an Out-of-Order CPU
latte72
1
800
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
660
JRuby: Past, Present, and Future
headius
0
190
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
540
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
140
Workers Cache を知る
syumai
0
230
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
200
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
340
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.2k
Featured
See All Featured
Navigating Team Friction
lara
192
16k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
820
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
900
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
540
Automating Front-end Workflow
addyosmani
1369
210k
Embracing the Ebb and Flow
colly
88
5.2k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
580
How to Ace a Technical Interview
jacobian
281
24k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
340
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
730
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
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