SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

軽くて使いやすい仮想化技術 「Docker」の仕組みと
エンタープライズ開発における4つの活用事例


  • X ポスト
  • このエントリーをはてなブックマークに追加

Dockerを支える技術①「コンテナ仮想化」

 ここまで、Dockerの「軽さ」と「使いやすさ」を紹介しました。では、そんなDockerは、どのような技術を使って実現されているものなのでしょうか。

 Dockerは、主に2つの要素技術から成り立っています。1つはコンテナ仮想化の技術、もう1つはUnion File Systemです。

 最初に、コンテナ仮想化について説明しましょう。コンテナ仮想化は、OSを通して使用できるコンピュータリソースをコンテナごとに隔離して、ホストOS上で直接動作するプロセスや他のコンテナから独立した空間を作り出し、リソースを分割、分配、制限する技術です。

 「コンテナ」自体は新しい技術ではありません。OSのカーネルが持つ機能を利用しています。

 コンテナ仮想化を実現するために主に使用されているカーネルの機能が、namespace(名前空間)cgroupです。

namespace

 namespaceは、ユーザープロセスが動作する空間を分離する機能です。分離された空間は、それぞれが独立した名前空間を持っています。

 Dockerでは、カーネルが持つ次のnamespaceの機能を使用しています。名前空間はコンテナの起動時に作成され、各コンテナは独自の名前空間を持つようになります。

  • PID Namespace(プロセステーブルの分離)
  • Net namespace(ネットワーク設定の分離)
  • UTS namespace (ホスト名の分離)
  • IPC namespace(プロセス間通信の分離)
  • Mount namespace(ファイルシステムの分離)
  • User namespace(ユーザーの分離)

 これらのうち、本記事ではPID namespaceNet namespaceについて説明します。

PID namespace

 プロセステーブルの分離を行う機能で、kernel 2.6.24で実装されています。隔離された空間の中では、それぞれが独自のプロセスIDを持つことができます。したがって、同じホスト上であっても、異なるコンテナにおいては同じプロセスIDを使用できます。

 一方で、コンテナ外の名前空間のプロセスIDを知ることはないため、他のコンテナ内のプロセスやホストのプロセスに対し、プロセスID(PID)を指定してシステムコールを実行することはできない仕組みになっています。

PID Namespace
PID Namespace

 

 ただし、各コンテナのプロセスIDは、ホストOSから見えるプロセスIDとしてマッピングされているため、ホスト内からコンテナ内のプロセスに対し、システムコールを実行することが可能です。

PID Namespace
PID Namespace

 

Net namespace

 ネットワーク空間を分離する機能で、kernel 2.6.24で実装されています。PID namespaceと同じく、隔離された空間の中では、それぞれが独自のプロセスIDを持つことができるため、loopback addressや、eth0など、各コンテナで共通の名前が付与されています。

 ポート番号も各コンテナ間で独立しているため、同じポートを利用してもポートがバッティングすることはありません。

Net Namespace
Net Namespace

 

cgroups(control groups)

 コンテナ仮想化を実現するもう一つの機能が、cgroupsです。cgroupsはプロセスをグループ化し、グループ内に存在するプロセスに対して共通の管理を行うカーネルの機能です。ホストOSが持つCPUやメモリなどのリソースに対して、グループごとに制限をかけることが可能です。

 Dockerでは、コンテナの起動時にリソースのグループを作成して、グループごとにリソースの使用制限をかけています。

グループごとにリソースの使用制限をかけている
グループごとにリソースの使用制限をかけている

 

 cgroupは、cgroupファイルシステム(以下、cgroupfs)という仮想的なファイルシステムを使って操作します。

 cgroupファイルシステムは、カーネルのパラメータの値の閲覧、変更時に操作を行う際に、/proc以下のファイルを扱うのと同じような仕組みです。/sys/fs/cgroup以下にマウントされており、次の図のような構造になっています。

cgroupファイルシステム
cgroupファイルシステム

 

cgroupファイルシステムの構造

  • /sys/fs/cgroup以下では、メモリやCPUといったサブシステムごとにリソースが管理されています。
  • 各サブシステムの下には「Docker」というディレクトリが作成されており、1つのグループとして管理されています。
  • Dockerディレクトリの下には、さらに各コンテナのリソースを管理するグループが作成されています。
  • 各グループのディレクトリの下には、コンテナ内のプロセス群のリソースを制御するファイルが作成されています。

 例えば、「CPUリソースの制限を行うCPUサブシステム内にある“cpu.shares”というファイル」の中をcatコマンドで出力してみると、CPUを全体のどれくらい割り当てるかという値(次の図では1024)を確認できます。

cpu.sharesファイルの内容を確認
cpu.sharesファイルの内容を確認

 

次のページ
Dockerを支える技術②「Union File System」

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

遠藤 博樹(エンドウヒロキ)

株式会社ワークスアプリケーションズ Advanced Technology&Engineering Div.所属。製品や社内システムに対するインフラ研究を担当し、製品のクラウド化や開発用システムの分散化など製品の品質向上や開発者の生産性の向上を目的に、インフラからの視点で新しい技術を社内に取...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

秋吉 真衣(アキヨシマイ)

株式会社ワークスアプリケーションズ Advanced Technology&Engineering Div.所属。クラウド運用研究グループにて自社の新サービスである「CCMS」の開発・導入支援を担当。クラウド上での自社製品の運用の汎用化・自動化を進める中で、自動化ツールの開発や周辺技術の調査・検証な...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7894 2014/07/24 16:46

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング