EC2 on Docker-compose

EC2インスタンスに、docker-composeを入れて、WebサーバとDBサーバのコンテナを作る記事です。[ほぼこの記事のパクリです。](https://qiita.com/yumatsud/items/33bc22f7d8f640a286f4#web%E3%82%B5%E3%83%BC%E3%83%90%E3%81%A8db%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E4%BD%9C%E6%88%90)

## EC2インスタンスの作成
※今回は、VPCとかサブネットとかは作らなかったです。

①「インスタンス作成」クリック
![Screen Shot 2020-08-31 at 16.24.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307185/d985f90a-740c-464d-765f-4efb4b78f8ea.png)

②無料枠のAmazon Linux 2を選択

③「t2.micro（無料利用枠の対象）」を選択

④「確認と作成」をクリック

⑤キーの保存
ここで保存しないと二度とみれなくなるので、必ずダウンロードする。

⑥セキュリティグループに追加
タイプ:HTTP(80)
送信元: 0.0.0.0/0
![Screen Shot 2020-08-31 at 16.34.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307185/6af25b60-4466-ee27-2f14-cf4e7cfe3b2c.png)
![Screen Shot 2020-08-31 at 16.34.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307185/6ce761f6-72d7-ffa0-d119-73d59a2142f1.png)


## AWS EC2にログイン

```
(local)$ ssh -i key_portfolio_AWS.pem ec2-user@18.181.96.192
```
key_portfolio_AWS.pemと18.181.96.192は自分の状況に応じて変更してください。

## Dockerのインストール

```
(ec2-user|~)$ sudo yum update

(ec2-user|~)$ sudo yum install -y docker

(ec2-user|~)$ sudo service docker start
Redirecting to /bin/systemctl start docker.service

(ec2-user|~)$ sudo usermod -a -G docker ec2-user

(ec2-user|~)$ cat /etc/group |grep docker
docker:x:993:ec2-user
```

一度ログアウトして、再度EC2にログインする。

```
(ec2-user|~)$ exit  # ログアウト

(local)$ ssh -i key_portfolio_AWS.pem ec2-user@18.181.96.192  # 再度ログイン

(ec2-user|~)$ docker info
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
・・・
```
## Docker-composeのインストール
```
(ec2-user|~)$ sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

(ec2-user|~)$ sudo chmod +x /usr/local/bin/docker-compose

(ec2-user|~)$ docker-compose --version
docker-compose version 1.16.1, build 6d1ac21
```

## データ保存用コンテナの作成

```
(ec2-user|~)$ vi Dockerfile

FROM busybox

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

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

```
(ec2-user|~)$ docker build -t data-only .
Sending build context to Docker daemon  9.216kB
Step 1/3 : FROM busybox
latest: Pulling from library/busybox
61c5ed1cbdf8: Pull complete 
Digest: sha256:4f47c01fa91355af2865ac10fef5bf6ec9c7f42ad2321377c21e844427972977
Status: Downloaded newer image for busybox:latest
 ---> 018c9d7b792b
Step 2/3 : MAINTAINER 0.1 your-account@your-domain.com
 ---> Running in 3b3dcfb4036b
Removing intermediate container 3b3dcfb4036b
 ---> 314a9cc31b09
Step 3/3 : VOLUME /var/lib/mysql
 ---> Running in 24ff3d39dd8a
Removing intermediate container 24ff3d39dd8a
 ---> 16e1b09a9faf
Successfully built 16e1b09a9faf
Successfully tagged data-only:latest

(ec2-user|~)$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
data-only           latest              16e1b09a9faf        7 seconds ago       1.22MB
busybox             latest              018c9d7b792b        4 weeks ago         1.22MB
```
#### コンテナの起動
```
(ec2-user|~)$ docker run -it --name data-only data-only

/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var

/ # exit

(ec2-user|~)$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
475afb3d38f8        data-only           "sh"                15 seconds ago      Exited (0) 6 seconds ago                       data-only
```

## WebサーバとDBサーバのコンテナ作成
```
(ec2-user|~)$ vi docker-compose.yml
```

```docker-compose.ym
web-server:
  image: wordpress

  ports:
    - "80:80"

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

db-server:
  image: mysql

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

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

#### コンテナの起動
```
(ec2-user|~)$ docker-compose up -d

(ec2-user|~)$ docker-compose ps
        Name                      Command               State          Ports       
-----------------------------------------------------------------------------------
ec2user_db-server_1    docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp
ec2user_web-server_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:80->80/tcp 
```

ここまででWordPressは起動しています。
![Screen Shot 2020-08-31 at 17.13.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307185/039858cb-23fc-696d-b695-f43e76139ec7.png)

すると、
![Screen Shot 2020-08-31 at 17.15.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307185/1f9facb8-2d0c-a3fa-8022-6b52360dc130.png)

おーー！このように表示されれば成功です。

#### データ専用コンテナにマウントされているかの確認
> マウントとは、「コンピュータに接続した機器やメディアをコンピュータに認識させ、使える状態にすること」です。

```
(ec2-user|~)$ docker start -ia data-only
/ # ls /var/lib/mysql
#ib_16384_0.dblwr   auto.cnf            binlog.index        client-cert.pem     ib_logfile0         ibtmp1              performance_schema  server-cert.pem     undo_001
#ib_16384_1.dblwr   binlog.000001       ca-key.pem          client-key.pem      ib_logfile1         mysql               private_key.pem     server-key.pem      undo_002
#innodb_temp        binlog.000002       ca.pem              ib_buffer_pool      ibdata1             mysql.ibd           public_key.pem      sys                 wordpress
/ # exit
```

## その他
- コンテナでのコマンド実行例

```
(ec2-user|~)$ docker-compose run web-server /bin/bash
root@40e7f18520cb:/var/www/html# 
```

- データ専用コンテナのバックアップとリストア方法

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

# リストア
$ tar xvf backup.tar
```
## これから
今回は、wordpressでしました。次は、Railsアプリでしてみます。

### 参考記事
・[大筋](https://qiita.com/yumatsud/items/33bc22f7d8f640a286f4#web%E3%82%B5%E3%83%BC%E3%83%90%E3%81%A8db%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E4%BD%9C%E6%88%90)
・[EC2インスタンスの作成](https://qiita.com/fkooo/items/bb921218313123c14358)
・[docker-composeのインストール](https://qiita.com/youtangai/items/ff67ceff5497a0e0b1af)
・[インバウンドルールの追加](https://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ce#5%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%BC%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E4%BD%9C%E6%88%90)
・[ざっくりとしたマウントの意味](https://wa3.i-3-i.info/word13188.html)