Docker とは
隔離した環境でアプリケーションを実行できる コンテナ(コンテナ型仮想環境)。
このコンテナを管理するソフトウェアが Docker です。
つまり、Docker とは、コンテナを使ってミドルウェアやソースコード、ライブラリなどをひとまとめにすること。
本記事では、Docker の構成や仕組み、利点、ユースケースを説明します。
Docker を構成する要素
1. コンテナとイメージ、 Docker Hub
-
コンテナ
隔離した環境でプログラム一式を実行できる仕組み(一種の仮想環境)です。
コンテナの中には、システムの実行に必要なミドルウェアやソースコード、ライブラリなどが入っています。
コンテナを起動することで、セットアップしたシステムの機能を実行することができます。
コンテナは、イメージ を元に作成されます。
-
イメージ
コンテナ作成の雛形であり、コンテナを作成するための設計図のようなものです。
イメージは、ミドルウェアやライブラリ、設定ファイルなどのアプリケーション実行に必要なもの一式をまとめたものになります。
イメージからコンテナを作成することで、何度でも同じコンテナを作成することができます。
開発したアプリケーションをイメージとして保存して、別のサーバーに持っていくことで同じ環境(コンテナ)を別のサーバー上でも再現することができます。
-
Docker Hub
Docker 社が管理するレジストリです。
Docker Hub では、イメージが公開されていて、ダウンロードすることで様々なコンテナを起動することができます。
以下の図のように、作成したイメージを Docker Hub へ「プッシュ」することで、リポジトリにイメージを保存できます。
イメージはリポジトリ単位で管理し、タグ付けによってバージョン管理します。
また、リポジトリへプッシュしたイメージは、「プル」することでコンテナを取得し、そこからコンテナを起動することができます。
※ リポジトリの登録には、アカウント作成が必要になります。
2. Docker Engine
Docker Engine は、Docker の核となるソフトウェアです。
Docker Engine をインストールすることで、Dockerのイメージやコンテナの操作ができるようになります。
また、Docker Engine が入ったDocker実行環境のことを「Dockerホスト」と呼びます。
公式ドキュメント によると、Docker Engine は、3つの要素から構成されます。
要素 | 説明 |
---|---|
Docker CLI | Docker を操作するための「Dockerコマンド」を実行するコマンドラインツール。 |
REST API | イメージやコンテナを操作するインターフェース。CLIによって呼び出され、Docker デーモンに実行内容を指示する。 |
サーバ(Docker デーモン) | デーモンプロセスであり、APIが呼び出されるのを待っている。 APIの呼び出しに応じて、コンテナの作成や起動を実行する。 |
上記のように、Dockerコマンドを使ってイメージやコンテナを操作します。
Docker の仕組みと特徴
最下層にハードウェアがあり、その上にOSがあります。
通常のサーバー構成であれば、OSの上にミドルウェアやアプリケーションを乗せますが、
Dockerを使用する場合は、OSの上にDocker Engineを乗せて、その上でコンテナを動かします。
ミドルウェアやアプリケーションは、コンテナの中に入れることになり、各コンテナは、独立した実行環境となっています。
また、以下の図のように、
コンテナには「Linux OSのカーネル以外の周辺部分」が入っており、すべてのコンテナでホストOSのカーネルを共有します。
各コンテナ内にOSの全機能を乗せる必要がないため、従来の仮想化に比べて、メモリやストレージの使用量が少なくなります。
また、カーネルをロードする手間が省けるため、起動時間も高速になります。
上記の図のように、Docker コンテナはホストのLinux OSを利用する前提の作りとなっているため、Linux OS上でしか動作しません。
Docker の利点と欠点
・ 利点
|特徴|利点|
|---|---|---|
|イメージ化できる|カスタムイメージを作っておけば、それを元にいくつでも同じコンテナを作ることができます。
つまり、複製を作る場合、同じ設定作業をする必要がなくなります。
また、他のサーバーへのコピーも容易です。|
|独立した環境|コンテナは隔離した実行環境のため、他のシステムに影響を与えることなく同居が可能です。
そのため1台のサーバーに、複数システムを構成できます。|
|軽量|ホストOSのカーネルを共有するので、コンテナにカーネルが必要ありません。
そのため、コンテナ自体が使用するメモリやストレージの使用量が少なくなります。|
・ 欠点
|特徴|欠点|
|---|---|---|
|Linux上でしか動作しない|ホストOSのlinuxカーネルを使うことが前提の仕組みのため、Linux以外の環境で動かすことができません。|
ユースケース
上記の利点を踏まえると、以下のようなユースケースが考えられます。
1. 同一の開発環境を複数用意する
Docker を使えば、開発メンバー全員に同じ開発環境を提供するのに便利です。
雛形となるイメージを1個作ってしまえば、それを全員に配布するだけで済み、各メンバーが開発環境を構築する手間も省けます。
開発プロジェクトごとにコンテナを作り環境を分ける、といった用途もあります。
2. 新しい技術の実験の場として使う
コンテナは隔離された環境で、起動・削除が簡単に行えるため、自分の環境を汚さずに新しい技術を試すことができます。
ライブラリやフレームワークのバージョンアップ時の動作確認といった用途にも使えます。
3. 本番環境へ移行時の事故防止
アプリケーションの開発で、テスト環境サーバで動作確認を実施後、本番環境サーバで動作させる場合、
テスト環境サーバの実行環境(ライブラリやフレームワークなど)と同じ環境を本番サーバにも用意する必要がありますが、
ライブラリやフレームワークの依存関係を間違えてしまうと、環境の違で本番サーバでは動作しないということが起こりえます。
テスト環境サーバで確認した内容をイメージにしておけば、本番サーバではそれを展開するだけで済むため、このような事故を防止できます。
まとめ
|項目|内容|
|---|---|---|
|構成要素|・コンテナ: 隔離した環境でプログラム一式を実行できる仮想環境。
・イメージ: コンテナを作成するための設計図のようなもの。
・Docker Hub: Docker 社が管理するレジストリ。イメージの管理・取得ができる。
・Docker Engine: イメージやコンテナの操作をするコアとなる要素。
|
|仕組み・特徴|・ホストOSの上にDocker Engineを乗せて、その上でコンテナが動作する。
・ホストOSのカーネルを使う。
・Linux OS上でのみ動作する。|
|利点・欠点|・利点:イメージ化して複製できる。隔離環境。動作が軽量。
・欠点: Linux上でしか動作しない。
|
|ユースケース|・同一の環境を複数用意する。
・新しい技術を試す。
・本番環境での事故防止。|
次は
概要を学んだところで、Docker を実際に操作してみます。