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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
880
BitMech 探索的 トレーディングシステム fin-py study #1
mainyaa
0
61
GoPiGo2で遊んでみた
mainyaa
0
50
Electron(旧atom shell)基礎+入門
mainyaa
0
56
Docker基礎+Docker0.9/0.10概要
mainyaa
0
44
Other Decks in Programming
See All in Programming
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
350
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
2
650
Domain-Driven Transformation
hschwentner
2
2.3k
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
150
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
2
760
APNsからLive Activityを開始する話
yumnumm
0
170
Simple Storage Service(S3) is not simple
iwatsukayura
0
290
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
610
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
610
すこし踏み込む CancellationToken
htkym
2
1.7k
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
28
32k
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
2
350
Featured
See All Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
410
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
930
A Modern Web Designer's Workflow
chriscoyier
699
190k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
520
Side Projects
sachag
456
43k
Raft: Consensus for Rubyists
vanstee
142
7.8k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
440
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1k
Typedesign – Prime Four
hannesfritz
42
3.2k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
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