Dockerで簡易版Aidemyをつくってみよう (その1) ~全体構成とDockerのセットアップ~


# はじめに
　今日からアイデミーの初の<a href="https://qiita.com/advent-calendar/2018/aidemy">アドベントカレンダー</a>を投稿していきます！よろしくお願いします！
　僕の担当回ではアイデミーのインフラを紹介し、実際に **簡易版のAidemy** を５回に分けて作成して行きたいと思います。今回はその１回目にあたります。
できるだけつまずかないように記述するつもりですが、何か不明点があれば教えてください。

# 今回の目標
　今回はアイデミーのインフラ構成と構成に密接に関わるDockerについて紹介し、
Dockerの環境を構築することを目標にします。

## インフラ構成
　今年(2018年)の5月に弊社の<a href="https://blog.aidemy.net/entry/2018/05/02/230322">インフラ構成についてのブログ</a>を公開しました。
こちらで紹介した **インフラ構成図** を以下に掲載します。
<div align="center">
<img src=https://qiita-image-store.s3.amazonaws.com/0/291512/5bc04d75-f3a9-f886-34d7-1377e30c5414.png "図1 アイデミーインフラ構成図">
</div>


2018年5月の執筆当時は、作成予定のインフラ構成図でしたが、6月末頃から実際にほぼこの構成で運用しています。
それぞれのインフラについては、上のブログで紹介していますのでご一読ください。
今回はこのインフラ構成と密接に関わるDockerについて紹介していきます。

## Dockerとは
　[Dockerの日本語版ドキュメント](http://docs.docker.jp/engine/index.html)によると、以下のように説明されています。

```
Docker とは、開発者やシステム管理者が、アプリケーションの開発、移動、実行するためのプラットフォームです。
Docker は部品（コンポーネント）から迅速にアプリケーションを組み立てるため、コードの移動による摩擦を無くします。
Docker はコードのテストやプロダクション（本番環境）に対する迅速な展開をもたらします。
```

... 説明を読んだだけではよくわかりません。。。

ここでは、Dockerの重要な要素である `Docker Container` と `Docker Image`  について紹介します。
さらに、実行時に用いる `Docker Compose` についても紹介します。

### Docker Container
以下に、`Docker Container`の図を示します。

<div align="center">
<img src=https://qiita-image-store.s3.amazonaws.com/0/291512/acaa55c1-6edb-27c0-49b7-ec11b98efe09.png "図1 アイデミーインフラ構成図">
</div>

通常PCなどのホストマシン(デバイス)上で動くアプリケーションは、ホストマシンの環境に依存しています。
例えば、Windows用に作られたアプリケーションは、Windows環境下では動作しますが、MacやLinux環境下だと動かないということが起きてしまいます。
また同じOSなのに、特定のモジュールをインストールしていなかったり、バージョンが揃っていないために動作しない場合もあります。
しかし、`Docker Container`はホストマシンのカーネルを共有して、プロセスやユーザから切り離して環境を構築するため、ホストマシンのOSに依存せず同様に動作することができます。
これにより開発者間で環境を揃える必要がなくなり、開発そのものに時間を割くことができます。

### Docker Image
`Docker Image` は、[公式ドキュメント](http://docs.docker.jp/glossary.html#image)には以下のように書かれています。

```
Docker Imageは コンテナ の元です。
イメージとはルート・ファイルシステムに対する変更を並べ集めたもので、コンテナを実行する間に使われる実行パラメータに相当します。
典型的なイメージはユニオン・ファイル・システムの層（スタック）がお互いに積み重なっています。イメージは状態を保持せず、変更もできません。
```

上の説明にあるように、`Docker Image`は`Docker Container`を作る元になります。
`Docker Image`さえ共有できれば、　それを持つ全員が同じ`Docker Container`を作ることができます。
また、ある`Docker　Image`を元に`Docker Container`の中身に変更を加えて新しい`Docker　Image`を作ることもできます。
さらに、`Dockerfile`というファイルを利用すると、

```
ある Docker　Image を引っ張ってきて特定の変更を加え、新たな Docker　Image を作成する
```

という作業を自動で行うことができます。

`Docker Image`を共有するサービスに[Docker Hub](https://hub.docker.com/)があります。
基本的に無料で公開しているので、会員登録さえすれば様々な`Docker Image`を利用することができます。

また、チーム内でプライベートに`Docker Image`を管理したい場合は、`Container Registory`というサービスを利用します。
弊社でも`Container Registory`を利用していて、インフラ構成図の中央下部に記載しています。
インフラ構成図にある`kubernetes`というサービスは、`Container Registory`から`Docker Image`を引っ張ってきて、`Docker Container`を作成して利用しています。

### Docker Compose
`Docker Compose`は、[公式ドキュメント](http://docs.docker.jp/compose/overview.html)には以下のように書かれています。

```
Compose とは、複数のコンテナを使う Docker アプリケーションを、定義・実行するツールです。
Compose はアプリケーションのサービスの設定に、Compose ファイルを使います。
そして、コマンドを１つ実行するだけで、設定した全てのサービスを作成・起動します。
```

上で説明されているように、`Docker Compose`とはDockerの定義/実行を行うツールです。
`Compose`ファイルに`Dockerfile`を指定したり、起動するポート番号などを指定すると、コマンド一つで`Docker Image`の作成や起動ができます。


## Docker の環境構築

今回は、**Docker**と**Docker Compose**のインストールを行います。
環境構築については、他の方が丁寧に説明されているのでその記事の紹介をさせていただきます。

### Dockerのインストール
- Macの方
Mac で Dockerを使えるように、 Docker for Mac というものが用意されています。
インストール手順は以下の記事で説明されているので参考にして下さい。
https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81

- Ubuntuの方
公式のDockerをインストールできます。
インストール手順は以下の記事で説明されているので参考にして下さい。
https://qiita.com/tkyonezu/items/0f6da57eb2d823d2611d

- Windowsの方
Windows で Dockerを使えるように、 Docker for Windows というものが用意されています。
公式ドキュメントをご覧ください。
http://docs.docker.jp/windows/step_one.html

Dockerをインストールできたら、
以下のコマンドで正しくインストールされているか確認して下さい。
僕の場合は以下のような出力になりました。

```bash
$ docker version
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:21:31 2018
 OS/Arch:           darwin/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.1-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       e68fc7a
  Built:            Tue Aug 21 17:29:02 2018
  OS/Arch:          linux/amd64
  Experimental:     true
```

### Docker Composeのインストール

`Docker Compose`のインストールについては、以下の記事を参考にしてください。
https://qiita.com/zembutsu/items/dd2209a663cae37dfa81

`Docker Compose`をインストールできたら、
以下のコマンドで正しくインストールされているか確認して下さい。
僕の場合は以下のような出力になりました。

```bash

$ docker-compose --version
docker-compose version 1.22.0, build f46880f
```

今回は以上になります。
次回以降実際にサービスを作って行きましょう！