dockerでLAMP環境作ってみた(CentOSを使用)

# まえがき

CentOSを使ったLAMP環境で自作ゲーム作ってるけどもグラフィックのいくらかをやってくれてたメンバーがプログラマーとしてもソース弄りたいということで、じゃあ開発環境提供しようかなと思ったら意外と手間
なのでdocker使ってさくっと開発環境構築できるようにしようとした
しかしネットにあるdockerでのLAMP環境はCentOSでのyumインストールとかの考慮がないので色々と不都合が多かった
というわけでCentOSにapacheとphpを入れてmysqlをDBサーバとして使用するという方法で開発環境構築してみた

# やり方
docker-compose書いてイメージを作成する。
DBデータ含め何回も再構築することを前提にしてるのでdocker-compose upするときには周辺の諸々の処理を行う専用のシェルスクリプトを作り、それを実行する。
あと、DBのデータ保存とかは考えてないので本番環境でこれをコピペする場合VOLUMEかなんかでちゃんと分離しましょう。
正直長いのでgithubへリポジトリを作ったのでcloneしてそのまま使う方が早いと思われる。(github→ https://github.com/Hayakuchi0/dclamp )

```shell-session
$ git clone https://github.com/Hayakuchi0/dclamp.git
$ cd dclamp/buildtools
# docker pull centos
# docker pull mysql:5.7
# ./buildDocker.sh
```

# 実際にやってること

## コンテナ構成
コンテナはWEBサーバ(CentOS,Apache,PHP)とDBサーバに分離。
DBサーバのアドレスはdbserverとして扱う。(本番の場合には/etc/hostsに記述して下さい。もしくはdocker-compose.ymlのhostsを書き換えて下さい。)
WEBサーバからDBサーバへアクセスしてSQLを色々する感じ。


## 各ソース解説

###　ディレクトリ構成

```
.
├── buildDocker.sh
├── docker-compose.yml
├── mysql
│   └── Dockerfile
├── myweb
    ├── debugDocker.sh
    ├── Dockerfile
    └── init.sh
```

###　各ソース

既存のコンテナを削除し、docker-compose upするスクリプト。
webサーバーの起動用スクリプトも実行してる。
正直こいつをいじる必要も機会も一切ない。

```shell:dclamp/buildtools/buildDocker.sh
#!/bin/sh
docker_kill myserver_apache2
docker rmi -f buildtools_webserver:latest
docker-compose down
docker system prune
docker-compose up -d --build
./myweb/debugDocker.sh
```

upしたいdocker-composeのyml。
webサーバーの固定IPを指定してるところと、開発環境のwebサーバのポートを指定してるところと、mysqlの初期パスワードに注意。
volumesとか入れたいならいじる必要あり。

```yml:dclamp/buildtools/docker-compose.yml
version: '2'
services:
  dbserver:
    build: ./mysql
    hostname: dbserver
    environment:
      MYSQL_ROOT_PASSWORD: example
    expose:
      - "3306"
    ports:
      - '3306:3306'
    networks:
      - my_network
  webserver:
    hostname: webserver
    build: ./myweb
    ports:
      - '8001:80'
    depends_on:
      - dbserver
    networks:
      - my_network
networks:
  my_network:
    ipam:
      driver: default
      config:
        - subnet: 172.16.0.0/24
          gateway: 172.16.0.1
```

webサーバ(CentOS)のDockerfile。
初期設定のスクリプトを読み込むことを宣言する。
1行でも消したりENTRYPOINTつけたら動かないので注意。
それ以外は追記しても全然OK。

```dockerfile:dclamp/buildtools/myweb/Dockerfile
FROM centos
ADD ./init.sh /tmp/init.sh
RUN /tmp/init.sh
EXPOSE 8001
```

初期設定のスクリプト。
今回CentOS使ったのもこれが理由。
ここでyum使ったりといった初期設定する。
apacheもここで入れる。
**2018年9月3日追記**
httpdの自動起動設定もここで行う。

```shell:dclamp/buildtools/myweb/init.sh
#!/bin/sh
yum install -y httpd httpd-devel mysql php php-pdo php-mysql
sysctemctl enable httpd.service
```

webサーバ起動のスクリプト。runをここでやるので、それ用の設定もこのへんでやるのでrunでできる設定を設定したいひとはいじりましょう。
最初に起動するスクリプト経由で起動する。
これを使ってhttpdの起動をしたりもする。
~~Ubuntuでの開発を想定してたのでxdotoolでゴリ押してるけども、使えない場合は手動で打ち込みましょう。~~
**2018年9月3日追記**
systemctlを使えばいいことに気づいたので削除

```shell:dclamp/buildtools/myweb/debugDocker.sh
#!/bin/sh
docker kill myserver_apache2
docker system prune 
docker run -i -d --name myserver_apache2 -p 8001:80 --net buildtools_my_network --privileged -t buildtools_webserver:latest /sbin/init
```

DBサーバのDockerfile。mysqlのバージョンを合わせたかったので今回は5.7
それ以外はまあ適当に追記したければ追記しましょう。
ちなみにmysqlの起動スクリプトはdocker-composeでupした時に自動で起動するので作らなくてOKです。

```dockerfile:dclamp/buildtools/mysql/Dockerfile
FROM mysql:5.7
```

# 接続

とりあえずうまくwebサーバーへのexec経由でのbashでDBサーバへの接続はこんな感じ。
あとは適宜PDOを使ったりしてください。

```shell-session
# mysql -u root -h dbserver -pexample
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.23 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>

```


# 参考文献
https://re-engines.com/2017/11/20/docker%E3%81%A7lamp%E7%92%B0%E5%A2%83%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8A%E3%80%81limesurvey%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/
https://www.tcmobile.jp/dev_blog/devtool/docker%E3%81%A7centos7%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AEsystemctl%E3%81%8C%E5%8B%95%E3%81%8B%E3%81%AA%E3%81%84%E3%81%A8%E3%81%8D/
https://qiita.com/tamanobi/items/8b8dd64ae1f959f9ff9f