AWSのEC2でDockerを試してみる

# 概要
Dockerについてちょっこす勉強したので、ついでにDockerをEC2で動かしてみる。
[AWS ECS](https://aws.amazon.com/jp/ecs/)があるので、EC2でやらなくてもいいのですが、コマンドを色々と試してみるために構築。

# 試してみたこと
インストールやら実行して見たことのメモ。
とりあえず、docker-composeを使って、WordPressを立ち上げてみようと思います。

## AWS EC2の立ち上げ
* コンソール上からインスタンスを立ち上げ
    * OSはAWSのLinuxを利用
    * sshで接続できるようなセキュリティ設定をしておく
* 下記コマンドでインスタンスにログイン

```
$ ssh -i <<キーペア>> ec2-user@<<パブリックIPアドレス or パブリックDNS>>
```

## Dockerのインストール
* インストール&起動

```
$ sudo yum update
$ sudo yum install -y docker
$ sudo service docker start
Starting cgconfig service:                                 [  OK  ]
Starting docker:	.                                  [  OK  ]
```
* dockerグループにec2-userを追加

```
$ sudo usermod -a -G docker ec2-user
$ cat /etc/group |grep docker
docker:x:497:ec2-user
```
* 一度ログアウトして、再度ログインし、下記コマンドで追加されていることを確認

```
$ docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
・・・・・
Registry: https://index.docker.io/v1/
```

## docker-composeのインストール
[公式ドキュメント](https://docs.docker.com/compose/install/)にある通り、curlでインストール

```
$ curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.9.0, build 2585387
```

# WordPressを立ち上げる
* Docker Composerを使って複数のコンテナを一元管理
* 構成は下記
    * WordPressイメージを利用 (web-serverコンテナ)
    * MySQLイメージを利用 (db-serverコンテナ)
    * データ保存先は保存用コンテナを準備 (data-onlyコンテナ)
* こちらは[プログラマのためのDocker教科書](https://www.amazon.co.jp/Docker/dp/479814102X/ref=tmm_other_meta_binding_swatch_0?_encoding=UTF8&qid=1483682891&sr=8-1-fkmr0)の内容を実際にやって見たものになります

## データ保存用コンテナの作成
* イメージは[BusyBox](https://hub.docker.com/_/busybox/)を利用
* Dockerfileを下記のように作成

```
# Dockerイメージの取得
FROM busybox

# 作成者情報
MAINTAINER 0.1 your-account@your-domain.com

# データの設定
VOLUME /var/lib/mysql
```
* コンテナの生成

```
$ docker build -t data-only .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM busybox
latest: Pulling from library/busybox

fdab12439263: Pull complete 
Digest: sha256:f102731ae8898217038060081c205aa3a4ae3f910c2aaa7b3adeb6da9841d963
Status: Downloaded newer image for busybox:latest
 ---> 1efc1d465fd6
Step 2 : MAINTAINER 0.1 your-account@your-domain.com
 ---> Running in 0a251281984a
 ---> 55a5492c2587
Removing intermediate container 0a251281984a
Step 3 : VOLUME /var/lib/mysql
 ---> Running in 67ec86d59105
 ---> b5937066eefa
Removing intermediate container 67ec86d59105
Successfully built b5937066eefa

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
data-only           latest              b5937066eefa        About a minute ago   1.095 MB
busybox             latest              1efc1d465fd6        2 weeks ago          1.095 MB
```

* コンテナの起動

```
$ docker run -it --name data-only data-only
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # exit

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
3fb730b66d6e        data-only           "sh"                36 seconds ago      Exited (0) 26 seconds ago                       data-only
```

## WebサーバとDBサーバのコンテナ作成
WordPress構築のため、下記2つのコンテナを生成します。

* Webサーバ (web-serverコンテナ)
    * WordPressのFEサーバでユーザからのリクエストを受ける処理を担う
ポートは80番
    * [WordPressイメージ](https://hub.docker.com/_/wordpress/)を使うが、内部的にはApacheとPHPで動作している
    * 次のDBサーバとデータ連携する  
* DBサーバ (db-serverコンテナ)
    * [MySQLイメージ](https://hub.docker.com/_/mysql/)を使う
    * Webサーバからのデータ処理を受け付ける

### ①docker-composerの設定
docker-compose.ymlを下記のように作成

```docker-compose.yml
# Webサーバの設定
web-server:
  # イメージの指定
  image: wordpress

  # ポート転送設定
  ports:
    - "80:80"

  # コンテナのリンク指定
  links:
    - "db-server:mysql"

# DBサーバの設定
db-server:
  # イメージの指定
  image: mysql

  # データ保存先の指定
  volumes_from:
    - data-only

  # 環境変数の指定
  environment:
    MYSQL_ROOT_PASSWORD: password
```

### ②コンテナの起動
* 下記コマンドでコンテナ群(WebサーバとDBサーバ)をバックグラウンドで起動

```
$ docker-compose up -d
Pulling db-server (mysql:latest)...
latest: Pulling from library/mysql
75a822cd7888: Pull complete
b8d5846e536a: Pull complete
b75e9152a170: Pull complete
832e6b030496: Pull complete
fe4a6c835905: Pull complete
c3f247e29ab1: Pull complete
21be3e562071: Pull complete
c7399d6bf033: Pull complete
ccdaeae6c735: Pull complete
3835a628a92f: Pull complete
530d0fb19b13: Pull complete
Digest: sha256:de1570492c641112fdb94db9c788f6a400f71f25a920da95ec88c3848450ed57
Status: Downloaded newer image for mysql:latest
Pulling web-server (wordpress:latest)...
latest: Pulling from library/wordpress
75a822cd7888: Already exists
e4d8a4e038be: Pull complete
81d4d961577a: Pull complete
f0a3d7c702e3: Pull complete
a4b7d2c4c9cc: Pull complete
de3fbbff60a9: Pull complete
336c38203cc2: Pull complete
628c443fd26f: Pull complete
6b43451e2e60: Pull complete
a4dc6da381e6: Pull complete
771a9ee2bb6a: Pull complete
3862c25af8ee: Pull complete
a3bf90f1df74: Pull complete
4564f4870a3e: Pull complete
ec9c03f98075: Pull complete
5f4dfa2bfbb4: Pull complete
69feb6fb40db: Pull complete
5f129a65fac7: Pull complete
Digest: sha256:0bb659eafa22cdb9f14bc05d17be97132842eb122eb8ff346ecafe7553f48f22
Status: Downloaded newer image for wordpress:latest
Creating docker_db-server_1
Creating docker_web-server_1

$ docker-compose ps
       Name                      Command               State         Ports        
---------------------------------------------------------------------------------
docker_db-server_1    docker-entrypoint.sh mysqld      Up      3306/tcp           
docker_web-server_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:80->80/tcp
```

* ここまででWordPressは起動しているので、EC2のURLにアクセスしてみて、画像のような画面が表示されればOK
<img width="1111" alt="スクリーンショット 2017-01-06 15.58.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/71637/6c173f9d-0e19-bd10-0d6c-631ab3aee053.png">

### ③データ専用コンテナにマウントされているかの確認
```
$ docker start -ia data-only
/ # ls /var/lib/mysql
auto.cnf            ib_logfile0         ibdata1             mysql               sys
ib_buffer_pool      ib_logfile1         ibtmp1              performance_schema  wordpress
/ # exit
```

## その他
* コンテナの稼働状況確認

```
$ docker-compose ps
       Name                      Command               State         Ports        
---------------------------------------------------------------------------------
docker_db-server_1    docker-entrypoint.sh mysqld      Up      3306/tcp           
docker_web-server_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:80->80/tcp
```
* コンテナでのコマンド実行例

```
$ docker-compose run web-server /bin/bash
root@968b067b5b2d:/var/www/html# pwd
/var/www/html
```
* コンテナ一括停止とリスタートコマンド例

```
$ docker-compose stop
$ docker-compose restart
```
* コンテナ一括削除

```
$ docker-compose rm
```
* テータ専用コンテナのバックアップとリストア方法

```
■バックアップ
$ docker export data-only > backup.tar

■リストア
$ tar xvf backup.tar
```

# 感想
今回はAWS EC2でdockerをインストールして、WordPressを立ち上げるまでをやって見ました。
おそらく、WordPress立ち上げはコマンド実行でもそんなに時間はかからないと思いますが、
dockerを使えばそれ以上に簡単にアプリケーションの立ち上げが簡単にできることを実感しました。
これにDocker MachineやDocker Swarmを使ってマルチホスト管理やクラスタ管理もできると考えると、
dockerは本当に便利ですね。そしてそれをサポートしているAWS ECSもすごいですねw

次は、ECSを使って何かをやって見たいと思います！！

# 参考
* [Docker](https://www.docker.com/)
* [Docker Hub](https://hub.docker.com/)
* [AWS ECS](https://aws.amazon.com/jp/ecs/)