ローカルでDocker＋LAMP環境の構築後、maridDBの接続に詰まった

phpで掲示板アプリを勉強しようと思ったのですが、
せっかくなのでDocker環境を構築してその上で作成しようと思いその時の備忘録です。

<h2>DockerでLAMP環境構築</h2>

まずやり方はこちらの記事を参考にそのまま手順を踏めばデフォルトで入っている「phpinfo()」のページまでは簡単に確認できました。

https://www.metrocode.co/blog/post/use-docker-for-local-development


記事の通りに設定し、```docker-compose up -d```でコンテナを起動

これだけでURLに```localhost```でアクセスすれば今回作成したフォルダ内にあるindex.phpにアクセスができました。すごく便利。


次にmariaDBに接続するために下記のコマンドを打ちます。

```
$ docker exec -it コンテナID mysql -u ユーザ名 -p
```

コンテナIDは ```$ docker ps ``` で起動中のコンテナが表示されます。


```
CONTAINER ID   IMAGE                 COMMAND                  CREATED              STATUS              PORTS                                            NAMES
7c876e4a6be4   bitnami/apache:2.4    "/opt/bitnami/script…"   39 minutes ago       Up 3 minutes        0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp      apache_docker_sample
5008ca456e72   (フォルダ名)_php-fpm    "php-fpm -F"             39 minutes ago       Up 3 minutes        9000/tcp                                         php-fpm_docker_sample
22695d443a79   mailhog/mailhog       "MailHog"                About an hour ago    Up 3 minutes        0.0.0.0:1025->1025/tcp, 0.0.0.0:8025->8025/tcp   (フォルダ名)_mailhog_1

```

…mariaDBがない。。

 ```$ docker ps -a  ``` で検索（これで起動していないコンテナも表示されます）

```
CONTAINER ID   IMAGE                 COMMAND                  CREATED              STATUS                        PORTS                                            NAMES
e852d2ec700b   mariadb:10.3          "docker-entrypoint.s…"   About a minute ago   Exited (1) 30 secounds ago    3306/tcp, 0.0.0.0:3307->3307/tcp                 mariadb_docker_sample

```

ありました。どうやら起動した瞬間に停止してるようです
（詳しい仕組みは私自身まだ理解してません…）

この問題の解決方法を調べるとmariaDBの永続化の設定が必要のようです。

Dockerのドキュメントによると「ボリューム」という概念があり、ボリュームとは、<b>「Docker コンテナーにおいて生成され利用されるデータを、永続的に保持する目的で利用される仕組み」</b>と書かれています。

今回詰まった箇所の修正したところは下記。

<h2>docker-compose.ymlを修正</h2>

```
(修正前)
 #MARIADB
  mariadb:
    image: mariadb:10.3
    container_name: mariadb_docker_sample
    working_dir: /application
    hostname: 127.0.0.1
    ports:
      - '3307:3307'
    volumes:
      - .:/application
      - ./mysql-data:/var/lib/mysql
      - ./mariadb/my-overrider.cnf:/etc/mysql/my.cnf
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_PASS}
      - MYSQL_DATABASE=${DB_DATABASE}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASS}
    env_file:
      - .env
  mailhog:
    image: mailhog/mailhog
    ports:
      - '8025:8025'
      - '1025:1025'
```

```
(修正後)
 #MARIADB
  mariadb:
    image: mariadb:10.3
    container_name: mariadb_docker_sample
    working_dir: /application
    hostname: 127.0.0.1
    ports:
      - '3307:3307'
    volumes:
      - .:/application
      #- ./mysql-data:/var/lib/mysql
      - ./mariadb:/var/lib/mariadb
      - ./mariadb/my-overrider.cnf:/etc/mysql/my.cnf
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_PASS}
      - MYSQL_DATABASE=${DB_DATABASE}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASS}
    env_file:
      - .env
  mailhog:
    image: mailhog/mailhog
    ports:
      - '8025:8025'
      - '1025:1025'
```

この後、Docker-composeの変更を反映

```
docker-compose up -d
```

```$ docker ps  ```で確認したらmariaDBも起動していました。

改めて```$ docker exec -it コンテナID mysql -u ユーザ名 -p```
をいれます。コンテナIDは```$docker -s```で確認できます。

ユーザー名とパスワードは```.envファイル```に設定された値を入力（１番目のリンクの記事通りに設定されてる場合は ユーザー名がdocker、パスワードがpass1234になってるはずです）

これで接続できました！

<h2>終わりに</h2>
今後はMAMPを使わず簡単にPHPの環境構築ができるようになりましたが、Dockerfileやdocker-composeに書かれてるコードの理解が足りないので今後勉強していきたいと思います。


<h2>参考にしたサイト</h2>
(Docker＋LAMP環境構築)

https://www.metrocode.co/blog/post/use-docker-for-local-development

(Docker内の動作確認)

https://yama-itech.net/construct-lamp-with-docker

(mariaDBの接続確認)

https://qiita.com/TK-C/items/39188d97c3bc6ba53b40

（初心者向けdocker-composeコマンド逆引き）

https://qiita.com/okyk/items/a374ddb3f853d1688820