Dockerを使ったCentOS + Apache + PHP + freetds 開発環境構築

## この記事を書き始めたきっかけ
嬉しいことに、弊社もだんだんと人が増えて賑やかになってきました。
そこで、入社してすぐにやることといえば、開発環境構築ではないでしょうか。
今までは、Parallels DesktopやVirtualBoxを使って仮想OSをインストールして、各種設定ファイルをvimで編集して、・・・
結果、新人さんのPCで動かない。自分の環境では動くのになんで！？みたいなことが発生するのは容易に想像がついてしまうんですよね。

そこで、少ない手順で、同一環境を構築できるようにとDockerを使って開発環境してみようと思います。
これで、今後新しいエンジニアさんが来ても↑の結果のようなことにならない・・・はず。

## 検証環境
- MacOS X Mojave 10.14.6

## 手順
1. Docker for macのインストール
以下のリンクからDocker Desktop for Macをインストールする。

https://www.docker.com/products/docker-desktop

2. Dockerfile,各ソフトウェアの設定ファイルの準備
Dockerfileは、コンテナを作成するためのレシピになります。
今回はCentOS6.8のコンテナをベースに、Apache、PHP5.6、[freetds](https://www.freetds.org/)（SQLServerに接続するためのライブラリ）をインストールします。

2.1. ディレクトリ構成
以下の構成で作成します。

```bash
$ tree
.
└── dev-server
    ├── Dockerfile
    ├── apache
    │   ├── httpd.conf
    │   └── httpd.vh80.conf
    ├── freetds
    │   └── freetds.conf
    └── php
        └── php.ini
```

2.2. 設定ファイル
- Apache(httpd.conf, httpd.vh80.conf)
httpd.confと、VirtualHost毎（今回はポート80番にアクセスがあった際の設定のみ作成します。）の設定ファイルを作成しました。


```apache:dev-server/apache/httpd.conf

# アクセスログ、エラーログの設定は省略

# VirtualHostの設定ファイルの読み込み
Include ./conf/httpd.vh80.conf

```

```apache:dev-server/apache/httpd.vh80.conf
# VirtualHostの設定
# ポート80番でアクセスされた場合の設定を記載
Listen 80

<VirtualHost *:80>
  DocumentRoot "/var/dev-api/htdocs"
  <Directory "/var/dev-api/htdocs">
    Options FollowSymLinks
    AllowOverride All
  </Directory>
</VirtualHost>

```


- PHP(php.ini)  
初期状態から最大メモリ割当量と、タイムゾーンの設定のみ変更

```ini:dev-server/php/php.ini

; メモリ上限を開発環境に合わせて上限を上げてあげる（ここでは512MBほど割り当ててみる）
; Maximum amount of memory a script may consume (128MB)
; http://www.php.net/manual/en/ini.core.php#ini.memory-limit
;memory_limit = 128M
memory_limit = 512M

; ###中略###

[Date]
; タイムゾーンを"Asia/Tokyo"に変更する。
; Defines the default timezone used by the date functions
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = Asia/Tokyo

```

- freetds(freetds.conf)

```conf:dev-server/freetds/freetds.conf

# Production
[productiondb.windows.net,1234]
host = productiondb.windows.net
port = 1234
tds version = 8.0

# Staging
[stagingdb.windows.net,1433]
host = stagingdb.windows.net
port = 1433
tds version = 8.0

# Test
[testdb.windows.net,1433]
host = testdb.windows.net
port = 1433
tds version = 8.0

```
- Dockerfile  
CentOS 6.8のイメージを元にして、開発環境のイメージを作成するDockerfileを作成する。

```dockerfile:dev-server/Dockerfile

# CentOS 6.8
FROM centos:6.8
RUN yum update -y && yum clean all

# Add repositories
# EPEL
RUN yum install -y epel-release
# remi
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

# Install apache
RUN yum install -y httpd
RUN chkconfig httpd on

# Install PHP modules
RUN yum install -y --enablerepo=remi,remi-php56 php php-devel php-mbstring php-mysql php-sybase_ct php-json php-xml php php-gd
RUN yum -y install mod_ssl
RUN yum install -y freetds freetds-devel
RUN yum -y install cronolog


# Copy freetds.conf
# TODO docker-compose.yml でマウントする設定にする。
RUN mv /etc/freetds.conf /etc/freetds.conf.org
COPY freetds/freetds.conf /etc/freetds.conf

# Copy httpd.conf
RUN mv /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
COPY apache/*.conf /etc/httpd/conf/

# Copy php.ini
COPY php/php.ini /etc/httpd/conf.d/php.ini

# Install composer
COPY --from=composer /usr/bin/composer /usr/local/bin/composer

# make directories
RUN mkdir -p /var/dev-server

# Port
EXPOSE 80

# docker runの時に実行する
# これでdocker run した場合、すぐにコンテナがとまってしまう。要改善
# CMD ["/etc/init.d/httpd", "start"]

```

3. 実行する
実行する際は、docker runコマンドにオプションを指定する。

```bash
$ docker run -itd -v .php_projects/dev-server:/var/dev-server -p 1122:80 {コンテナID} /bin/sh
```

このままではApacheが起動しないので、docker exec コマンドでApacheを実行する。

```bash
$ docker exec {コンテナID} /etc/init.d/httpd start
```

## まだ解決していない問題
今回は、Dockerfilerを作成して、コンテナの起動→コンテナに対してApache起動コマンドを実行するという２段階の手順を踏んでコンテナを起動しているが、ここをdocker run実行時に一発でApache起動までさせて楽にしたいです。
解決方法が判明次第、この記事も更新しようと思います。

## あとがき
会社のMacのOSをやっと最新版にしました。
今のところ、上記の方法でも実行できそうです。