Docker 概要

## Docker とは
隔離した環境でアプリケーションを実行できる **コンテナ（コンテナ型仮想環境）**。
このコンテナを管理するソフトウェアが **Docker** です。
つまり、Docker とは、コンテナを使ってミドルウェアやソースコード、ライブラリなどをひとまとめにすること。

本記事では、Docker の構成や仕組み、利点、ユースケースを説明します。
![pro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917499/5a39bd3e-ed05-a0c9-6e93-71df4c040f77.png)


## Docker を構成する要素

### 1. コンテナとイメージ、 Docker Hub

- **コンテナ**
隔離した環境でプログラム一式を実行できる仕組み（一種の仮想環境）です。
コンテナの中には、システムの実行に必要なミドルウェアやソースコード、ライブラリなどが入っています。
コンテナを起動することで、セットアップしたシステムの機能を実行することができます。
コンテナは、**イメージ** を元に作成されます。
![pro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917499/cca7d8e8-c4a4-7018-0cff-fe39deb15cfa.png)


- **イメージ**
コンテナ作成の雛形であり、コンテナを作成するための設計図のようなものです。
イメージは、ミドルウェアやライブラリ、設定ファイルなどのアプリケーション実行に必要なもの一式をまとめたものになります。
イメージからコンテナを作成することで、何度でも同じコンテナを作成することができます。
開発したアプリケーションをイメージとして保存して、別のサーバーに持っていくことで同じ環境（コンテナ）を別のサーバー上でも再現することができます。
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917499/a6518835-0b22-9bf4-3a8c-4866a357b007.png)


- **Docker Hub**
Docker 社が管理するレジストリです。
[Docker Hub](https://hub.docker.com/) では、イメージが公開されていて、ダウンロードすることで様々なコンテナを起動することができます。
以下の図のように、作成したイメージを Docker Hub へ「プッシュ」することで、リポジトリにイメージを保存できます。
イメージはリポジトリ単位で管理し、タグ付けによってバージョン管理します。
また、リポジトリへプッシュしたイメージは、「プル」することでコンテナを取得し、そこからコンテナを起動することができます。
※ リポジトリの登録には、アカウント作成が必要になります。
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917499/cfa4ca6c-9ee9-1278-1d4a-c040b0d90ed7.png)


### 2. Docker Engine
Docker Engine は、Docker の核となるソフトウェアです。
Docker Engine をインストールすることで、Dockerのイメージやコンテナの操作ができるようになります。
また、Docker Engine が入ったDocker実行環境のことを「Dockerホスト」と呼びます。

[公式ドキュメント](http://docs.docker.jp/v1.12/engine/understanding-docker.html) によると、Docker Engine は、3つの要素から構成されます。

|要素|説明|
|---|---|
|Docker CLI|Docker を操作するための「Dockerコマンド」を実行するコマンドラインツール。|
|REST API|イメージやコンテナを操作するインターフェース。CLIによって呼び出され、Docker デーモンに実行内容を指示する。|
|サーバ（Docker デーモン）|デーモンプロセスであり、APIが呼び出されるのを待っている。<br>APIの呼び出しに応じて、コンテナの作成や起動を実行する。|

![docker_engine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917499/2302e93a-3947-f34f-c0b4-52a3a5ba7224.png)

上記のように、Dockerコマンドを使ってイメージやコンテナを操作します。

## Docker の仕組みと特徴

Dockerとコンテナは、以下のような構成になっています。
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917499/c1cc130b-162f-0bf3-8ba4-10c7142e3c9a.png)


最下層にハードウェアがあり、その上にOSがあります。
通常のサーバー構成であれば、OSの上にミドルウェアやアプリケーションを乗せますが、
Dockerを使用する場合は、OSの上にDocker Engineを乗せて、その上でコンテナを動かします。
ミドルウェアやアプリケーションは、コンテナの中に入れることになり、各コンテナは、独立した実行環境となっています。

また、以下の図のように、
コンテナには「Linux OSのカーネル以外の周辺部分」が入っており、すべてのコンテナでホストOSのカーネルを共有します。
各コンテナ内にOSの全機能を乗せる必要がないため、従来の仮想化に比べて、メモリやストレージの使用量が少なくなります。
また、カーネルをロードする手間が省けるため、起動時間も高速になります。
![docker1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917499/0cd53976-71dc-f5e4-75e0-340de8799f9a.png)

上記の図のように、Docker コンテナはホストのLinux OSを利用する前提の作りとなっているため、Linux OS上でしか動作しません。


## Docker の利点と欠点
**・ 利点**

|特徴|利点|
|---|---|---|
|イメージ化できる|カスタムイメージを作っておけば、それを元にいくつでも同じコンテナを作ることができます。<br>つまり、複製を作る場合、同じ設定作業をする必要がなくなります。<br>また、他のサーバーへのコピーも容易です。|
|独立した環境|コンテナは隔離した実行環境のため、他のシステムに影響を与えることなく同居が可能です。<br>そのため1台のサーバーに、複数システムを構成できます。|
|軽量|ホストOSのカーネルを共有するので、コンテナにカーネルが必要ありません。<br>そのため、コンテナ自体が使用するメモリやストレージの使用量が少なくなります。|

**・ 欠点**

|特徴|欠点|
|---|---|---|
|Linux上でしか動作しない|ホストOSのlinuxカーネルを使うことが前提の仕組みのため、Linux以外の環境で動かすことができません。|

## ユースケース
上記の利点を踏まえると、以下のようなユースケースが考えられます。

**1. 同一の開発環境を複数用意する**
Docker を使えば、開発メンバー全員に同じ開発環境を提供するのに便利です。
雛形となるイメージを1個作ってしまえば、それを全員に配布するだけで済み、各メンバーが開発環境を構築する手間も省けます。
開発プロジェクトごとにコンテナを作り環境を分ける、といった用途もあります。
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917499/a55d0678-94ff-ac3a-fe55-fcd347f0bb86.png)


**2. 新しい技術の実験の場として使う**
コンテナは隔離された環境で、起動・削除が簡単に行えるため、自分の環境を汚さずに新しい技術を試すことができます。
ライブラリやフレームワークのバージョンアップ時の動作確認といった用途にも使えます。


**3. 本番環境へ移行時の事故防止**
アプリケーションの開発で、テスト環境サーバで動作確認を実施後、本番環境サーバで動作させる場合、
テスト環境サーバの実行環境（ライブラリやフレームワークなど）と同じ環境を本番サーバにも用意する必要がありますが、
ライブラリやフレームワークの依存関係を間違えてしまうと、環境の違で本番サーバでは動作しないということが起こりえます。
テスト環境サーバで確認した内容をイメージにしておけば、本番サーバではそれを展開するだけで済むため、このような事故を防止できます。
![aaa-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917499/1aea2d58-b1e6-8734-93e8-f3cdfb3276b5.png)

## まとめ
|項目|内容|
|---|---|---|
|構成要素|・コンテナ: 隔離した環境でプログラム一式を実行できる仮想環境。<br>・イメージ: コンテナを作成するための設計図のようなもの。<br>・Docker Hub: Docker 社が管理するレジストリ。イメージの管理・取得ができる。<br>・Docker Engine: イメージやコンテナの操作をするコアとなる要素。<br>|
|仕組み・特徴|・ホストOSの上にDocker Engineを乗せて、その上でコンテナが動作する。<br>・ホストOSのカーネルを使う。<br>・Linux OS上でのみ動作する。|
|利点・欠点|・利点：イメージ化して複製できる。隔離環境。動作が軽量。<br>・欠点： Linux上でしか動作しない。<br>|
|ユースケース|・同一の環境を複数用意する。<br>・新しい技術を試す。<br>・本番環境での事故防止。|

## 次は
概要を学んだところで、Docker を実際に操作してみます。

https://qiita.com/R_R/items/cad8cc155f76d42ce22f