コンテナ完全に理解した@Makuake LT Party 2019/1/16
View Slide
「完全に理解した」製品を利⽤をするためのチュートリアルを完了できたという意味。 「なにもわからない」製品が本質的に抱える問題に直⾯するほど熟知が進んだという意味。「チョットデキル」同じ製品を⾃分でも1から作れるという意味。または開発者本⼈。cf. https://twitter.com/ito_yusaku/status/1042604780718157824Excuse
話すこと・コンテナとは・コンテナの歴史・コンテナと仮想化の違い・コンテナ技術の実現・libcontainer
コンテナとは・ホストOSからアプリケーションとランタイムをまとめて、分離した⼀連のプロセス・Dockerはコンテナを管理する技術
Docker is Not コンテナ
コンテナの歴史 6/*904ʹDISPPU͕ొ 'SFF#4%KBJMT͕'SFF#4%ʹొɻDISPPUͷൃలܥɻ -9$͕ϦϦʔεɻ-JOVYͷίϯςφٕज़ɻ %PDLFS͕ొɻίϯςφΛཧ͢Δٕज़ɻ7JSUVP[PPɺ0QFO7;ɺ)169DPOUBJOFSɺ4PMBSJT$POUBJOFSͳͲίϯςφٕज़ଞʹ৭ʑ͋Δɻ
コンテナと仮想化の違い・コンテナ(コンテナ型仮想化) ・ホストOSからアプリケーションとランタイムをまとめて、分離した⼀連のプロセス ・ホストOSのカーネルの部分を共有している ・OSのライブラリ部分はコンテナ側が選択可能・仮想化 ・ざっくりいうと、ホストOS上にゲストOSをまるごと⽤意する仕組み
【図解】コンテナと仮想化の違いϋʔυΣΞ ϋʔυΣΞϗετ04ԾԽιϑτΣΞήετ04 ήετ04ϗετ04ίϯςφཧιϑτΣΞήετ04ϥΠϒϥϦήετ04ϥΠϒϥϦϛυϧΣΞ ϛυϧΣΞΞϓϦέʔγϣϯϛυϧΣΞ ϛυϧΣΞΞϓϦέʔγϣϯ ΞϓϦέʔγϣϯ ΞϓϦέʔγϣϯίϯςφԾԽʢϗετܕʣ ίϯςφ
コンテナと仮想化の違いわかりやすい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%E5%8C%96%E3%81%AE%E9%81%95%E3%81%84%E3%81%A8%E3%81%AF-Synergy%E3%81%A8DevOps/ba-p/6980068?profile.language=ja#.XD6Zks8zZTY
コンテナ技術の実現・Kernel namespaces・Appramor and SELinux profiles・Seccomp policies・Chroot・Kernel capabilities・CGroups
Kernel namespaces・プロセスを6種類のシステムリソースに分割する機能 ・ipc, uts, mount, pid, network, user・分離されたリソース同⼠は互いに⼲渉できない・ユーザーがユーザー専⽤の分離されたリソースを持っているように⾒える仕組みを実現
Appramor and SELinux profiles・アプリケーションとかファイルとかカーネルとかのアクセス制御機能・Apparmor ・Linux Security Modulesの1種 ・アプリケーションのアクセス権限をセキュアに管理・SELinux ・Linuxカーネルに強制アクセス制御機能を加えるモジュール
Seccomp policies・プロセスのシステムコール発⾏を制限する機能
Chroot・親プロセスと⼦プロセス群に対して、ルートディレクトリを変更する・ルートを変更されたプロセスは範囲外のファイルにアクセスできなくなる ・→プロセス分離の実現
Kernel capabilities・プロセスの権限管理・rootなのか、root以外なのかよりももっと細かい権限管理ができる
Cgroups・プロセスをグループ化して共通管理する
コンテナ技術の実現・Linuxカーネルのこれらの機能を駆使して実現されている・これらの機能を駆使してコンテナ技術をLinuxで使えるようにしたやつがlxc
Dockerのコンテナ技術・以前はlxc、v0.9からlibcontainer ・cf. https://blog.docker.com/2014/03/docker-0-9-introducing-execution-drivers-and-libcontainer/
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
Libcontainerを触ってみる・「Goならわかるシステムプログラミング」の最後の章にのってるよ!
まとめ・コンテナは隔離されたプロセス・コンテナはホストOSのカーネル部分を共有、ライブラリ部分は⾃由に選択できる・Linuxカーネルを読む機運が⾼まった(読むとはいってない)・libcontainerは触ったり、コード読んだらgoの勉強にもなりそう、楽しそう(⼩並感)
余談Cookpadのスプリングインターンにコンテナコースというのがあった https://internship.cookpad.com/2019/spring/
完