nakamurakko’s diary

仕事で覚えたこと、勉強したことを自分のメモ代わりに書いていこうかなと。

Azure DevOps その3 Dockerの構成をCentOSベースに変更する

前提

  • 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 LinuxApacheをインストールすると、Debian系のApache2を使うことになるので、Dockerのイメージを使い慣れたCentOScentos:latestに変更する。

CentOSのバージョンは8で作業したいので、現時点でcentos:latestを指定すればCentOS 8になる。バージョンを固定したければ、centos:centos8を指定しても良い。

②パッケージ追加

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