Dockerでapache7.4+mysql8環境構築（初期データ入り）（自分メモ）

今更ですが、Macで表題の環境を作らなくてはいけなくなったので、構築してみました。
備忘録として書いておきます。

#環境
マシン macOS Catalina 10.15.7

#構成
ファイル、ディレクトリの構成はざっくりと以下のようにします。

```
任意のディレクトリ
  │
  ├── docker-compose.yml
  │
  ├── html/
  │   └── index.html
  │
  ├── mysql/
  │   ├── Dockerfile
  │   ├── data/
  │   ├── init/
  │   │   └── init.sql
  │   └── my.cnf
  │
  ├── php-apahce/
      ├── Dockerfile
      └── php.ini
```

#この構築の重要な部分
docker-compose.ymlとDockerfileがこの構築の重要な部分になります。

|ファイル名|説明|
|:---|:---|
|docker-compose.yml|コンテナの構成を定義するもの。コンテナ間通信の定義もできる。|
|Dockerfile|dockerのイメージに対する定義。|

###docker-compose.ymlの要素
調べて自分が認識している限りだと以下の通り

|名称|意味|
|:---|:---|
|build|Dockerfileがある位置を指定|
|volumus|ローカル内のマウントされる場所:コンテナ内のマウントする場所|
|ports|ポートフォワード|
|container_name|コンテナの名前 docker container lsのname|
|environment|環境変数？変数名で何を意味するかがなんとなくわかる|

###Dockerfileの要素
調べて自分が認識している限りだと以下の通り


|名称|意味|
|:---|:---|
|FROM|何をどのバージョンで|
|EXPOSE|どのポートを使用するか|
|ADD|ローカルファイルをコンテナ内ファイルに追記|
|CMD|コンテナ起動時に実行されるやつ|
|COPY|ローカルファイルをコンテナ内ディレクトリにコピーする|
|RUN|イメージ作成時に呼ばれるやつ。なのでパッケージのインストール等を書く。|


#構築
本編はここからです。

##確認
まずコンテナの状態確認

```
ksk@ksknoMacBook-Pro work % docker container ls -a
CONTAINER ID   IMAGE             COMMAND                  CREATED       STATUS       PORTS                               NAMES
```
何もいません

##./docker-compose.yml

docker-compose.ymlとは、コンテナの構成を定義するファイル

```docker-compose.yml
version: '3'
services:
  php-apache:
    build: ./php-apache/
    volumes:
      - ./html:/var/www/html
    ports:
      - 8080:80
    container_name: web
  mysql:
    build: ./mysql/
    volumes:
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    environment:
      - MYSQL_ROOT_PASSWORD=docker
      - MYSQL_DATABASE=mydb
      - MYSQL_USER=appuser
      - MYSQL_PASSWORD=appuser1
    container_name: db
    ports:
      - 3306:3306
```


ymlに書いている属性？で、自分が理解していることを以下の表に書いてみる
（間違っているところを指摘してくれる優しい人いたら教えてください）




##./html/index.php
動作確認するために使用。
とりあえず、DBのデータを表示できれば良しとする。
volumesの定義により、htmlがドキュメントルートとなる。



```index.php
<?php
try {
    $db = sprintf('mysql:host=%s:3306;dbname=%s',  'mysql', 'mydb');
    $dbh = new PDO($db, 'appuser', 'appuser1');
    foreach($dbh->query('select * from users') as $row) {
        echo $row['name'] . '<br>';
    }
    $dbh = null;
} catch (PDOException $e) {
    echo $e;
    die();
}
$dbh = null;
```

hostの指定で「'mysql'」としていますが、これはdocker-compose.ymlのservice名と理解しています。

```docker-compose.yml
  mysql:　　　　　←これ！！！
    build: ./mysql/
    volumes:
```


##./mysql/Dockerfile

mysql側のDockerfile
DockerfileとはDockerイメージの定義を書くファイルです。


```Dockerfile
FROM mysql:8.0

EXPOSE 3306

ADD ./my.cnf /etc/mysql/conf.d/my.cnf

CMD ["mysqld"]
```


##./mysql/init/init.sql
適当なテーブルとデータを詰め込むような記述にしておく

```
use mydb;

CREATE TABLE users (
  id int(10) unsigned not null auto_increment,
  name varchar(255) not null,
  primary key (id)
);

insert into users(name) values('hogeo');
insert into users(name) values('fugao');
```

##./mysql/my.cnf

```my.cnf
[mysqld]
character-set-server=utf8
default_authentication_plugin=mysql_native_password

[mysql]
default-character-set=utf8

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

###default_authentication_plugin=mysql_native_passwordについて
mysqlのデフォルト認証プラグインが変わったので、デフォルトの認証プラグインを変更しています。
mysqlの環境変数でユーザ（appuser）作っていますが、mysql_native_passwordという認証プラグインで設定されます。
デフォルトのままだと、phpがmysqlへのアクセスで失敗します。



##./php-apache/Dockerfile

色んなサイトを見て参考にさせてもらいました。

```
FROM php:7.4-apache
COPY ./php.ini /usr/local/etc/php/
RUN apt-get update
RUN apt-get install -y zip unzip vim libpng-dev libpq-dev
RUN docker-php-ext-install pdo_mysql
```

##./php-apache/php.ini

色んなサイトを見て参考にさせてもらいました。

```
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```

##docker-compose build

上記を作った後、docker-compose.ymlと同階層で以下のコマンド実行

```
ksk@ksknoMacBook-Pro work % docker-compose build
〜〜〜中略〜〜〜
Successfully built e5b1c15e825e
Successfully tagged work_php-apache:latest
Building mysql
Step 1/4 : FROM mysql:8.0
 ---> d4c3cafb11d5
Step 2/4 : EXPOSE 3306
 ---> Using cache
 ---> e11d55e213ab
Step 3/4 : ADD ./my.cnf /etc/mysql/conf.d/my.cnf
 ---> Using cache
 ---> 6dd70a6b7ecd
Step 4/4 : CMD ["mysqld"]
 ---> Using cache
 ---> c22190479ddf

Successfully built c22190479ddf
Successfully tagged work_mysql:latest
```

##コンテナ作成&起動

```
ksk@ksknoMacBook-Pro work % docker-compose up -d
Creating web ... done
Creating db  ... done
```

##確認
コンテナの状態確認

```
ksk@ksknoMacBook-Pro work % docker container ls -a
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                               NAMES
b416b97d3f7b   work_mysql        "docker-entrypoint.s…"   2 seconds ago   Up 2 seconds   0.0.0.0:3306->3306/tcp, 33060/tcp   db
9985abb2eb90   work_php-apache   "docker-php-entrypoi…"   2 seconds ago   Up 2 seconds   0.0.0.0:8080->80/tcp                web
```
コンテナが確認できました

##画面確認
http://localhost:8080
こちらへアクセス

![qiita_20200117_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032988/6b024d3f-d518-d5b5-c0c0-820bd2c5432a.png)

以上！