AWSでDocker環境のセットアップ

# はじめに
現場がAWSを使ってるのでそろそろVPSからAWSへの移行を考えている

# AWS
AWSでLinuxを使えるようにするぞ
## AmazonMachineImageの選択
現行ではとくに理由がない限りより性能のいいハードウェア仮想マシン (HVM)が使用されている
[EC2ダッシュボード](https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#Home)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/e259aa0e-e14b-b6ed-160d-53e2ba7039a4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/14147b0b-80a6-a4d7-c68f-3d0880c67716.png)
## インスタンスタイプの選択
`t2.micro` インスタンスタイプを選択します（デフォルト）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/5d7ad88a-f851-526e-ab19-5bfdd95b3079.png)

## キーペアのダウンロード
キーペアをダウンロードしてインスタンスの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/0e09c4ee-83b4-59f1-215a-4c7c44d9e2eb.png)

## ダッシュボードの様子が変わった
「インスタンス（実行中）」をクリックして、パブリック IPv4 アドレスを確認しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/78785e02-46ec-884d-e4d2-fef7d6dcc58d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/720f477f-9aaa-b15f-7c56-8c9759eebdbe.png)

## ssh接続用設定ファイルを設定
ssh接続するときはおなじみのやつね。秘密鍵を保存するのと同じ要領でaws_keypairを保存し、HostNameはさっきのパブリック IPv4 アドレスで、IdentityFileにaws_keypairの場所を指定する。Userは固定みたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/f419ca36-ecf2-19eb-cef8-b642e2c07f60.png)

```text:C/User/yoshi/.ssh/config
Host aws
  HostName 52.72.117.178
  IdentityFile ~/.ssh/aws_keypair.pem
  User centos
```

## 確認
```terminal
PS D:\OneDrive\dev\Docker> ssh aws
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Sun May 23 10:13:07 2021 from 61.87.41.78
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Sun May 23 10:13:07 2021 from 61.87.41.78
[centos@ip-172-31-17-55 ~]$ cat /etc/redhat-release
  CentOS Linux release 8.2.2004 (Core)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/b8c0d752-7788-3bc9-11c7-f44d718fdf7e.png)

# AWSでのrootへの入り方
```terminal
$ sudo su -
  Last login: Sun May 23 10:36:37 UTC 2021 on pts/0
#
```

# Docker
## CodeIgniter4が動く環境を構築
[DockerでCodeigniter4 betaを動かす](https://www.aska-ltd.jp/jp/blog/16)

> yum-utils は yum-config-manager ユーティリティを提供します。 また device-mapper-persistent-data と lvm2 は devicemapper ストレージ・ドライバを利用するために必要です。

```
# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum -y install docker-ce
# systemctl start docker
# docker --version
  Docker version 20.10.6, build 370c289
# systemctl enable docker
```
一般ユーザがsudoなしでdockerコマンドを実行できるように、`centos` ユーザをdockerグループに所属させる

```
# gpasswd -a centos docker
  Adding user centos to group docker
```
Docker Composeのインストール
https://docs.docker.jp/compose/install.html#linux-compose

```
# 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
# chmod +x /usr/local/bin/docker-compose
# docker-compose --version
  docker-compose version 1.16.1, build 6d1ac21
```
```terminal:一般ユーザに戻っておく
# exit
```

# 設定
```
/home/centos
 ├── docker-compose.yml
 ├── mysql
 │       └── my.cnf
 ├── nginx
 │       └── default.conf
 ├── php-fpm
 │       ├── Dockerfile
 │       └── php.ini
 └── src   <- この下にCodeigniter4のソースを設置します。
```
## docker-compose.yml
基準となるディレクトリ（どこでもいい）に設定ファイルを作ります（apacheでいうconfファイル）。一般ユーザ(centos)のhomeに作ります

```terminal:terminal
$ cd ~
$ vi docker-compose.yml
```
```yml:docker-compose.yml（インデントは同じ数に）
version: '3'
services:
  nginx:
    image: nginx
    restart: always
    ports:
      - 80:80
    volumes:
      - ./src:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php-fpm
  php-fpm:
    build: ./php-fpm
    restart: always
    volumes:
      - ./src:/var/www/html
      - ./php-fpm/php.ini:/usr/local/etc/php/php.ini
    depends_on:
      - mysql
      - redis
  mysql:
    image: mysql:5.7
    restart: always
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: root001
      TZ: "Asia/Tokyo"
    volumes:
      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
      - mysql-storage:/var/lib/mysql
  redis:
    image: redis:4
    restart: always
    ports:
      - 6379:6379
    volumes:
      - redis-storage:/data
volumes:
  mysql-storage:
  redis-storage:
```

## mysql
```terminal:terminal
$ mkdir mysql
$ vi mysql/my.cnf
```
```my.cnf
[mysqld]
character-set-server=utf8

[client]
default-character-set=utf8
```

## nginx
```terminal:terminal
$ mkdir nginx
$ vi nginx/default.conf
```
```default.conf
server {
    listen       80;
    server_name  localhost;
    root         /var/www/html;
    index        index.php;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}
```

## Dockerfile
```terminal:terminal
$ mkdir php-fpm
$ vi php-fpm/Dockerfile
```
```Dockerfile:Dockerfile
FROM php:7.3-fpm

ENV COMPOSER_ALLOW_SUPERUSER 1

# apcuとopcacheはインストールしなくても問題ありません。
RUN apt-get update && \
    apt-get -y install libxml2-dev libcurl4-openssl-dev zip unzip git && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    docker-php-ext-configure mysqli --with-mysqli=mysqlnd && \
    docker-php-ext-install intl json mbstring mysqli xml curl opcache && \
    pecl install redis apcu && \
    docker-php-ext-enable redis apcu && \
    curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
```

## php.ini
```terminal:terminal
$ vi php-fpm/php.ini
```
```php.ini
[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = UTF-8
mbstring.language = Japanese
```

## 確認
4つのコンテナのStateが全てUpになっていたらOK

```terminal:terminal
$ docker-compose up -d
$ docker-compose ps
      Name                    Command               State                          Ports
---------------------------------------------------------------------------------------------------------------
centos_mysql_1     docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp,:::3306->3306/tcp, 33060/tcp
centos_nginx_1     /docker-entrypoint.sh ngin ...   Up      0.0.0.0:80->80/tcp,:::80->80/tcp
centos_php-fpm_1   docker-php-entrypoint php-fpm    Up      9000/tcp
centos_redis_1     docker-entrypoint.sh redis ...   Up      0.0.0.0:6379->6379/tcp,:::6379->6379/tcp
```

## ※DockerでCouldn’t connect to Docker daemonが出る場合の原因と解決方法
https://www.virment.com/how-to-fix-couldnt-connect-to-docker-daemon/
グループの追加を反映させるには、ログインし直す必要があるので、一度ログアウトして再ログインしてください。