SlideShare una empresa de Scribd logo
1 de 38
Descargar para leer sin conexión
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という仮想ブリッジ上
で実行される
● コンテナの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 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
ホストネットワークで実行
● 良い:
○ 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-
sourcerefs: 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
host2host1
br0 gre0 br0gre0
GRE tunnel
Docker + Open vSwitch
● 良い点:
○ 安全。ポータビリティも保ちつつ多数のホストに展開でき
る
● 悪い点:
○ IPが被ってしまうおそれがあるため、goldmann/docker-
dhcp などの、DHCPを使う
refs: http://d.hatena.ne.jp/xlis/20130317/1363507787
ロックインを避けつつスケール
●
ロックインを避けつつスケール
● オープンソースのオーケストレーションツールを
使おう
○ SerfやConsul
○ etcd+fleet
● メンバー追加イベント発行されたら、そのIPを
SkyDNSやHAProxyに登録するだけ
まとめ
●
まとめ
● Dockerは特別なことしてないよ
○ Dockerのネットワークを隔離してホストネットワークで動
かせばかなり速くなるよ
● Docker時代に合わせてネットワークも柔軟にし
てみよう
○ もちろん、インフラがコードになっていることを前提で。開
発環境ではfigを使おう
まとめ
● 結局プロヴィジョン環境と環境変数の共有が重
要。
● コンテナIPの解決はSerfやConsulに任せよう
● 複雑になりすぎないように注意
時間が余ったらデモ
● 4つのコンテナをfigで作り、Serfで繋ぐ
● git clone https://github.com/mainyaa/fig-
example-4-container
● https://github.com/centurylinklabs/fig2coreos
時間が余ったらデモ
● Docker + Open vSwitch

Más contenido relacionado

La actualidad más candente

第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西Masahide Yamamoto
 
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4Emma Haruka Iwao
 
JAWS-UG コンテナ支部 Docker入門 10分ハンズオン
JAWS-UG コンテナ支部 Docker入門 10分ハンズオンJAWS-UG コンテナ支部 Docker入門 10分ハンズオン
JAWS-UG コンテナ支部 Docker入門 10分ハンズオンRyo Nakamaru
 
Docker Swarm モード にゅうもん
Docker Swarm モード にゅうもんDocker Swarm モード にゅうもん
Docker Swarm モード にゅうもんMasahito Zembutsu
 
Nuxt.js + microCMS + netlify
Nuxt.js + microCMS + netlifyNuxt.js + microCMS + netlify
Nuxt.js + microCMS + netlifyogawatti
 
DockerをRed Hatはどのように見ているのか
DockerをRed Hatはどのように見ているのかDockerをRed Hatはどのように見ているのか
DockerをRed Hatはどのように見ているのかEmma Haruka Iwao
 
コンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのかコンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのかえむ ばーど
 
爆速プレビュープロキシ pool
爆速プレビュープロキシ pool爆速プレビュープロキシ pool
爆速プレビュープロキシ poolmookjp
 
コンテナ情報交換会2
コンテナ情報交換会2コンテナ情報交換会2
コンテナ情報交換会2Masahide Yamamoto
 
Docker Machineを始めるには?
Docker Machineを始めるには?Docker Machineを始めるには?
Docker Machineを始めるには?Masahito Zembutsu
 
ラズパイ2で動く Docker PaaS
ラズパイ2で動く Docker PaaSラズパイ2で動く Docker PaaS
ラズパイ2で動く Docker PaaSnpsg
 
Dockerのディスクについて ~ファイルシステム・マウント方法など~
Dockerのディスクについて ~ファイルシステム・マウント方法など~Dockerのディスクについて ~ファイルシステム・マウント方法など~
Dockerのディスクについて ~ファイルシステム・マウント方法など~HommasSlide
 
Docker volume基礎/Project Longhorn紹介
Docker volume基礎/Project Longhorn紹介Docker volume基礎/Project Longhorn紹介
Docker volume基礎/Project Longhorn紹介Masahito Zembutsu
 
Dockerと外部ルータを連携させる仕組みを作ってみた
Dockerと外部ルータを連携させる仕組みを作ってみたDockerと外部ルータを連携させる仕組みを作ってみた
Dockerと外部ルータを連携させる仕組みを作ってみたnpsg
 
Dockerの改修を一緒にやりませんか
Dockerの改修を一緒にやりませんかDockerの改修を一緒にやりませんか
Dockerの改修を一緒にやりませんかaxsh co., LTD.
 
清貧Docker ~個人がDockerを使う理由~
清貧Docker ~個人がDockerを使う理由~清貧Docker ~個人がDockerを使う理由~
清貧Docker ~個人がDockerを使う理由~harupong
 
Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会Etsuji Nakai
 

La actualidad más candente (20)

Dockerと継続的インテグレーション
Dockerと継続的インテグレーションDockerと継続的インテグレーション
Dockerと継続的インテグレーション
 
第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西
 
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
 
JAWS-UG コンテナ支部 Docker入門 10分ハンズオン
JAWS-UG コンテナ支部 Docker入門 10分ハンズオンJAWS-UG コンテナ支部 Docker入門 10分ハンズオン
JAWS-UG コンテナ支部 Docker入門 10分ハンズオン
 
Docker Swarm モード にゅうもん
Docker Swarm モード にゅうもんDocker Swarm モード にゅうもん
Docker Swarm モード にゅうもん
 
Nuxt.js + microCMS + netlify
Nuxt.js + microCMS + netlifyNuxt.js + microCMS + netlify
Nuxt.js + microCMS + netlify
 
DockerをRed Hatはどのように見ているのか
DockerをRed Hatはどのように見ているのかDockerをRed Hatはどのように見ているのか
DockerをRed Hatはどのように見ているのか
 
Docker超入門
Docker超入門Docker超入門
Docker超入門
 
コンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのかコンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのか
 
爆速プレビュープロキシ pool
爆速プレビュープロキシ pool爆速プレビュープロキシ pool
爆速プレビュープロキシ pool
 
コンテナ情報交換会2
コンテナ情報交換会2コンテナ情報交換会2
コンテナ情報交換会2
 
Docker Machineを始めるには?
Docker Machineを始めるには?Docker Machineを始めるには?
Docker Machineを始めるには?
 
ラズパイ2で動く Docker PaaS
ラズパイ2で動く Docker PaaSラズパイ2で動く Docker PaaS
ラズパイ2で動く Docker PaaS
 
Dockerのディスクについて ~ファイルシステム・マウント方法など~
Dockerのディスクについて ~ファイルシステム・マウント方法など~Dockerのディスクについて ~ファイルシステム・マウント方法など~
Dockerのディスクについて ~ファイルシステム・マウント方法など~
 
Docker入門
Docker入門Docker入門
Docker入門
 
Docker volume基礎/Project Longhorn紹介
Docker volume基礎/Project Longhorn紹介Docker volume基礎/Project Longhorn紹介
Docker volume基礎/Project Longhorn紹介
 
Dockerと外部ルータを連携させる仕組みを作ってみた
Dockerと外部ルータを連携させる仕組みを作ってみたDockerと外部ルータを連携させる仕組みを作ってみた
Dockerと外部ルータを連携させる仕組みを作ってみた
 
Dockerの改修を一緒にやりませんか
Dockerの改修を一緒にやりませんかDockerの改修を一緒にやりませんか
Dockerの改修を一緒にやりませんか
 
清貧Docker ~個人がDockerを使う理由~
清貧Docker ~個人がDockerを使う理由~清貧Docker ~個人がDockerを使う理由~
清貧Docker ~個人がDockerを使う理由~
 
Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会
 

Similar a Dive into dockerネットワーク

Docker調査20150704
Docker調査20150704Docker調査20150704
Docker調査20150704HommasSlide
 
Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Dockerのキホンその2 Docker Compose Swarm Machine 利用編Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Dockerのキホンその2 Docker Compose Swarm Machine 利用編Naoki Nagazumi
 
WSL2+docker+JupyterとVS Codeリモート環境の構築
WSL2+docker+JupyterとVS Codeリモート環境の構築WSL2+docker+JupyterとVS Codeリモート環境の構築
WSL2+docker+JupyterとVS Codeリモート環境の構築Saito5656
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックEmma Haruka Iwao
 
配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境yut148atgmaildotcom
 
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月VirtualTech Japan Inc.
 
Docker handson
Docker handsonDocker handson
Docker handsonkoda3
 
Docker で xxxxxxサーバ を つくれませんでした
Docker で xxxxxxサーバ を つくれませんでしたDocker で xxxxxxサーバ を つくれませんでした
Docker で xxxxxxサーバ を つくれませんでしたkrs_mizuno
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までDocker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までMasahito Zembutsu
 
JAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオンJAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオンRyo Nakamaru
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Yuichi Ito
 
Circle ci and docker+serverspec
Circle ci and docker+serverspecCircle ci and docker+serverspec
Circle ci and docker+serverspecTsuyoshi Yamada
 
今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門Toru Miyahara
 
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版VirtualTech Japan Inc.
 
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINARVirtualTech Japan Inc.
 
Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Masahito Zembutsu
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルMasahito Zembutsu
 

Similar a Dive into dockerネットワーク (20)

Docker調査20150704
Docker調査20150704Docker調査20150704
Docker調査20150704
 
Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Dockerのキホンその2 Docker Compose Swarm Machine 利用編Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Dockerのキホンその2 Docker Compose Swarm Machine 利用編
 
WSL2+docker+JupyterとVS Codeリモート環境の構築
WSL2+docker+JupyterとVS Codeリモート環境の構築WSL2+docker+JupyterとVS Codeリモート環境の構築
WSL2+docker+JupyterとVS Codeリモート環境の構築
 
Docker社内勉強会
Docker社内勉強会Docker社内勉強会
Docker社内勉強会
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニック
 
配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境
 
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
 
Docker handson
Docker handsonDocker handson
Docker handson
 
Docker で xxxxxxサーバ を つくれませんでした
Docker で xxxxxxサーバ を つくれませんでしたDocker で xxxxxxサーバ を つくれませんでした
Docker で xxxxxxサーバ を つくれませんでした
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までDocker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
 
JAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオンJAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオン
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方
 
Circle ci and docker+serverspec
Circle ci and docker+serverspecCircle ci and docker+serverspec
Circle ci and docker+serverspec
 
今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門
 
今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門
 
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
 
Lxc on cloud
Lxc on cloudLxc on cloud
Lxc on cloud
 
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
 
Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
 

Último

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 

Último (9)

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 

Dive into dockerネットワーク

  • 1. Dive into Docker ネットワーク @mainyaa Image by Countney McNealy https://www.flickr.com/photos/courageousferret/4500059665
  • 2. Who ● @mainyaa ● Kazuyuki Mori ● フロントエンドからバックエンドまでやる系エンジニア ● AngualrJSとDocker大好き ● Topgate, Inc. - http://www.topgate.co.jp/ ● Happy New World - http://d.hatena.ne.jp/mainyaa
  • 4. Dockerのネットワークの問題 ● 複数ホストでlinkしたいです>< ● 本番の環境は決まっているのだからそれに合 わせてチューニングしたい ● 開発の時とプロダクションを意識しないで複数コ ンテナを連携させたい ● ロックインを避けつつスケールしたい
  • 7. DockerのNetworking ● 確認してみよう! ● $ ip a ● ifconfigとか使ってるのはおっさんらしいです >< ● http://opcdiary.net/?p=28500 ● RHEL7ではsystem-config-networkは廃止、 ifconfigやrouteなどのnet-toolsが非推奨
  • 8. $ 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
  • 9. $ 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
  • 11. $ 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
  • 12. $ 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
  • 13. -link ● docker run -link <name>:<alias> ○ 既に起動しているDockerコンテナに接続する ○ Dockerが相手の環境変数とホスト名を設定してくれる refs: http://deeeet.com/writing/2014/05/11/docker-network/
  • 16. $ 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
  • 17. $ 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
  • 18. $ 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
  • 19. -link ● 良い: ○ 手軽で便利。安全。Dockerが勝手にポートを振り分けて くれる ● 悪い: ○ $ sudo docker inspect --format ' {{ .NetworkSettings. IPAddress }} ' <container id> ○ スケールしない ○ 異なるホストにはlinkできない
  • 21. ホストネットワーク機能 ● docker run --net=host ● docker 0.9から使用可能 ● 仮想ブリッジ(vethXXXXやdocker0)を経由しな いでコンテナ立ち上げ ● コンテナのIP = ホストOSのIP
  • 22. $ 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. $ 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
  • 25. ホストネットワークで実行 ● 良い: ○ docker run -pでポート開放も、コンテナのIPを調べる必 要もなくなって便利 ○ 仮想ブリッジもiptablesを通さないので速い
  • 26. ホストネットワークで実行 ● 悪い: ○ ポートが被らないようにしないといけない ○ 安全性が犠牲になるため、本番環境での運用は完全に 別ネットワークにしないといけない
  • 27. ● image by openvswitch: http://openvswitch.org/
  • 28. 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- sourcerefs: http://www.slideshare.net/kotto_hihihi/openv-switch
  • 29. 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/
  • 30. 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 host2host1 br0 gre0 br0gre0 GRE tunnel
  • 31. Docker + Open vSwitch ● 良い点: ○ 安全。ポータビリティも保ちつつ多数のホストに展開でき る ● 悪い点: ○ IPが被ってしまうおそれがあるため、goldmann/docker- dhcp などの、DHCPを使う refs: http://d.hatena.ne.jp/xlis/20130317/1363507787
  • 33. ロックインを避けつつスケール ● オープンソースのオーケストレーションツールを 使おう ○ SerfやConsul ○ etcd+fleet ● メンバー追加イベント発行されたら、そのIPを SkyDNSやHAProxyに登録するだけ
  • 35. まとめ ● Dockerは特別なことしてないよ ○ Dockerのネットワークを隔離してホストネットワークで動 かせばかなり速くなるよ ● Docker時代に合わせてネットワークも柔軟にし てみよう ○ もちろん、インフラがコードになっていることを前提で。開 発環境ではfigを使おう
  • 37. 時間が余ったらデモ ● 4つのコンテナをfigで作り、Serfで繋ぐ ● git clone https://github.com/mainyaa/fig- example-4-container ● https://github.com/centurylinklabs/fig2coreos