使用Docker启动的CentOS6.8 apache2.2 PHP5.3连接到AWS RDS

通常,在这里会连接到作为容器启动的MySQL,但这篇文章有点不同。因为在我目前正在面对的系统中,这样做是唯一的现实解决方案!

实际上,我们本来也想将数据库转移到本地,但是RDS上的数据量太大了,而且我们刚刚开始涉足这个系统,对于提取开发所需的最小数据的知识也不足够。
嗯,这种差距常常很常见。
另外,与上次相比,PHP的版本也降低了0.1。现实是残酷的。

只有将理想视为理想,才能面对现实并继续前进。
希望这个独特的专业知识能够对某人有所帮助。

首先,请确认主机操作系统能够连接到RDS。

既然从主机无法连接,那么从容器连接的可能性根本不存在,所以首先需要确认一下。
公共数据库似乎不存在(对吗?),这只是一个普通的ssh隧道连接示例。

在SSH端口转发中连接MySQL的参考资料是:http://qiita.com/aita/items/b4efd473ba4e5a09b91e

使用公钥认证是最快捷的SSH认证方式。
在这种情况下,由于包含了秘钥,需要注意处理容器镜像以防泄露。
嗯,不仅如此,对于WEB系统来说,没有办法避免在配置文件等中写入密码,所以处理方式与此类似。

参考来源
关于ssh公钥认证设置的概要
http://qiita.com/iruseira/items/af8550fea92b5c5f7fca

$ 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相关的处理分开,容器镜像变得相当庞大,约为1GB。

由于追求“小而美”,我们计划以后将其变得更小,但现在先这样吧。

#!/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,就姑且这样吧。真是的,我自己倒是用了很多姑且呢~。

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

启动

docker-compose up -d

不再进行。

docker-compose stop
docker-compose rm -f

如果对你有帮助的话。

广告
将在 10 秒后关闭
bannerAds