Slide 1

Slide 1 text

コンテナ完全に理解した @Makuake LT Party 2019/1/16

Slide 2

Slide 2 text

「完全に理解した」 製品を利⽤をするためのチュートリアルを完了できたという意味。
 「なにもわからない」 製品が本質的に抱える問題に直⾯するほど熟知が進んだという意味。 「チョットデキル」 同じ製品を⾃分でも1から作れるという意味。または開発者本⼈。 cf. https://twitter.com/ito_yusaku/status/ 1042604780718157824 Excuse

Slide 3

Slide 3 text

話すこと ・コンテナとは ・コンテナの歴史 ・コンテナと仮想化の違い ・コンテナ技術の実現 ・libcontainer

Slide 4

Slide 4 text

コンテナとは ・ホストOSからアプリケーションとランタイムをま とめて、分離した⼀連のプロセス ・Dockerはコンテナを管理する技術

Slide 5

Slide 5 text

Docker is Not コンテナ

Slide 6

Slide 6 text

コンテナの歴史 ೥ 6/*904ʹDISPPU͕ొ৔ ೥ 'SFF#4%KBJMT͕'SFF#4%ʹొ৔ɻDISPPUͷൃలܥɻ ೥ -9$͕ϦϦʔεɻ-JOVYͷίϯςφٕज़ɻ ೥ %PDLFS͕ొ৔ɻίϯςφΛ؅ཧ͢Δٕज़ɻ 7JSUVP[PPɺ0QFO7;ɺ)169DPOUBJOFSɺ4PMBSJT$POUBJOFS ͳͲίϯςφٕज़͸ଞʹ΋৭ʑ͋Δɻ

Slide 7

Slide 7 text

コンテナと仮想化の違い ・コンテナ(コンテナ型仮想化)  ・ホストOSからアプリケーションとランタイムをまとめて、分離し た⼀連のプロセス  ・ホストOSのカーネルの部分を共有している  ・OSのライブラリ部分はコンテナ側が選択可能 ・仮想化  ・ざっくりいうと、ホストOS上にゲストOSをまるごと⽤意する仕組 み

Slide 8

Slide 8 text

【図解】コンテナと仮想化の違い ϋʔυ΢ΣΞ ϋʔυ΢ΣΞ ϗετ04 Ծ૝Խιϑτ΢ΣΞ ήετ04 ήετ04 ϗετ04 ίϯςφ؅ཧιϑτ΢ΣΞ ήετ04 ϥΠϒϥϦ ήετ04 ϥΠϒϥϦ ϛυϧ΢ΣΞ ϛυϧ΢ΣΞ ΞϓϦέʔγϣϯ ϛυϧ΢ΣΞ ϛυϧ΢ΣΞ ΞϓϦέʔγϣϯ ΞϓϦέʔγϣϯ ΞϓϦέʔγϣϯ ίϯςφ Ծ૝Խʢϗετܕʣ ίϯςφ

Slide 9

Slide 9 text

コンテナと仮想化の違い わかりやすい cf. https://community.hpe.com/t5/Enterprise-Topics/ Docker%E3%82%B3%E3%83%B3%E3%83%86%E3 %83%8A%E3%81%A8%E4%BB%AE%E6%83%B3%E 5%8C%96%E3%81%AE%E9%81%95%E3%81%84%E 3%81%A8%E3%81%AF- Synergy%E3%81%A8DevOps/ba-p/6980068? profile.language=ja#.XD6Zks8zZTY

Slide 10

Slide 10 text

コンテナ技術の実現 ・Kernel namespaces ・Appramor and SELinux profiles ・Seccomp policies ・Chroot ・Kernel capabilities ・CGroups

Slide 11

Slide 11 text

Kernel namespaces ・プロセスを6種類のシステムリソースに分割する機 能  ・ipc, uts, mount, pid, network, user ・分離されたリソース同⼠は互いに⼲渉できない ・ユーザーがユーザー専⽤の分離されたリソースを 持っているように⾒える仕組みを実現

Slide 12

Slide 12 text

Appramor and SELinux profiles ・アプリケーションとかファイルとかカーネルとかのアクセス制 御機能 ・Apparmor  ・Linux Security Modulesの1種  ・アプリケーションのアクセス権限をセキュアに管理 ・SELinux  ・Linuxカーネルに強制アクセス制御機能を加えるモジュール

Slide 13

Slide 13 text

Seccomp policies ・プロセスのシステムコール発⾏を制限する機能 

Slide 14

Slide 14 text

Chroot ・親プロセスと⼦プロセス群に対して、ルートディレ クトリを変更する ・ルートを変更されたプロセスは範囲外のファイルに アクセスできなくなる  ・→プロセス分離の実現

Slide 15

Slide 15 text

Kernel capabilities ・プロセスの権限管理 ・rootなのか、root以外なのかよりももっと細かい権 限管理ができる

Slide 16

Slide 16 text

Cgroups ・プロセスをグループ化して共通管理する

Slide 17

Slide 17 text

コンテナ技術の実現 ・Linuxカーネルのこれらの機能を駆使して実現され ている ・これらの機能を駆使してコンテナ技術をLinuxで使 えるようにしたやつがlxc

Slide 18

Slide 18 text

Dockerのコンテナ技術 ・以前はlxc、v0.9からlibcontainer  ・cf. https://blog.docker.com/2014/03/ docker-0-9-introducing-execution-drivers-and- libcontainer/

Slide 19

Slide 19 text

Libcontainer is 何 ・コンテナ利⽤のためのGoで実装されたランタイム ・元はdockerのリポジトリにあった(cf. https://github.com/docker/libcontainer) ・runC (cf. https://github.com/opencontainers/runc)  ・コンテナランタイムのリファレンス実装プロジェクト  ・OCI(Open Container Initiative)が管理   ・Docker社が⽴ち上げたコンテナ標準仕様を策定する団体 ・gVisorもコンテナランタイム ・コンテナランタイムをもっと知る  ・cf. https://www.ianlewis.org/en/container-runtimes-part-1-introduction-container-r

Slide 20

Slide 20 text

Libcontainerを触ってみる ・「Goならわかるシステムプログラミング」の最後 の章にのってるよ!

Slide 21

Slide 21 text

まとめ ・コンテナは隔離されたプロセス ・コンテナはホストOSのカーネル部分を共有、ライブ ラリ部分は⾃由に選択できる ・Linuxカーネルを読む機運が⾼まった(読むとはいっ てない) ・libcontainerは触ったり、コード読んだらgoの勉強に もなりそう、楽しそう(⼩並感)

Slide 22

Slide 22 text

余談 Cookpadのスプリングインターンにコンテナコース というのがあった
 https://internship.cookpad.com/2019/spring/

Slide 23

Slide 23 text