Upgrade to Pro — share decks privately, control downloads, hide ads and more …

コンテナ完全に理解した

bmf_san
January 16, 2019

 コンテナ完全に理解した

bmf_san

January 16, 2019
Tweet

More Decks by bmf_san

Other Decks in Programming

Transcript

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

    View Slide

  2. 「完全に理解した」
    製品を利⽤をするためのチュートリアルを完了できたという意味。

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

    View Slide

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

    View Slide

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

    View Slide

  5. Docker is Not コンテナ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  9. コンテナと仮想化の違い
    わかりやすい
    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

    View Slide

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

    View Slide

  11. Kernel namespaces
    ・プロセスを6種類のシステムリソースに分割する機

     ・ipc, uts, mount, pid, network, user
    ・分離されたリソース同⼠は互いに⼲渉できない
    ・ユーザーがユーザー専⽤の分離されたリソースを
    持っているように⾒える仕組みを実現

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  19. 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

    View Slide

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

    View Slide

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

    View Slide

  22. 余談
    Cookpadのスプリングインターンにコンテナコース
    というのがあった

    https://internship.cookpad.com/2019/spring/

    View Slide


  23. View Slide