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ページが表示されるはず。

参考文献