概要
ここでは、Dockerの以下の概念についての関係性についてを明確にする。
Dockerfile
Docker Image
Docker Container
Volume
Network
Dockerとは?
そもそもDockerとはなんなのだろうか。
Dockerは、コンテナ(Docker Container
)という隔離(isolated environment
)された環境でアプリケーションのパッケージ化と実行をする機能を提供する。
Dockerは、インフラとアプリケーションを切り離す。
インフラとは、サーバーやネットワークなどの計算資源の基盤となるもの。
- Dockerについてのメモ
- アプリケーションをパッケージ化し、実行する機能を持つ
- アプリケーションを管理するのと同じ方法でインフラを管理することができる
- ソフトウェアを短時間で提供できる
- Dockerはコンテナのライフサイクルを管理するツールとプラットフォームを提供する
なぜ、Dockerを利用するのか?
Dockerの使用目的は、主に以下の三つが考えられる。
環境統一
Gitなどのバージョン管理ツールでDockerの設定ファイルごと管理しておくことで、開発環境や本番環境を統一することができる。
例えば、開発環境をコンテナ上で構築した場合には、ホスト上にJDKのインストールが不要になる。
このバージョンが変わった場合にも、masterで変更すれば、開発者がホスト上で何かしらの設定をする必要はない。
依存関係の管理
使用するライブラリやパッケージなどをDockerfile
で管理することができる。
隔離
Dockerコンテナ上はホスト上の他のプロセスから完全に隔離された環境となる。
そのため、ホスト上で実行中のプロセスからの影響を受けない。加えて、ライブラリやパッケージなどのインストールの制約を受けない。
Dockerの基盤技術
Dockerは以下のLinuxカーネルの機能により構成される。
-
namespace
- 実行中のプロセスに対する隔離(isolate)を提供し、システムリソースに対するアクセスを制限する。
-
cgroup
- システムリソースをグループごとに管理する
Dockerの重要概念について
詳細は、こちらを参照。
以下では、Dockerオブジェクトについての詳細を記載する。
Docker Image
Dockerコンテナを作成する命令が入った読み込み専用のテンプレートのこと。
レジストリに公開されたイメージもしくは、カスタムのイメージからコンテナを作成することができる。
image
を作成する場合には、Dockerfile
というファイルを生成する必要がある。
Dockerfile
は、イメージを生成してから作成するまでの手順を定義する。
Docker Container
image
が実行状態となったインスタンスのこと。
ホストOSマシン上にある他すべてのプロセスから隔離されている。
例えば、ホストOSや異なるコンテナのプロセスはコンテナ上で実行されているプロセスを認識できない。
Linuxのnamespace
やcgroup
によリ実現している。
Docker APIやCLIを使用し、コンテナの作成・開始・停止等をすることができる。(docker run
など)
ファイルシステム
コンテナでは、隔離された特別なファイルシステムを使用する。
イメージにはコンテナのファイルシステムが含まれており、アプリケーションの実行に必要な全てを含む必要があります。
Network
コンテナ同士は隔離されているが、コンテナにNetwork
の設定をすると、コンテナ間での通信が可能となる。
Volume
ホストOSのVolume
をコンテナ内のファイルシステムにマウントすることができる。
この領域は、ホストOSとコンテナとの間で共有され、もしコンテナを停止した場合にもデータは削除されない。