Dockerコンテナとは?【Docker解説】

Dockerコンテナとは

Dockerコンテナとは、ホストOS上で設定やファイルを独立して作成できる箱のようなものです。

コンテナ仮想化技術が使われており、Dockerイメージをビルドすることで作成することができます。

 

コンテナ仮想化技術

container

通常の仮想環境では、ホストOSの上にハイパーバイザという仮想環境制御のプログラムを起動し、その上でいくつものゲストOSを起動してアプリケーションやミドルウェアを動かす必要があります。(上図右)

それに対してDockerのコンテナ仮想化では、ホストOS上にDocker Engineというシステムを起動させその上にコンテナを起動させるのですが、こちらではゲストOSを起動させる必要はありません。

これはコンテナ仮想化ではホストOSのリソースを論理的に分割し、コンテナで共有して利用するためです。

これを実現するために用いられている技術が、名前空間とcgroupsという技術です。

これによって、通常であれば1つのOS上のアプリケーションはホスト上の同じリソースを使うため、相互の影響などを考慮する必要がありますが、コンテナ仮想化ではOSやファイルシステム、IPアドレスといったリソースをそれぞれ個別に割り当てられているかのように振舞うことができます。

また、Dockerが動く環境さえあればDockerイメージからすぐにDockerコンテナを作成することができるため、高い可搬性(ポータビリティ)を持っているのもコンテナ仮想化技術ならではのメリットです。

 

名前空間 (name space)

名前空間(name space)とは、各要素にそれぞれ一意の異なる名前を付けなければいけない範囲です。つまり、この空間は名前が被ることがないからデータの衝突がないよということです。

コンテナは1つのホストOS上で複数起動できると言いましたが、これはこの名前空間によって論理的に区画化しているため、同じOS上でも衝突の心配なく利用できるためです。もちろん名前空間が違えば同じ名前をつけることができます。

Linux名前空間にはいくつかの種類があります。(DockerのホストOSはLinuxです)

PID名前空間

PIDというのはProcess IDのことで、各プロセスに割り当てられたユニークなIDのことです。PID名前空間を分けることで異なる名前空間のプロセスは互いにアクセスすることができなくなります。

NET名前空間

NET名前空間ではIPアドレスやポート番号、ルーティングなどのネットワークリソースを隔離します。通常ならば1つのOS上で同じ名前のポート番号を利用することはできませんが、これにより複数のコンテナで同じポート番号やIPアドレスを利用することができます。

UID名前空間

UIDはUser IDのことで、ユーザーを名前空間ごとに分けることができます。これにより、ホストOSではrootのユーザーを別の名前空間では一般ユーザーにしたり、ということが可能になり、よりセキュアな環境構築が可能となります。

MNT名前空間

MNTはMountのことで、マウントとはコンピュータに接続させた外部機器を認識させて利用できるようにすることです(USBメモリを挿した時のような感じ)。

これにより、別の名前空間からはアクセスできないようにすることが可能です。

UTS名前空間

UTSとはUnix Time-sharing Systemの略ですが、これは昔の名残なので気にする必要はありません。名前空間ごとにホスト名やドメイン名を個別に持つことができます。

IPC名前空間

IPCとはInter-Process Communicationの略であり、プロセス間通信を名前空間ごとに独立して持つことができます。

共有メモリや排他制御に使われるセマフォを分離します。

 

Dockerではこれらの名前空間を用いて論理的にコンテナを隔離しています。

 

cgroups (Control Groups)

名前空間が論理的なリソースの割り当てであったのに対して、cgroupsではホストマシンの物理的なリソースを複数コンテナ間で利用できるようにする技術です。

プロセスをグループ化して、それぞれのグループに対してリソースやメモリの制限を行うことができます。

これにより、1つのコンテナがホストマシンのリソースを使い切ってしまって他のコンテナが動作しないといったことが起きないようになっています。

 

Dockerイメージとは【Docker解説】

初心者こそDockerを使ってみよう【入門】