技術情報

Docker

 
”コンテナ”とは何かを、ハードウェア仮想化と比較しながら、コンテナ プラットフォームのDockerを例にして解説します。

Dockerとは

Docker(ドッカー) は、コンテナを実行するためのプラットフォームです。
Dockerでは、アプリケーションの動作に必要なミドルウェア、ランタイム、開発プログラムをパッケージ化して“Dockerイメージ”を作成します。”Dockerイメージ“からコンテナが作成され、”Dockerエンジン”で実行されます。複数のコンテナが動作する場合、各コンテナは隔離され独立して動作します。

ハードウェア仮想化とコンテナでアプリケーションの動作方法の違いを比較します。
ハードウェア仮想化ではハイパーバイザーが物理的なハードウェアのリソースを分割することで、仮想的なハードウェア(仮想マシン)を作成します。仮想マシンにはOSがインストールされ、OS上でアプリケーションが実行されます。そのため仮想マシンを起動して実際にアプリケーションが動作をするまでに時間を要します。

一方、コンテナで動作するアプリケーションは、“Docker エンジン”を介してホストOSのプロセスとして動作します。そのため高速に起動、停止が可能であり、複製も容易にできます。

ハードウェア仮想化

Docker

Dockerfile

プログラム言語Pythonの実行環境を例に、ハードウェア仮想化とDockerでアプリケーションの構築方法の違いを説明します。

ハードウェア仮想化では、作成した仮想マシンに Linux OS、Python、ライブラリをインストールすることで、 Pythonの実行環境を構築します。
構築したPythonの実行環境に、開発したプログラムを配置することでアプリケーションが動作します。

ハードウェア仮想化

Dockerでは、コンテナのテンプレートとなるDockerイメージの構成情報を記載した“Dockerfile”の作成から始まります。
“Dockerfile”には選択するベース イメージ(最小構成OS)、インストールするPython、Pythonのライブラリ、動作させるプログラムの情報が記載されています。
イメージ作成コマンド(docker build)を実行すると、“Dockerfile”に記載された情報を基に、“Dockerイメージ”が作成されます。
コンテナを実行するコマンド(docker run)で、作成した“Dockerイメージ”を指定することで、コンテナが生成されアプリケーションが動作します。

“Dockerfile”で定義するベース イメージ(最小構成OS)はDockerレジストリのリポジトリから取得することができます。
Dockerレジストリついては後ほど、ご紹介します。

Docker

ハードウェア仮想化でアプリケーションの実行環境を構築する場合、OSの種類やPythonのバージョン、必要なライブラリなど要件に従いインストールや初期設定などの作業が必要になります。
自動化ツールや仮想マシンのテンプレートを使うことで運用工数を減らすことができますが、ソフトウェアの入れ替えやバージョンアップ、脆弱性対応など様々な要因で運用管理が複雑になります。

Dockerでは、“Dockerfile”で、アプリケーションの実行環境のソフトウェアバージョンや必要ライブラリなどの構成情報を管理することができます。
また、この“Dockerfile”はテキストファイルで非常に軽いため開発メンバー間で共有し、簡単に同じ環境を複製することができます。
“Dockerfile”があれば常に同じ環境が構築ができるため作業ミスの防止や工数の削減に繋がります。

Dockerイメージ

“Dockerfile”に定義された情報を基に作成される”Dockerイメージ“について、もう少し詳しく解説いたします。

初めに“Dockerイメージ”と“Dockerコンテナ”は混同されやすいので改めて違いについて確認しておきます。
“Dockerイメージ”はアプリケーションの動作に必要なOSやミドルウェア、ランタイムをパッケージ化したもので、Dockerコンテナが動作するためのベースとなる不変的(immutable)なファイルです。
“Dockerコンテナ”は“Dockerイメージ”から作成された独立したOS仮想空間で、アプリケーションの実行環境です。

“Docker イメージ”は“Dockerfile”に定義された構成情報に基づいて複数のイメージ・レイヤーで構成されています。
Dockerコンテナが実行されると、“イメージ・レイヤー”は読み取り専用として実行され、書き込み可能な“コンテナ・レイヤー”が追加されます。

実行中のコンテナに対して新規ファイルの作成やファイル修正、ソフトウェア追加などの変更は “コンテナ・レイヤー”に書き込まれます。
ただし、コンテナが停止されると“コンテナ・レイヤー”は削除されてしまうため、変更した情報も消えてしまいます。
このため、コンテナに対して変更を加えた場合は新たにDockerイメージを作成して保存します。

Dockerレジストリ

Dockerレジストリは、Dockerイメージの保管場所でオンプレミスやパブリッククラウド上に構築できます。
Dockerレジストリ上でイメージを一元管理することで、プロジェクトメンバー間でイメージの共有が可能になり、テスト環境、ステージング環境、本番環境といった様々な環境への展開が容易になります。

また、Docker社が提供するDocker Hubでは、各種Linuxディストリビューションのイメージや様々なソフトウェアが組み込まれたイメージが公開されいます。

例えば、Pythonがインストールされたイメージを取得すれば、Pythonをすぐに実行することができます。
Docker Hubから公式イメージを取得して、個別にカスタマイズしたイメージを作成することもできます。
作成したイメージはDocker Hubにアップロードして保管、管理することが可能です。

DockerブログではDockerを実際に操作しながら、より具体的な説明をしています。