Dockerについて理解してみる
はじめに
この記事は、プログラミング初学者の筆者が学習したことの備忘録です。
Dockerってなに
コンテナ型仮想環境を作成、実行、管理するためのプラットフォーム。Dockerのソフトウェアでコンテナを起動して様々なアプリケーションを実行できるうえに、異なる環境でも簡単に同じ仮想環境を再現可能。
これは使わない手はないですね。
Dockerを使用するメリット
- プログラムの実行環境を素早く立ち上げることができる
- 再現性のある環境を用意できる
- 設定ファイルを共有することで同じ環境を立ち上げることができる
- PCの環境を整理整頓?できる
ホスト型仮想化とコンテナ型仮想化とは
ホスト型とコンテナ型の違い
ホスト型仮想化
ホスト型仮想化
ホストOSにハイパーバイザと言う、仮想化の機能を用意して行う仮想化のことを、ホスト型仮想化。
仮想マシン(VM)はハイパーバイザを通してホスト・リソースに仮想的にアクセスし、完全な "ゲスト" オペレーティングシステム実行します。一般的に、アプリケーションのロジックで何を消費するかによりますが、それよりも多くのオーバヘッドを仮想マシンでは受けます。
コンテナ型仮想化
コンテナ型仮想化
Dockerと言うコンテナ仮想化を行う、ソフトウェアを用いて行う仮想化を、コンテナ型仮想化。
コンテナは Linux 上でネイティブに実行し、ホストマシン上のカーネルを他のコンテナと共有します。コンテナは離れたプロセスを実行しますが、実行するもの以外でメモリを必要としないため、軽量になります。
(Docker ドキュメントより引用)
カーネルについて
カーネル(英: kernel)は、階層型に設計されたオペレーティングシステム (OS) の中核となる部分である。アプリケーションとハードウェアレベルでの実際のデータ処理との間の架け橋である。システムのリソースを管理し、ハードウェアとソフトウェアコンポーネントのやりとりを管理する。
(Wikipediaより引用)
仮想化のオーバーヘッド
ホスト型仮想化
リソース(CPUやメモリの使用率)のオーバーヘッドが多く、起動や停止にも時間がかかる。
コンテナ型仮想化
アプリケーション実行に必要なものだけを含み、ホストOSのカーネルを使用するため、動作が早くリソースの使用率も少ない。
アプリケーション実行の再現性
ホスト型仮想化
仮想マシンの環境の違いによりアプリケーションが動作しなくなることがある。
コンテナ型仮想化
同じDockerイメージからコンテナを起動する限り、環境が変わっても動作する。
OSの自由度
ホスト型仮想化
仮想マシン上で任意のOSを動作させることができる。
コンテナ型仮想化
ホストOSのカーネルを使用する都合で、WindowsOSやLinuxOSなどカーネルを共有できないOSを動かすことはできない。LinuxOS上でWindowsコンテナも動かせない。
分離レベル
ホスト型仮想化
ハードウェアレベルで仮想化されているため、ホストOSや仮想マシン間での分離レベルが高い。
いずれかの仮想マシンがセキュリティリスクにより侵された場合に、他のマシンが影響を受ける可能性が低い。
コンテナ型仮想化
コンテナを起動するとホストOSの1プロセスとして動作するので、分離レベルが低いとされている。
侵入されないような設定や構成にする必要があり、攻撃されにく状態にすることが重要。
不用意にパブリックネットワークにサーバーを公開しない、脆弱性のあるライブラリをインストールしないなど。
こうしてみると、Dockerはメリットが多いですね。
デメリットといえば、OSの自由度と分離レベルでしょうか。
参考
- Udemy
- Docker ドキュメント
Discussion