「Docker」を全く知らない人のために「Docker」の魅力を伝えるための「Docker」入門

「職場の人たちにDockerをもっと訴求したい！」そんな想いから、「Dockerって何？」といった方々にDockerの魅力を伝えるための記事を書いてみました。

Dockerのインストール方法については、『[Amazon EC2にDocker CEの環境を構築する](https://qiita.com/bremen/items/e5437e65872f950cc663)』にまとめています。併せてお読みください。

## 「Docker」とは

「Docker（ドッカー）」は近年大変注目されている **仮想化ソフトウェア** です。

2017年の企業におけるDockerの導入状況は「本番環境で使用している」という企業が6.0％、「開発／テスト／検証段階」の企業が13.1％であったようです。（[「2017年　国内OpenStack／Dockerの導入状況に関するユーザー調査結果を発表」](https://www.idcjapan.co.jp/Press/Current/20170518Apr.html)）

Dockerが注目されている一番の理由はその **手軽さ** です。Dockerを使えば、以下のようなサーバー環境を簡単に構築することができます。

- nginxやApacheによるWEBサーバー
- PHPやJavaによるAPサーバー
- MySQLやPostgreSQLによるDBサーバー
- redmine、GitLab、JenkinsなどのDevOps環境

![](https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR31t32747jkDCW7iiG5RN6eUryIcETD3mbwZX693i8ACAnjlBcey4FCYrKZw)
<sub>
[DockerCon 16 General Session Day 2 ](https://www.slideshare.net/mobile/Docker/dockercon-16-general-session-day-2-63497745)
</sub>

個人的には様々なOSSを試すのにDockerが大活躍しています。

## Dockerの仕組み

仮想化ソフトウェアなら既にVMWareやVirtualBoxがあるのに、なぜDockerがこれほど注目されているのでしょうか？

Dockerは **「コンテナ型仮想化」** と呼ばれる基盤技術で仮想化を実現しています。VMWare, VirtualBoxなどを代表とする従来の「ホスト型仮想化」と、Dockerを支える「コンテナ型仮想化」との違いを見ていきましょう。
  
### ホスト型仮想化（VMWare, VirtualBox）
- アプリケーションを実行するためにはまずゲストOSを起動させなければならず、CPUやメモリ、ディスクなどのリソースも多く消費する

### コンテナ型仮想化（Docker）
- コンテナはホストOSから見ると**単一のプロセス**として扱われ、**カーネル部分をホストOSと共有する**ため、リソース使用量が非常に少ない

|ホスト型仮想化|コンテナ型仮想化|
|---|---|
|![ハードウェア仮想化型の仮想実行環境](http://image.itmedia.co.jp/ait/articles/1701/30/wi-docker01003.png)|![Dockerの実行環境](http://image.itmedia.co.jp/ait/articles/1701/30/wi-docker01002.png)|
<sub>
[超入門Docker：第1回　Dockerとは - ＠IT](http://www.atmarkit.co.jp/ait/articles/1701/30/news037.html) 
</sub>

コンテナ型仮想化はOS上に他のプロセスから隔離されたアプリケーション実行環境を構築することで、仮想的な動作環境をホスト型仮想化より少ないコンピュータリソースで実現することを可能としています。

## Dockerを導入するメリット

上述したコンテナ型仮想化と呼ばれる基盤技術を活用することによって、Dockerは以下の3つの特徴を実現しています。

### 1. アプリケーションを少ないリソースで効率良く実行できる

コンテナ型仮想化は従来のホスト型仮想化で必要であった **ハードウェアのエミュレートを必要としない** ため、より少ないコンピュータリソースで効率よく実行することができます。

### 2. 「Infrastructure as Code」によってインフラ環境のバージョン管理ができる

「Infrastructure as Code」とはインフラ環境の状態をソースコードとして管理し、その内容を自動的にサーバーへ設定する仕組みです。 **Dockerはイメージの構成を「Dockerfile」、コンテナの構成を「docker-compose.yml」というテキストファイルに記述できる** ため、gitなどのバージョン管理システムでインフラ環境の状態を記録することができます。

以下はredmineが公式に公開しているdocker-compose.ymlのスクリプトです。ご覧のように、 **最低限必要な構成であれば、たった数行のスクリプトでサーバーを構築することができます。**

```yaml
version: '3.1'

services:

  redmine:
    image: redmine
    restart: always
    ports:
      - 8080:3000
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD: example

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: redmine
```

<sub>
[redmine | Docker Store](https://store.docker.com/images/redmine)
</sub>

また様々なオープンソースソフトウェアを構築するための **Dockerfileが豊富に公開されている** ことも大きな魅力の一つです。

### 3. 「Immutable Infrastructure」を実現することができる

「Immutable Infrastructure」とはアプリの実行環境を使い捨てとし、環境を都度作り直すことにより構成変更を行う方法です。サーバーの状態は全てDockerfileに記述されているため、 **いつでも古い状態のサーバーを廃棄して「パッチのつぎはぎがない綺麗な状態」のサーバーを再構築することができます。**

## Dockerを使うために最低限理解しておくべきこと

Dockerの魅力は伝わったでしょうか？最後にDocketを使うための重要な二つの概念、「Dockerイメージ」と「Dockerコンテナ」について説明したいと思います。

![](https://cdn-enterprise.discourse.org/docker/uploads/default/original/2X/1/160b7a125572748491e085db88b03d515d4f77b6.png)

<sub>
[アーキテクチャの理解 — Docker-docs-ja 1.11.0 ドキュメント](http://docs.docker.jp/v1.11/engine/understanding-docker.html)
</sub>

### 「Dockerイメージ」とは

「Dockerイメージ」とはOSやアプリケーションを含んだテンプレートのことです。OSによって固有であるユーザーランド部のイメージのことを **「ベース・イメージ」** と呼び、「ベース・イメージ」にはカーネル部は含まれていません。

[Docker Store](https://store.docker.com/search?source=verified&type=image)では、 **CentOSやUbuntuなど大抵のOSのベース・イメージが公開されています。** また、OSとアプリケーションがセットになっているイメージも同サイト上で公開されています。

### 「Dockerコンテナ」とは

「Dockerコンテナ」は元となるDockerイメージから生成された仮想サーバーです。 **同じDockerイメージから複数のコンテナを生成することもできます。** Dockerコンテナはホストマシン上の一つの **プロセス** として実行されます。

慣れるまではこれらの概念が少し分かりづらく感じるかもしれませんが、実際に自分で色んなコンテナを生成してるとすぐに理解できるようになります。

## 最後に

AIやブロックチェーン、スマートスピーカーに必要なサーバーやアプリケーションの環境も、Dockerを使えば簡単に構築することができます。本稿がDockerをより多くの人たちに知ってもらうきっかけとなれば幸いです。