Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

CAMPHOR- day 2020 - Docker 超入門

CAMPHOR- DAY 2020 のセッション 「Docker 超入門」で使用したスライドです!

Docker の内部に関してざっくりと解説しています。

  • Login to see the comments

  • Be the first to like this

CAMPHOR- day 2020 - Docker 超入門

  1. 1. Docker 超入門 CAMPHOR- DAY 2020 Koki Makita @km_conner
  2. 2. 自己紹介 • Twitter: @km_conner • GitHub: KMConner • 春から京都大学大学院 M1 • 普段はバイトで C# & 研究で Python
  3. 3. このトークについて 話すこと • モジュール間の関係性 (dockerd, containerd,…) • runc がコンテナ間で環境を分離している仕組み 質問などあれば YouTube Live のコメント or Twitter の #camphor_day まで!
  4. 4. Docker 使ってますか?
  5. 5. Docker とは? もともとは港湾作業者 (コンテナの船からの積み下ろしなどをする 人) の意味 特徴としては • コンテナごとに環境を分離することが可能 • Dockerfile をもとに作成されるイメージによりホスト OS に関わら ずほぼ同じ環境を再現できる
  6. 6. Dockefile を書くだけで Docker を理解したと 思っていませんか? それよりももっと奥深いもの
  7. 7. このトークのゴール Docker の中身をざっくり と理解する
  8. 8. このトークで扱う範囲 • Linux 上の docker に限定 (Windows は今回は扱わない) • Docker はランタイムとして runc を使用していると仮定 • これ以降に示すコマンドはすべて Ubuntu 18.04 において実行
  9. 9. Docker に含まれるモジュール群
  10. 10. モジュール概観 Docker CLI dockerd containerd RunC Registry REST API gRPC ランタイムとして使用 イメージの Push/Pull
  11. 11. Docker CLI いわゆる docker コマンド • docker run … • docker build … dockerd の REST API で通信 • TCP ソケット、 Unix ソケットなどを通じて通信
  12. 12. dockerd • docker cli が使用する REST API を公開する daemon • containerd と gRPC を通じて通信 Docker CLI dockerd containerd RunC Registry REST API gRPC ランタイムとして使用 イメージの Push/Pull
  13. 13. containerd • gRPC Endpoint で待ち受ける daemon • コンテナのライフサイクル管理 • イメージの push / pull • runc などのランタイムのコマンドを実行する Docker CLI dockerd containerd RunC Registry REST API gRPC ランタイムとして使用 イメージの Push/Pull
  14. 14. runc • containerd が使用するランタイム • 実際にコンテナを作成するのはココ! • OCI (Open Container Initiative) の規格に準拠 Docker CLI dockerd containerd RunC Registry REST API gRPC ランタイムとして使用 イメージの Push/Pull OCI とは コンテナイメージやコンテナランタイムの 仕様を定めている団体
  15. 15. Runc が環境分離を実現している 仕組み
  16. 16. 名前空間 • PID などがコンテナ外から見えないようにするための仕掛け • 基本的に名前空間の外は見えない • 分離するもの • PID (名前空間が違えば同じプロセス ID のプロセスが存在できる) • MNT (ファイルシステムのツリーを完全に分離できる) • NET (IP アドレス、ルーティングなどのネットワークスタックを分離) • IPC (共有メモリ空間の分離) • UTS (ホスト名、ドメインの分離) • etc…
  17. 17. 名前空間とコンテナの関係 • コンテナは (特に何も指定しなければ) 別の名前空間で実行され るプロセス • PID, MNT などの名前空間を新しく作ってその中でプロセスを実 行
  18. 18. 名前空間の確認方法 • /proc/[pid] ディレクトリに、 各プロセスの情報が入っている • /proc/self は特殊なリンクで、現在実行中のプロセスの情報にリ ンクしている • 例 • /proc/self/cwdはカレントディレクトリへのリンク • /proc/self/exeは実行中のファイル $ ls -la /proc/self/cwd /proc/self/exe lrwxrwxrwx1root root 0 3月 28 11:41 /proc/self/cwd ->/root lrwxrwxrwx1root root 0 3月 28 11:41 /proc/self/exe -> /bin/ls
  19. 19. 名前空間の確認方法 • /proc/self/ns ディレクトリにある! $ls -l /proc/self/ns total0 lrwxrwxrwx1rootroot0 3月 2811:48cgroup->'cgroup:[4026531835]' lrwxrwxrwx1rootroot0 3月 2811:48ipc ->'ipc:[4026531839]' lrwxrwxrwx1rootroot0 3月 2811:48mnt-> 'mnt:[4026531840]' lrwxrwxrwx1rootroot0 3月 2811:48net-> 'net:[4026531992]' lrwxrwxrwx1rootroot0 3月 2811:48pid-> 'pid:[4026531836]' lrwxrwxrwx1rootroot0 3月 2811:48pid_for_children-> 'pid:[4026531836]' lrwxrwxrwx1rootroot0 3月 2811:48user->'user:[4026531837]' lrwxrwxrwx1rootroot0 3月 2811:48uts->'uts:[4026531838]'
  20. 20. 名前空間を見てみる 一番上はホスト側のシェル、下の 2 つはそれぞれ別のコンテナで PID namespace を確認した結果 すべてバラバラ $ls -l /proc/self/ns/pid lrwxrwxrwx1rootroot0 3月 2812:07/proc/self/ns/pid-> 'pid:[4026531836]’ $ls -l /proc/self/ns/pid lrwxrwxrwx1rootroot0Mar2803:10/proc/self/ns/pid-> 'pid:[4026532149]’ $ls -l /proc/self/ns/pid lrwxrwxrwx1rootroot0Mar2803:11/proc/self/ns/pid-> 'pid:[4026532281]'
  21. 21. 名前空間だけで十分ですか?
  22. 22. 名前空間以外のテクニック ただ単に名前空間で分離しただけでは不十分! • システムコールの制限 • ファイルアクセスの制限 • etc…
  23. 23. システムコールの制限 • システムコールの中にはコンテナの外に影響を及ぼすものもある • 例: SYS_TIME • システムの時刻を設定する • date–s“2020-07-24” (要 root 権限) でシステムの時計のセット • デフォルトではコンテナ内から使用できない • docker run --cap-add SYS_TIME … で使用可能に
  24. 24. システムコールの制限 コンテナ内から 何の (予定だった) 日付でしょう?? $ date –s “2020-07-24” Fri Jul 24 00:00:00 UTC 2020
  25. 25. ファイルのアクセス制限 ファイルへのアクセスを制限したいファイルがある 例 $ echo c > /proc/sysrq-trigger とするとシステムがクラッシュする (要 root 権限) $ echo b > /proc/sysrq-trigger とするとシステムが強制的に再起動(要 root 権限) ☞ 読み取り専用にする or 表示しないなどの対策
  26. 26. まとめ • Docker は 1 つのアプリケーションではなくいくつかのモジュール が連携して動いている • runc ではコンテナ仮想化を実現するために名前空間をはじめと する Linux カーネルの機能を使用している • 他にも docker にまつわる Linux カーネルの機能はたくさんある ので気になる人は以下の単語で調べてみてください • Overlay File System • Cgroup • Etc…

×