dockerを使ってPhalcon+Apache+MySQLの環境構築を行う方法
最近PHPフレームワークの「Phalcon」を使い始めたので、Phalconで遊ぶためにdockerで開発環境を構築していく。
Phalcon自体そもそもユーザー数が少ないのか良い感じのDockerfileが落ちていないので、自分でDockerfileを作成して開発環境を構築していく。
あくまでも今回はPhalconを扱える環境をサッと構築することを目的としているので、「PHP7.4+Phalcon+Apache2.4+MySQL5.7」の環境を作っていく。
今回使った環境
- Windows10 (HostOS)
- Docker version 20.10.5, build 55c4c88
Dockerを使って環境構築をするので、Mac、Linuxでも同様にできると思う。今回の作業でWindows特有のコマンド等は使っていない。
1,Dockerfileの作成
まずはDockerfileを作成していく。流れとしては、必要なcentosのパッケージをインストールした後にphpとapacheを入れて、phalcon、phalconが依存しているphp-psrの2つのPHP extensionをgitから入れて設定ファイルを変更する。
そしてcomposerとphalconの開発に便利なphalcon/devtoolsを入れて、apacheの設定ファイルを修正して.htaccessを使えるようにすれば完成。
FROM centos:7
# centosの標準リポジトリにはPHP7.4が入っていないので、PHP7.4がインストールできるリポジトリを追加する。
RUN yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && \
yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm && \
yum-config-manager --enable remi-php74
# 環境構築で必要なcentosのパッケージをインストール
# 特にunzipはPhalconの開発を便利にするphalcon/devtoolsが依存しているパッケージなので入れる。
RUN yum -y update
RUN yum -y install yum-utils epel-release zip unzip
RUN yum clean all
# ApacheとPHP本体、必要なPHP extensionを入れる。
RUN yum install -y httpd \
php \
php-cli \
php-common \
php-mbstring \
php-devel \
php-xml \
php-zip \
php-mysqlnd \
php-pdo \
php-opcache --nogpgcheck \
php-bcmath
# gitを追加
RUN yum install -y git
# Phalconをgitからインストールしてビルドする。
RUN git clone git://github.com/phalcon/cphalcon.git && \
cd cphalcon/build && \
./install
# 先ほど入れたPhalconをPHP extensionとして追加する
RUN cd cphalcon/ext && \
phpize && \
./configure && \
make && \
make install
# Phalconはphp-psrと言うPHP extensionに依存しているので、php-psrも追加する
RUN git clone https://github.com/jbboehr/php-psr.git && \
cd php-psr && \
phpize && \
./configure && \
make && \
make install
# 先ほど入れた2つのextensionを使えるように、php.iniに書き込み
RUN echo "extension=psr.so" >> /etc/php.d/phalcon.ini && \
echo "extension=phalcon.so" >> /etc/php.d/phalcon.ini
# composerをインストールする。
# もし、sha384関連でエラーが出た場合は「756890a4488ce9024...」のハッシュ値が古くなっている可能性があるので、
# 公式(https://getcomposer.org/download/)を参考にハッシュ値を変更すること。
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" &&\
php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" && \
php composer-setup.php --install-dir=/usr/local/bin --filename=composer && \
php -r "unlink('composer-setup.php');"
# phalcon/devtoolsを入れる& webと言う名前のphalconプロジェクトを作成する。
# vendor/phalcon/devtools/phalcon project web
# 上記のコマンドを実行すると、/var/www/htmlにwebディレクトリが作成されてその中にphalconのcontrollerやmodelが
# 一式入ったものが追加される。
RUN cd /var/www/html && \
composer require phalcon/devtools && \
vendor/phalcon/devtools/phalcon project web && \
mv composer.json ./web && mv composer.lock ./web && \
mv ./vender ./web
# apacheの設定ファイルの変更
# 1行目はServerNameが設定されていないという警告が表示しないようにするため
# 2行目は.htaccessを使えるようにするため。
RUN echo "ServerName localhost" >> /etc/httpd/conf/httpd.conf
RUN sed -ri "s/AllowOverride None/AllowOverride ALL/g" '/etc/httpd/conf/httpd.conf'
RUN sed -ri 's!"/var/www/html"!"/var/www/html/web"!g' '/etc/httpd/conf/httpd.conf'
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
docker-compose.ymlの作成
次にdocker-compose.ymlを作成する。MySQLに関しては公式のmysql:5.7
のイメージを使っている。
version: '3'
services:
db:
image: mysql:5.7
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: sample
MYSQL_DATABASE: sample
MYSQL_USER: sample
MYSQL_PASSWORD: sample
web:
build: .
depends_on:
- db
ports:
- 8000:80
tty: true
volumes:
- ./src:/var/www/html
コンテナの中に入って作業
phalcon/devtoolsを使うためにdocker exec -it コンテナの名前 bash
を実行してコンテナに入る。(コンテナ名はdocker ps
で調べることができる)
そして以下のコマンドを実行する。
cd /var/www/html
composer require phalcon/devtools
vendor/phalcon/devtools/phalcon project web
今の段階ではHost側のマウント元のディレクトリ構造は以下の様になっているはず。
web/
vendor/
composer.json
composer.lock
このwebディレクトリの中身を全てrootディレクトリに出して以下のディレクトリ構造にする
.phalcon/
app/
cache/
public/
vendor/
composer.json
composer.lock
理想としてはDockerfileで全ての作業を終えたかったが、コンテナ側からホスト側にマウントが出来なったので、上記の手順で妥協をした。
configファイルの設定
DBを使う場合は、web/app/config/config.php
内のdatabaseの設定を変更する。今回はhostがlocalhostだがdockerを使っているとlocalhostの名前解決が行われない時があるので、127.0.0.1として設定を行う。
'database' => [
'adapter' => 'Mysql',
'host' => '127.0.0.1',
'username' => 'root',
'password' => 'sample',
'dbname' => 'sample',
'charset' => 'utf8',
],
これでhttp://localhost:8000
にアクセスするとPhalconのHelloWorldページが表示されるはず。