今更ながらDocker入門

# はじめに
基本的に、備忘録用に記事を書いていきますので、読みにくい部分も多いかと思います。
説明不足なところも多いかもしれませんが、よろしくお願いいたします。

# Dockerとは何か
- Docker社が提供しているコンテナ型のアプリケーション実行環境
- Docker自体はGo言語で書かれている

開発や製品用の仮想環境作りの便利ツールという感じです。
では、今までの仮想環境とどのようなメリット・デメリットがあるのか見ていきます。

## 従来の仮想化とコンテナ型仮想化の違い
### 仮想化のオーバーヘッド
従来の仮想マシンは、個々で独立しておりゲストOS（WindowsOSやLinuxOSなど）をインストールできる。その分、リソース（CPUやメモリの使用率など）の面でオーバーヘッドが多く、起動や停止にも時間がかかる。
コンテナ型仮想マシンは、ゲストOS持たず、ホストOSのカーネルを使用しプログラムを実行する。CentOSやLinuxOSのイメージを提供されていますが、あくまでもホストOSのカーネルを経由して、そのプログラムやライブラリーを使用しています。そのため、動作が早くリソースの仕様率も少なくて済みます。

### アプリケーション実行の再現性
従来の仮想マシンは、その仮想マシンの環境の違いによりアプリケーションが動作しなくなることがまれに発生しました。
コンテナ型仮想マシンでは、特定のアプリケーションを動作させるために必要なものは、Dockerイメージにまとまっており、同じDockerイメージからコンテナを起動する限り、環境が変わっても同様に動作します。

### OSの自由度
従来仮想マシン上で任意のOSを動作させることができました。
コンテナ型仮想マシンでは、コンテナはホストOSのカーネルを使用して動作するので、WindowsOS上で直接Linuxコンテナは動作させることができずまた、LinuxOS上で直接WindowsOSも動作させることもできません。

### 分離レベル
従来の仮想マシンは、ハードウェアレベルで仮想化されており、ホストOSや仮想マシン間の分離レベルが高く、それぞれが影響を受けにくい。
コンテナ型仮想化では、OSの機能を使用した仮想化は、従来の仮想化に比べて分離レベルは低い。

## Dockerのイメージとコンテナ
ウェブアプリケーションを構築するとします。
まず動かすために必要なApache、データの管理にMySQL、処理を行うためにPHPをインストールすると思います。これら1つ1つが**イメージ**というファイルで管理されています。
また、このイメージ郡に、HTMLやJSなどのファイルをくっつけたものが、**コンテナ**となります。ウェブアプリケーションそのものが、**コンテナ**という感じで良いと思います。

**イメージ**は、階層構造で管理されています。Apacheをインストールするコマンドを叩けば、1つのレイヤーが作成されます。MySQLをインストールすれば、さらにレイヤーが作成されます。こうして**イメージ**をくっつけることで、オリジナルの**イメージ**を作成することができます。

この作成した**イメージ**をもとに、コンテナ起動を行うと、コンテナレイヤーが作成されます。コンテナレイヤーでファイルの追加や削除などが可能です。ここでHTMLやJSを扱うイメージです。

## ウェブアプリケーションを動かしてみる
### Nginxコンテナを立ち上げる
$ docker run --name <コンテナ名> -d \
  -p <ホスト側のポート番号>:<コンテナ側のポート番号> \
  <イメージ名>

```
docker run --name test-nginx -d -p 8080:80 nginx
```

※-dオプションは、コンテナ起動中にコマンドを受け付けてくれる

### バインドマウントを使用してNginxコンテナを立ち上げる
バインドマウントとは、ホスト側のディレクトリとコンテナ側のマウントポイントをリンクさせることです。

$ docker run --name <コンテナ名> -d \
  -v <ホスト側のディレクトリ>:<コンテナ側のマウントポイント>:<オプション>
  -p <ホスト側のポート番号>:<コンテナ側のポート番号> \
  <イメージ名>

```
docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d -p 8080:80 nginx
```


※roは、readonlyの意。

## クラウド環境でDockerを使用してみる
### Docker Machineとは
こちらの[サイト](https://yusukelog.com/server/docker-machine/)より引用いたしました。

> Docker MachineとはDocker（Dockerホスト）の実行させる仮想環境を管理するツール。
> 当初、DockerはLinux環境でしか使えなかった。そのため、MacやWindowsではVirtualBoxで仮想環境を構築しその上にDockerを動作させていた。
> しかし、Docker for MacやDocker for Windowsなどが登場して、単にDockerを利用する際には、Docker Machineは使われなくなった。
> 使われる場合としては、AWSやGCPといったクラウド環境へDocker環境を構築する際にに使われる。
> Docker Machineが便利なところは、コマンドラインからリモートのクラウド環境下でDockerホストを簡単に作成・管理するができること。
> Docker Machineは使うには、事前にVirtualBoxをインストールしておく。

要するに、Docker for MacやDocker for Windowsで出来ることをクラウド環境上でも行えるというものです。

### AWSで連携する
まずは、IAMからユーザー作成し、アクセスキーIDとシークレットアクセスキーIDを用意します。
用意できたら、AWSへアクセスする際に、自動的に参照して簡単にアクセスできるように設定しておきます。
ユーザーのディレクトリに.awsフォルダを作成し、credentialsファイルを作成します（場所は任意でOK）

```
/Users/test/.aws/credentials
```

```credentialsファイル: 
[default]
aws_access_key_id = xxxxxx
aws_secret_access_key = xxxxx
```


### docker machine からAWSのインスタンスを作成してみる
docker-machine create --driver amazonec2 \
   --amazonec2-open-port 8000 \
   --amazonec2-region ap-northeast-1 aws-sandbox

--driver amazonec2 : 仮想化のドライバーにamazon ec2を設定
--amzonec2-open-port 8000 : 起動したインスタンスの8000番ポートを外部に公開
--amazonec2-region ap-northeast-1 : 東京リージョンを設定
aws-sandbox : dockerホストの名前

AWSコンソールでインスタンスの起動を確認してみましょう
起動できていれば、あとはDocker Runコマンドなどで、煮るなり焼くなりです。

## その他機能
- Automated Build
- Docker Compose
- Swarm Mode

### Automated Build（自動ビルド)
GithubやBitbucketといったソースコードのホスティングサービスでビルドコンテキスト(Dockerfileやその他のビルドに必要なファイル郡)を管理し、リポジトリ上のビルドコンテキストの内容が変更された場合に自動的にビルドを実行する仕組み

### Docker Compose
マルチコンテナのDockerアプリケーションを定義して実行するためのツール。開発環境やテスト環境作成に使われます。webサーバー、DBサーバー、キャッシュサーバーなどの定義を1つのymlファイル記述しておき、それを実行することで、コンテナが作成されます。

### Swarm Mode
複数台Dockerホストを用意して、柔軟な対応が出来る機能。
Swarm Modeで動作しているDockerで、以下の機能を利用できます。
- クラスタ管理機能
- オーケストレーション機能

**クラスタ管理機能**
飛んできたリクエストを、各Dockerホストに分散し、リクエスト負荷を軽減出来ます。

**オーケストレーション機能**
1つのDockerホストがダウンしたときに、不足した分のコンテナを他のDockerホストで起動してくれます。