前提
- Azure DevOpsのプロジェクトを作成済み
- DevOpsのプロジェクトのアプリケーションはLaravelを選択
Azure DevOps その1 初期準備で用意した環境を使っている。
Dockerfileの内容を確認
Azure DevOpsのプロジェクトで用意されたAppサービス用Dockerfileは、
Application └ Dockerfile
という感じでApplicationディレクトリーに用意されていて、Dockerfileの内容を確認すると、下記のようになっていた。
## ① FROM php:7 RUN apt-get update -y && apt-get install -y openssl zip unzip git RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer RUN docker-php-ext-install pdo mbstring ## ② WORKDIR /app COPY . /app RUN composer install ## ③ CMD php artisan serve --host=0.0.0.0 --port=8080 EXPOSE 8080
設定内容は、
- ①php:7(Alpine Linux)になっている。
- ②ソースは「app」以下のみコピーしている。(他もいるよね)
- ③
php artisan serve
でサービスを起動している。
となっているが、
php artisan serve
ではなく、Apacheで動かしたい。- Apacheを動かすのであれば、使い慣れたCentOSに変更したい。
- 「app」ディレクトリー以外のソース込みで、Apache環境下にコピーしたい。
ということで、設定を修正してみた。
Apache(httpd)の設定
Apacheの各設定ファイルを設定する。 設定ファイルは1から作成するのは大変なので、Apacheをどこからにインストールして設定ファイルをコピーしよう(楽しよう)。 で、コピーした設定ファイルを編集していく。
httpd.conf
httpd.confの設定を追加修正する。
# 修正 ServerName <対象アプリケーションのドメイン名>:80 DocumentRoot "/var/www/html/Application/public" # 追加 <Directory "/var/www/html/Application"> Options FollowSymLinks AllowOverride All Require all granted </Directory>
- ServerNameは適宜設定。最初は
<Appサービス名>azurewebsites.net
を設定しておけばいいと思う。カスタムドメインを設定した後は、そのドメインを指定する。 - DocumentRootはLaravelのpublicディレクトリーに変更する。 参照:Laravel 6.x インストール 設定
- Directoryは、public以外のソース、スクリプトも実行出来るように設定。(ディレクティブの設定が正しいかは不明…。Apacheのサイトを要参照。)
00-mpm.conf
00-mpm.confの設定を修正する。
# 修正 LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # LoadModule mpm_event_module modules/mod_mpm_event.so
今回、Dockerイメージ内で起動するプロセスはsystemdを使わずに、Apache単体実行したい。
でも、mpm_event_moduleが有効になっていると、PHP実行時に「php-fpmのプロセスが無いよ」的エラーが発生するので(/etc/httpd/conf.d/php.conf
にある、"proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
を探しに行ってしまう)、mpm_event_moduleをコメントアウトして、代わりにmpm_prefork_moduleを有効にしておく。
gitに取り込み
Apacheの設定ファイルを下記ディレクトリー構成でgitにコミットする。
Application └settings └httpd ├conf │ └httpd.conf └conf.modules.d └00-mpm.conf
Dockerイメージのビルド時に参照できるのはApplicationディレクトリー以下なので、とりあえず直下に置いた。
Dockerfileの修正
Dockerfileの修正内容はこんな感じ。
# ① FROM centos:latest # ② RUN yum install -y httpd httpd-devel mod_ssl \ php php-cli php-common php-devel php-json php-mbstring php-mysqlnd php-pdo php-xml \ npm \ curl \ git \ zip unzip RUN yum update -y RUN yum clean all # ③ RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/bin --filename=composer # ④ RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime COPY settings/locale.conf /etc/locale.conf # ⑤ COPY settings/php/php.ini /etc/php.ini # ⑥ COPY settings/httpd/ /etc/httpd/ # ⑦ RUN mkdir /var/www/html/Application/ COPY app/ /var/www/html/Application/app/ COPY bootstrap/ /var/www/html/Application/bootstrap/ COPY config/ /var/www/html/Application/config/ COPY database/ /var/www/html/Application/database/ COPY public/ /var/www/html/Application/public COPY resources/ /var/www/html/Application/resources/ COPY routes/ /var/www/html/Application/routes/ COPY storage/ /var/www/html/Application/storage/ COPY .env.production /var/www/html/Application/.env COPY .styleci.yml /var/www/html/Application/.styleci.yml COPY artisan /var/www/html/Application/artisan COPY BaltimoreCyberTrustRoot.crt.cer /var/www/html/Application/BaltimoreCyberTrustRoot.crt.cer COPY composer.json /var/www/html/Application/composer.json COPY composer.lock /var/www/html/Application/composer.lock COPY package.json /var/www/html/Application/package.json COPY package-lock.json /var/www/html/Application/package-lock.json COPY phpunit.xml /var/www/html/Application/phpunit.xml COPY server.php /var/www/html/Application/server.php COPY webpack.mix.js /var/www/html/Application/webpack.mix.js # ⑧ RUN composer install -d /var/www/html/Application RUN npm install --prefix /var/www/html/Application # ⑨ RUN chown apache:apache -R /var/www # ⑩ ENTRYPOINT [ "/usr/sbin/httpd", "-DFOREGROUND" ] EXPOSE 80
①ベースイメージを変更
Dockerのベースイメージはphp:7
が指定されている。(Dcoker Hubのphpを参照すると、「This image is based on the popular Alpine Linux project」と記載がある。)
Alpine LinuxでApacheをインストールすると、Debian系のApache2を使うことになるので、Dockerのイメージを使い慣れたCentOS、centos:latest
に変更する。
CentOSのバージョンは8で作業したいので、現時点でcentos:latest
を指定すればCentOS 8になる。バージョンを固定したければ、centos:centos8
を指定しても良い。
②パッケージ追加
パッケージはApache、PHP、Laravelのインストールなどで必要なものを追加した。
用途 | パッケージ |
---|---|
Apache | httpd httpd-devel |
PHP | php php-cli php-common php-devel php-json php-mbstring php-mysqlnd php-pdo php-xml |
Laravelのインストールなど | npm curl git zip unzip |
③Composer追加
Composerのサイトを参照。
④タイムゾーン、言語変更
何となくロケールを日本、日本語にしてみたけど、Laravelはapp.php
の設定が採用されるから不要かもしれない。
⑤php.ini修正
Apacheの設定ファイルと同じように、php.iniを引っこ抜いてgitにコミット(楽しよう)。下記の修正を追加して、Dockerイメージに取り込んだ。
# 修正 default_charset = "UTF-8" date.timezone = Asia/Tokyo mbstring.language = Japanese
ただ、php.iniのタイムゾーン変更も不要かもしれない。
⑥Apacheの設定ファイル修正
前述したApacheの設定ファイルを上書き。
⑦ソースファイルをコピー
元々のソースのコピーは、
COPY . /app
となっていたけど、appディレクトリー以外もコピーしたいので追加した。(COPY . /Application
はうまくいかなかったので、Application直下のディレクトリーとファイルをそれぞれコピーしている。)
⑧Composer、npmをインストール
Composer、npmをアプリケーションディレクトリーにインストールする。
⑨所有者設定
/var/www
以下のファイル、ディレクトリーの所有者をApacheユーザーに変更する。
⑩Apache起動など
最後はApache起動とアクセスするポートを指定して終わり。 後はgitのmasterにコミット、プッシュしてビルドを走らせて、ビルド完了後にAppサービスにアクセスして確認する。
課題
- ログをAzure Storageに出力するように変更した方が良い。
- SSL対応していないので、下記のような対応が必要。
- SSL証明書を用意して、Dockerイメージに取り込む。
- Azure Appサービスを利用するので、SSL証明書を自前で用意せずAzure Service証明書を発行しても良いと思う(今後試してみる、金に余裕があれば…)。