インフラ

2019-01-16 10:06:19

概要

コンテナ技術についてのまとめ。
Dockerを使わずにコンテナをつくって触ってみる。

コンテナとは

  • ホストOSからアプリケーションとランタイムをまとめて、分離した一連のプロセス。

コンテナの歴史

1979年 UNIX OSにchrootが登場。

2000年 FreeBSD jailsがFreeBSD 4.0に登場。chrootの発展系。

2001年 VServer Projectを通じてLinuxにもLinuxコンテナのベースとなる技術が登場。

2004年、LXC1.0がリリース。
Linux Containers

2008年、Dockerが登場

コンテナ技術は上記以外にもVirtuozzo、OpenVZ、HP-UX Container、Solaris Containerなど存在する。

コンテナと仮想化の違い

  • コンテナ

    • ホストOSからアプリケーションとランタイムをまとめて分離した一連のプロセス。
    • ホストOSのカーネル部分を共有している
      • OSのライブラリ部分はコンテナ側が選択可能
  • 仮想化

    • ホスト型とハイパーバイザ型で構成が異なるが、仮想化は複数OSを用意できるような構成で、ゲストOS上でアプリケーションを実行する。

bmf-tech - Dockerとはにもざっくりまとめている。

コンテナ技術を実現するためのLinuxカーネルの機能

Kernel namespaces

  • プロセスを6種類のリソース(ipc, uts, mount, pid, network, user)に分離する機能
  • ユーザーがユーザー専用の分離されたリソースを持っているように見せる仕組み。
  • 分離されたリソース同士は互いに干渉できない。

Apparmor and SELinux profiles

  • Apparmor
    • Linux Security Modules(Linuxカーネルにあるセキュリティのためのフレームワーク)の一種。
    • アプリケーションのアクセス権限をセキュアに管理(強制アクセス制御)
  • SELinux(Security Enhanced Linux)
    • Linuxカーネルに強制アクセス制御機能を加えるモジュール

Seccomp policies

  • プロセスのシステムコール発行を制限する機能

Chroots(using pivot_root)

  • 現在のプロセスとその子プロセス群に対して、ルートディレクトリを変更する操作のこと
  • ルートを変更されたプロセスは範囲外のファイルにアクセスできなくなる=>プロセス分離の実現

Kernel capabilities

  • プロセスの権限管理
  • root or not rootよりももっと細かい権限管理ができる

CGroups(control groups)

  • プロセスを共通管理するために、プロセスをグループ化する機能

Dockerのコンテナ技術

以前までDockerはlxcを使っていたが、v0.9からgoで実装されたlibcontainerを使っているらしい。(cf. Docker blog - DOCKER 0.9: INTRODUCING EXECUTION DRIVERS AND LIBCONTAINER github - opencontainers/runc/libcontainer/

libcontainerをつかってみる

Goならわかるシステムプログラミングの最後の章を参考

まとめ

  • コンテナはリソースを分離されたプロセス
  • コンテナはホストOSのカーネル部分を共有、ライブラリ部分は自由に選択できる

LTした

Makuake LT Party(社内LT大会)にてLTをした。

speaker-deck - コンテナ完全に理解した

参考

About the author

Image

bmf san @bmf_san
A web developer in Japan.