Dockerで起動したCentOS6.8 apache2.2 PHP5.3から AWS RDSに接続する

ふつーはここでコンテナとして立ち上げたMySQLに接続するところでしょうが、このポストは一味違います。
なぜなら私が今立ち向かっているシステムでは、**そうすることが現実解だからです！**

本当はDBもlocalに持ってきたかったのですが、RDS上のデータが巨大すぎ、その上関わり出したばかりのシステムで、開発に必要最小限のデータを割り出すための知識も不足しているという。。
ま、この程度のギャップはありがちですね。
地味に前回よりPHPのバージョンも0.1下がっています。現実は厳しい。


理想は理想として、現実に立ち向かっていかねばなりませんので進めます。
願わくばこのニッチなノウハウが誰かの役に立ちますように。


# まずホストOSからRDSに接続できることを確認する
ホストから繋がらないのにコンテナからつながるわけないので、まずは確認です。
publicなDBなぞあるわけないので(ないですよね？)、ふつーと思われるssh tunnel経由での接続例です。

> 参考
SSHポートフォワーディングでMySQLにつなげる
http://qiita.com/aita/items/b4efd473ba4e5a09b91e

ssh認証には公開鍵認証を使うのがもっとも手っ取り早いと思われます。
この場合、コンテナの中に秘密鍵を含めることになりますので、コンテナイメージが流出しないよう扱い注意！になります。
まあ、そうでなくても設定ファイル等にパスワードを書いたりしなければならないのがWEBシステムの宿命ですのでそれと扱いは一緒だとは思います。

> 参考
ssh公開鍵認証設定まとめ
http://qiita.com/iruseira/items/af8550fea92b5c5f7fca


```sh
$ ssh -fNL 3307:xxxxx.rds.amazonaws.com:3306 [踏み台サーバーのuser]@[踏み台サーバーのIP]
$ mysql -u [MySQLのユーザー名] -h 127.0.0.1 -P 3307 -p
```

.
.
.
繋がりました？
繋がりましたね。

繋がらないようでしたら以下をごらんください。

> SSHでどうしても鍵認証できないときに見るもの
http://qiita.com/fukusuke/items/6eb9f8593a296a95798c


.
.
.
今度こそ繋がりました？
繋がりましたね。


# コンテナからRDSに接続する

ということで同じ作業をphpコンテナの中でもやります。

centos6系の公式イメージを元に、ssh, PHP5.3の必要なモジュール、Memcache,MySQLへの接続に必要なものを追加してきます。

```
FROM centos:6.8
MAINTAINER furuyamah <furuyamah@isao.co.jp>

# 必要なものをインストール
# CentOS6.8のPHPは5.3なのでそのまま使う
# CentOS6.8のMySQLは5.1なので5.5をremiから入れる
# MySQLを後から入れるとPHP5.4を要求されるので、MySQLから入れる
RUN yum update -y && \
    rpm -ivh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm && \
    rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm && \
    yum install -y --enablerepo=remi mysql compat-mysql51 && \
    yum install -y gcc ImageMagick-devel curl-devel && \
    yum install -y \
        httpd \
        httpd-devel \
        httpd-tools \
        php \
        php-cli \
        php-common \
        php-dba \
        php-devel \
        php-gd \
        php-mbstring \
        php-mcrypt \
        php-mysql \
        php-pdo \
        php-pear \
        php-pecl-apc \
        php-pecl-memcache \
        php-xml \
        php-xmlrpc && \
    pecl clear-cache && \
    printf "\n" | pecl install imagick-3.1.2 && \
    printf "\n" | pecl install pecl_http-1.7.6

# 設定ファイルをコンテナの中にコピー
COPY httpd.conf /etc/httpd/conf/
COPY php.ini /etc/
COPY imagick.ini /etc/php.d/
COPY pecl_http.ini /etc/php.d/


# ssh tunnelに必要なsshと証明書を配置する
RUN yum install -y openssh-clients
COPY id_rsa_for_docker /root/id_rsa
RUN chmod 600 /root/id_rsa

WORKDIR /var/www
COPY docker-entrypoint.sh /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]

EXPOSE 80
```

php関連のインストールとssh関連の処理でレイヤーを分けてしまったためか、コンテナイメージがかなり肥大化しています。約1Gbye。
**小さいは正義**ですので、後々は小さくしていきたいと思っていますが、まずはこれで。



```:docker-entrypoint.sh
#!/bin/bash
set -e

# establish ssh tunnels for DB
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -fNL 3307:xxxxx.rds.amazonaws.com:3306 [踏み台サーバーのuser]@[踏み台サーバーのIP] -i /root/id_rsa

# start httpd
/etc/init.d/httpd start

# to continue this container process
tail -f /dev/null
```

というわけでdocker-entrypoint.shでトンネルとhttpdの起動をしています。
本来Dockerは、1コンテナ1プロセス、プロセスはフォアグラウンドで、がお約束です。
このままだとフォアグラウンドのプロセスがないので起動後速攻で落ちてしまいます。
それを防止するためにtailしています。

本来はhttpdをフォアグラウンドで動かすべきですが、めんどくさいことを全部/etc/init.d/httpdに任せるために、とりあえず、ということで。我ながらとりあえずが多いな〜。


```docker-compose.yml
apache-php:
  build: ./apache-php
  ports:
    - "80:80"
  volumes:
    - "./apache-php:/var/www"
  links:
    - memcached

memcached:
  image: memcached:1.4
```


### ディレクトリ構成

設定ファイルが増えています。

```
project_dir
+- docker-compose.yml
+- apache-php
    +- Dockerfile
    +- index.php
    +- id_rsa_for_docker
    +- pecl_http.ini
    +- imagick.ini
    +- httpd.conf
    +- php.ini
```


### 起動

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

### 停止

```sh
docker-compose stop
docker-compose rm -f
```



参考になれば。