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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
860
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
What We Talk About When We Talk About XP
m_seki
2
620
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
160
A2UI for Android: Safely Rendering AI-Generated UI with Jetpack Compose - DroidKaigi 2026
itsmedreamwalker
0
140
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
490
How I Stole PSI from Android Studio - DroidKaigi2026
worker8
0
130
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
120
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
470
AHC070解法紹介
eijirou
0
120
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
110
TiDB Cloudのカスタムコントローラーによるオートスケール対応
takaidohigasi
0
120
SREの越境 / SRE Collaboration
y0hgi
0
120
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
110
Featured
See All Featured
Utilizing Notion as your number one productivity tool
mfonobong
4
590
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
880
Fireside Chat
paigeccino
43
4k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
320
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
420
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
690
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
480
The Mindset for Success: Future Career Progression
greggifford
PRO
0
490
Side Projects
sachag
456
43k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
270
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