はじめに
割とよく耳にするけど実態はよくわからない......
そんなコンテナ技術の1つであるDockerについて自分なりに調べてまとめてみた
間違ってたりこんなこともできるよ!などありましたら教えていただけると助かります
結論
コンテナとは
-
1つのOS上でプロセスを仮想的に分離する仕組み
⇒ アプリケーションを実行するための領域(名前空間)を複数に分割して利用する
Dockerとは
- インフラ関係やDevOps界隈で注目されている仮想化技術
- Docker社が開発
- コンテナ型の仮想環境を作成、配布、実行するためのプラットフォーム
目次
従来の仮想化との違い
従来の仮想化(ハイパーバイザ型)
ホストOS上にてハイパーバイザのソフトを動かし、その上で仮想マシンを動かす
コンテナ型
ホストOS上のプロセスを仮想マシンとして動かす
⇒ コンテナ内のアプリはコンテナ内のコマンドやライブラリを通して、ホストOSのカーネルを利用
(※ホストOS上で利用してるアプリの動作と同じ処理のため負荷が少ない)
コンテナで重要な技術(Linuxカーネルの機能)
-
namespace(名前空間)
プロセスやネットワーク、ファイルアクセスなど複数の種類があり、それぞれが異なるリソースの隔離する -
cgroup
プロセスグループのリソース(CPU、メモリ、ディスクI/Oなど)の利用を制限・隔離する
コンテナへリソースの割り当てと制限する -
Capability
スーパーユーザーとしての機能を制限する
DockerコンテナへHostOSのrootユーザーの権限を制限し、最小限の権限を付与/管理を行う
メリット
1. 軽量
ホストOSのカーネルを用いて
そのプロセスのひとつとしてコンテナを作成するため
データ容量が小さく済むイメージ(=コンテナを作成するためのファイルシステムや設定をまとめたデータ)を
レイヤーで管理して、 同じイメージは共有して利用する
2. 複製が容易
インターネット上に公開されているリポジトリから
取得可能プライベートなDockerリポジトリも作成が可能
メリット①:軽量
イメージのレイヤー化
コンテナ構築時のファイル操作は読み取り専用の「イメージレイヤ」に記録
イメージレイヤはハッシュ値で管理され、Docker実行環境内でキャッシュ・共有される
プログラム実行時の書き込みは最上位の「コンテナレイヤ」に記録される
キャッシュを活用できるように、プログラム開発時は共通イメージをベースにすると良い
メリット②:複製が容易
Dockerhub
Dockerhubには多様なイメージが蓄積され、コマンド一発で入手可能
(RPMのようなアプリケーションパッケージのイメージで利用する)
Githubなどとの同期により自動イメージ化できるので、配布も楽
なお、プライベートにDockerhub相当の機能を作るソフトも提供されている
リポジトリ利用の利点
リポジトリ内ではコンテナのイメージレイヤ単位で管理されているため、
パッケージの配布も効率的に処理することができる