前提
- 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証明書を発行しても良いと思う(今後試してみる、金に余裕があれば…)。