ひとまず成功したので、このサイトのコンテナ化におけるノウハウをまとめておきたいと思います
設定の概要
このサイトのコンテナ化に当たって、使用している docker イメージは 4 つ。
その内、PHP は FPM で動作させていて、これは WordPress の公式イメージの中の PHP-FPM をそのまま使っています。MariaDB もバージョンだけは指定 (10.10) して公式イメージのまま、これに加えて、データーベースの移行時に使うために phpMyAdmin も必要に応じて立ち上げられるようにしていますが、これも公式イメージのまま使用しています。
ほぼオリジナル部分は Apache を動かしているイメージだけで、これは Debian の公式イメージをベースにする dockerfile を書きました。ですので、今のところは、試行錯誤は、この Apache の部分だけ済んでいるので、結構、美しく、メンテも簡単です。
その docker-compose.yml はこんな感じです。( .env ファイルは別途作成しています)
services:
apache:
build:
context: ./httpd
image: httpd-cgi
container_name: httpd
volumes:
- ./data/html:/var/www/html
depends_on:
- php-fpm
restart: always
environment:
TZ: Asia/Tokyo
ports:
- 80:80
php-fpm:
image: wordpress:fpm
container_name: php-fpm
depends_on:
- mariaDB
volumes:
- ./data/html:/var/www/html
restart: always
environment:
WORDPRESS_DB_HOST: mariaDB
WORDPRESS_DB_USER: ${DB_USER}
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
WORDPRESS_DB_NAME: ${DB_NAME}
TZ: Asia/Tokyo
mariaDB:
image: mariadb:${DB_VERSION}
container_name: mariaDB
volumes:
- ./data/db:/var/lib/mysql
restart: always
environment:
MARIADB_DATABASE: ${DB_NAME}
MARIADB_USER: ${DB_USER}
MARIADB_PASSWORD: ${DB_PASSWORD}
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
TZ: Asia/Tokyo
phpmyadmin:
image: phpmyadmin:latest
container_name: phpmyadmin
environment:
PMA_ARBITRARY: '1'
PMA_HOST: mariaDB
UPLOAD_LIMIT: 10M
TZ: Asia/Tokyo
profiles: ["Setup"]
ports:
- 8080:80
イメージをビルドする Apache 以外は特に難しいことはしていませんが、phpMyAdmin には profiles を設定していて、プロファイルを指定しないと up するだけでは立ち上がらなくなっています。
Apache は Debian で動かす
PHP-FPM で動かすために、また Perl を CGI で動かすために、動作させる必要のある Apache は Debian の公式イメージ bullseye-slim に、Apache と Perl とそのライブライリをインストールしたイメージを作成して、これを動作させています。
Debian 以外にも、例えば、フットプリントが小さくなる Alpine を使う方法もあるとは思いますが、今回は Perl のインストールのこともあり、パッケージから簡単にライブラリまでインストールできる(その作法を知っている) Debian を採用しました。
同じ bullseye-slim がベースなら、Apache の公式イメージを使う方法もあったのですが、これは Apache のドキュメントルートがデフォルトで /var/www ではない、作成してみるとフットプリントがやたらでかいので、これも止めました。
さらに同じ Debian ベースなら Ubuntu の公式イメージもあるのですが、同じ Debian ベースなら本家でいいやんという心理的な理由と、明示的にフットプリントが小さそうな slim イメージが Debian 公式にはあったので、素直にこれを使っています。
で、実際の Dockerfile がこちら
FROM debian:bullseye-slim
RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends \
# Add Apache2
apache2 \
# Add perl and perl lib
perl \
perl-base \
perl-modules \
libwww-perl \
libcgi-pm-perl \
liblocal-lib-perl \
libjson-perl \
libdigest-sha-perl \
; \
rm -rf /var/lib/apt/lists/*
RUN a2enmod cgid
RUN a2enmod proxy
RUN a2enmod proxy_fcgi
RUN a2enmod rewrite
COPY ./conf/CGI_PHP-FPM.conf /etc/apache2/sites-available/
RUN a2ensite CGI_PHP-FPM
VOLUME ["/var/www/html"]
EXPOSE 80
ENTRYPOINT [ "/usr/sbin/apache2ctl", "-D", "FOREGROUND" ]
これでフットプリントは 182MB 。PHP-FPM や MariaDB よりもかなり小さいです。
やっていることは、パッケージから Apache と Perl とそのライブラリをインストールして、必要な Apache のモジュールを有効化、Apache のサイト設定ファイル CGI_PHP-FPM.conf をコピーして、これを有効化して、デーモンを立ち上げています。
しかし、CentOS などで、httpd.conf をゴリゴリ編集して、これまでサイト構築していた人からすると、モジュールの有効化?サイト設定の有効化?って何??となると思います。実際、私自身もそうでした。
次は、この Apache の設定の作法に関してはまとめます