zaki work log

作業ログやら生活ログやらなんやら

「コンテナ若葉マーク」でDockerのネットワークについて登壇した振り返り

登壇レポートが続きますが、「コンテナ若葉マーク」で15分のロング枠としては初めて、初心者向けの勉強会として発足したばかりの会で登壇したので、振り返りをしてみます。

tech-lab.connpass.com

発表スライド

speakerdeck.com

「怖くないコンテナ・ネットワーク」というタイトルで、ややこしいことはDockerがいろいろ裏で頑張ってるんで、コンテナ環境のネットワークは簡単に使えるんですよーという話をさせていただきました。

参加のきっかけ

主催の武井さんと、登壇されたもう一人のiganariさんと、過去にいくつかの勉強会(主にクラウドネイティブ方面や、VS Code Meetupあたり)でご一緒した繋がりがあり、その縁があり「初心者向けの勉強会を開催するので話をしてみないか」とお声がけ頂いて、仕事ではコンテナ触ってる割には登壇経験がAnsibleしか無かったので、入門向けの会なら自分でもできるかなとチャンレンジしてみました。

ちなみに登壇経験はほとんどなかったので「LT経験なし枠」(ショート枠)で参加したいと思ってたのですが、ぜひ「初心者に伝える枠」(ロング枠)でということになりました(笑)
(実際に喋ると15分の予定を4-5分くらいオーバーしてしまったので、これで良かったようです…)

日程について

登壇ブログが続いてるのでお察しですが、一つ前のAnsible Night オンラインから中5日での登板でした。
結果的にはなんとか間に合いました(ホンマか?)が、なかなか大変でした。去年の12月のアドベントカレンダーにも最終的に7回も記事書いたときのようなおかしなテンションになっていたような気がします。

Ansible Night前の段階で大まかなプロットを書くだけ書いてましたが、15分の時間調整まではできていなくてスライドも「図がうまく描けない、、まぁAnsible終わって本気だすか」という状態でした。。

集客

今回は新しくできた会ということで、どれくらいの人が視聴しに来てくれるかも課題でしたが、私の周りだとAnsible関連で繋がってる方がそこそこ見に来てくれたのと、あと前日に「明日ここでお話します」というツイートが品川方面のつよつよな方にリーチして拡散いただき、参加者がちょっと加速できたので良かったです。

資料の準備

「コンテナのネットワークの話やりたいです!」と宣言してDockerの使い方を主軸に「ホストOSとの通信」「コンテナ間通信」について話すことは決めてたんですが、、、

実際に情報をまとめようとすると、意外と細かい部分を理解できていない!改めて「俺たちは雰囲気でコンテナを使っているっ!!!」なのを実感しました。

そして図。

何度描いてみてもシックリこなくてだいぶ苦労しました。

というツイートをしていると

なかなか良いヒントを頂けました。ありがとうございます。

ホストOS・仮想bridge(docker0)・veth・コンテナを繋ぐネットワーク図で苦労してたんだけど、よくよく考えるとお仕事でもネットワーク図を描くことってあまり経験が無く、今回コンテナという仮想的な登場人物のおかげで箱の配置などに苦労しましたが、最終的にこのようになりました。

f:id:zaki-hmkc:20200704105449p:plain

が、これうっかりしてて、ens192とdokcer0が繋がってないんですね。。気付いた方はいたかもしれませんが、これはミス💦

ちなみに初期のころの描きかけの図はこんな感じで全然いけてませんでした。。笑

f:id:zaki-hmkc:20200704110022p:plain

そして忘れてはいけないのが、発表前日に武井さんが「【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その5:Dockerのネットワークってどうなってるの? 〜 | SIOS Tech. Lab」という記事を公開しまして、これがDockerネットワークの仕組みというか下回り部分というか、私が発表で説明しない予定だったことをとても丁寧に解説されていたので、とても参考になりました。

tech-lab.sios.jp

あまりの素晴らしさに、私のスライドの目次の次(自己紹介前)に紹介を入れさせていただきました。
タイミング的に武井さんはこの内容でお話ししようと考えていたんだろうなーと思うと申し訳なかったです🙇‍♂️

発表に入らなかったこと

何とか内容もまとまりスライドもできましたが、時間の都合で色々と削った部分について。

コンテナごとにIPアドレスが割り振られる

これは「Dockerの場合」です。

Kubernetesの場合は少し事情が異なります。
1つ目のセッションでも武井さんから「pod」というKubernetesの実行単位の一つのお話があり、「pod内にコンテナが複数ある(一つの場合が多いけど)」という説明がありました。
この場合のIPアドレスは、Kubernetesのpodについて割り振られており、pod内に複数コンテナがあってもIPアドレスは共用となります。

IPアドレスの共用」と言うとピンと来ないかもしれませんが、「プロセス空間はコンテナごと」だけど「ネットワーク空間はpodごと」になります。
具体的な動作としては、「同一pod内のコンテナ間通信はlocalhost(0.0.0.0)で通信可能」「同一pod内でA,Bのコンテナがあったとして、コンテナAで例えば8080/TCPをListenしていたら、コンテナBでは同じ8080/TCPはListenできない」という、コンテナ単位でなくpod単位でネットワーク的には一つのホストOSの動きと同じになります。

ネットワーク超えのコンテナ通信は不可

コンテナ間通信で名前解決する際に「新たに自分でbridgeネットワークを作成する」と説明し、「異なるbridgeネットワーク間のコンテナ間通信は不可」と説明しました。
これは、コンテナが所属しているbridgeネットワーク以外のネットワークとは疎通できないというものです。

何を言っているかと言うと、どうしても複数bridgeネットワーク間での通信が必要なのであれば、コンテナを複数bridgeネットワークに接続してしまえばOKです。
ホストOSで言えば、NICを増やしてネットワーク設定して接続したいネットワークの線を繋ぐということです。

Dockerではdocker network connect <network-name> <container-name>で、作成済み対象コンテナに対象ネットワークを「追加」することができます。(切断はdisconnect)

[zaki@cloud-dev ~]$ sudo docker network --help

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.

個人的にはコンテナって起動時のオプションなどの指定は変更できない(volumeとかpublishとか)ことが多いと思ってるので、実行中のコンテナの設定が変更できるこのオプションってちょっと特殊なのかなーという印象。

DNS設定

コンテナと言っても中身はLinuxなので、どういうDNS設定がされているかは/etc/resolv.confで確認できます。

これは削ってしまった幻の1ページ。

f:id:zaki-hmkc:20200704112958p:plain

「ユーザー定義bridgeネットワークを使って内部DNSが有効な場合」は、スライド上部の通り、127.0.0.11というアドレスが設定されます。これがDockerの機能で提供された内部DNSサーバーのアドレスになっています。

また、標準のbridgeネットワークを使った場合は、スライド下部のようになりますが、これは「Docker本体を実行しているホストOSのDNS設定」と同じものになります。

tail -f /dev/null

「何もしないデバッグ用コンテナ」としてこのコマンドを実行するCentOS7コンテナを起動しましたが、Dockerコンテナであればdocker run -itd centos:7でも同じようなことができます。

ただ、tail -f /dev/nullのコマンド指定はKubernetes環境でも「何もしないデバッグ用pod」の起動にも使えるので、覚えておくと良いかも。
(というか、他にもっと良いやり方あったら知りたい笑)

発表を終えて

過去2回のAnsibleのLTは「自分の実績(経験)を話す」というものでしたが、今回は「自分の知識を話す」というもので、いざ説明しようとすると何となく知っていたレベルの事が無限に出てきて他の人に説明するにはまだまだ足りてないということを、改めて実感しました。

ですが、終わってみると多くの方から「分かりやすかった」「知らないことがいくつもあり勉強になった」とコメントいただけたのでホッとしました。

また、社内勉強会でこの内容を使って発表カラオケという形でフィードバックしたら好評だったという方もいらっしゃり本当に嬉しかったです。


ということで、日程はちょっとハードでしたが、自分の勉強にもなったし、視聴された方にも参考になったようで、良い経験になりました。 改めてお声がけ頂いた武井さんとiganariさん、そして参加された皆さん、ありがとうございました!