DockerでWordpress構築ハンズオン | 42 Inception
はじめに
42のカリキュラムにあるDockerを用いてWordpressをセットアップする課題を取り組むにあたって,ミニマムな構成でのWordpressセットアップ方法についての記事です.
※ 課題の仕様とは異なる点が多くあるので,参考程度にしてください.課題へのヒントの範疇超えず補助的な立ち位置の記事になるようにできるだけ,ミニマムな構成にしています.
※ 課題の要件にあるSSL/TLSやネットワーク等について取り上げないです.
対象
- 何から初めればいいのか分からない,Dockerがどういうものかわかったけど,課題にどう取り組めばいいか分からない人向けに実際に動かしてイメージを深める内容となっています
- 仮想化技術やDockerについては他の記事の説明の方が分かりやすいので,そちらの記事を参考にしてください.
以下の記事がDockerについてとても分かりやすく,一通りまとまっていたのでこれから勉強する方にとてもおすすめです!
ハンズオン
1つのアプリケーション(WordPress)を構成していくために,3つのコンテナ(Nginx, WordPress, MariaDB)をセットアップしていきます.
複数のコンテナに分割する理由として,1つのコンテナに1つの役割を持たせるべきだからです.(コンテナの単一責任の原則,詳しくはこちらから:Kubernetes導入にあたり知っておきたいコンテナの基礎知識(要約)).
Each container should have only one concern
コンテナは1つの関心ごとだけに集中すべきだ
https://docs.docker.com/build/building/best-practices/
複数のコンテナに分けるメリットとしては,以下の通りとなっています.
主要なメリット
- マルチコンテナ管理の簡易化:
複数のコンテナを同時に起動、停止、ビルド、削除などの操作ができる- 一貫した環境再現性:
docker-compose.ymlにサービスを定義することで複数の環境を再現することが容易になる- サービス間の依存関係の明確化
各サービスの依存関係を定義することができる(depends_on)- 簡易なスケーリング:
コマンド一つでサービスのインスタンス数を増減することで柔軟なスケーリングが可能
https://blog.denet.co.jp/centrally-manage-multiple-containers-with-docker-compose/?doing_wp_cron=1738835393.5332379341125488281250
各アプリケーションの説明
WordPress, nginx, mariadbをとても簡単にどういったものかをそれぞれ概要だけ説明します.
WordPress
ブログやウェブサイトを作るためのシステムです.PHPで書かれており,記事投稿や画像アップロードなどの機能を提供します.データベースと連携して動的なウェブサイトを作れます.
nginx
Webサーバーのソフトです.クライアントからのリクエストを受け付け,適切なコンテンツを返す役割を担います.
キーワード:リバースプロキシ
mariadb
MySQLから派生したオープンソースのリレーショナルデータベースです.
WordPressのデータ(投稿、ユーザー情報、設定など)を保存します.
ハンズオン進めていきます.
1. nginxセットアップ
最初のステップは,nginxをセットアップします.
まず,inceptionディレクトリを作成し,以下のディレクトリ構成にします.
docker-compose.ymlは以下のように設定します.
version: "3.8"
services:
nginx:
build: src/nginx/.
container_name: inception_nginx
ports:
- "80:80"
次に,nginxのDockerfileのを以下のように設定します.
FROM debian:latest
RUN apt-get update && apt-get install -y nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
aptでnginxパッケージをインストールして,-g daemon off
という引数でバックグラウンドでの実行ではなく,nginxをフォアグラウンドで実行します。
以上の内容が終わったら,一度以下のコマンドでnginxが立ち上がることを確認します.
docker compose up --build
nginxサービスが動作することを確認するために,http://127.0.0.1 にアクセスして確認します.
以下のNginxのデフォルトページが表示されたらOKです.
これで,nginxが動作するコンテナを作成することができました.
2. PHP/Wordpress 環境構築
次に,PHPとwordpressを追加します.ディレクトリ構造を以下のように更新します:
まず,wordpressのDockerfileは以下の通りに設定します.
こちらでも同様に,aptでphp-fpmをインストールし,php-fpmを-F
オプションにて,フォアグラウンドで実行します.
FROM debian:latest
RUN apt-get update && apt-get install -y php-fpm
CMD ["php-fpm8.2", "-F"]
次に,docker-compose.ymlは以下のように設定します.
version: "3.8"
services:
nginx:
build: src/nginx/.
container_name: inception_nginx
ports:
- "80:80"
wordpress:
build: src/wordpress/.
container_name: inception_wordpress
docker compose up — build
コマンドを再度,実行すると以下のようにwordpressとnginxのコンテナが実行されます.
現在,nginxとphpの間に接続が確立されていないため,通信できません.
そのため,nginxでphpファイルをレンダリングしようとしても,接続されていないため,処理できません.
次のステップは,nginxとphpが通信できるように構成することです.nginxコンテナからデフォルトのサーバー構成ファイルとphpサービスのデフォルトの構成をコピーし,いくつか変更を加えます.
まず,nginxとPHPそれぞれのデフォルト設定ファイルを取得します.
設定ファイルの場所
- PHP:
/etc/php/8.2/fpm/pool.d/www.conf
- Nginx:
/etc/nginx/sites-available/default
現在,コンテナを実行中のターミナルとは別でターミナルを立ち上げ,inceptionディレクトリ下でdocker cp
コマンドを使って,実行中のコンテナから設定ファイルをコピーします.
docker cp inception_wordpress:/etc/php/8.2/fpm/pool.d/www.conf ./src/wordpress/.
docker cp inception_nginx:/etc/nginx/sites-available/default ./src/nginx/.
コピー後,ディレクトリ構造は以下の通りとなります.
そして,PHPのデフォルト設定ファイルwww.conf
の41行目のlistenをコメントアウトし新たに42行目を以下のように設定します.
/run/php/php8.2-fpm.sock
をlistenする代わりに,inception_wordpress
コンテナのローカルホストであるアドレスinception_wordpress:9000
に変更して,リクエストを受け入れるように設定します.
41 ; listen = /run/php/php8.2-fpm.sock # コメントアウト
42 listen = inception_wordpress:9000
次に,PHPファイルへのリクエストをFastCGIサーバーに転送するようにdefault
を設定します.
まず,PHPスクリプトをFastCGIサーバーに渡すことを許可するブロックがコメントアウトされているので,解除する必要があります(56行目から63行目のコメントを解除).
そして,このブロックのfastcgi_passを127.0.0.1:9000
からinception_wordpress:9000
に変更,60行目をコメントアウトします.
これで,nginxが処理のためにphpファイルをどこに送信すれば良いか認識できるようになりました.
56 location ~ \.php$ {
57 include snippets/fastcgi-php.conf;
58
59 # With php-fpm (or other unix sockets):
60 # fastcgi_pass unix:/run/php/php7.4-fpm.sock;
61 # With php-cgi (or other tcp sockets):
62 fastcgi_pass 127.0.0.1:9000;
63 }
そしてdefault
の44行目のインデックスリストにindex.phpを追加します.
43 # Add index.php to the list if you are using PHP
44 index index.php index.html index.htm index.nginx-debian.html;
以上の設定を加えることで,
- ブラウザからPHPファイルへのリクエストが届く
- nginxがそのリクエストをFastCGI経由でphp-fpmに転送
- php-fpmがPHPファイルを実行
- 実行結果がnginxに返され,最終的にブラウザに表示される
という流れとなります.
次は,以上のdefault
とwww.conf
に加えた変更をコンテナにコピーする必要があります.
それぞれのDockerfileを以下のようにCOPYコマンドを追加します.
wordpress
FROM debian:latest
RUN apt-get update && apt-get install -y php-fpm
COPY www.conf /etc/php/8.2/fpm/pool.d/.
CMD ["php-fpm8.2", "-F"]
nginx
FROM debian:latest
RUN apt-get update && apt-get install -y nginx
EXPOSE 80
COPY default /etc/nginx/sites-available/.
CMD ["nginx", "-g", "daemon off;"]
WordPressのコンテンツをPHPコンテナで実行し,かつNginxでそれを表示するためには,両方のコンテナが同じファイルにアクセスできる必要があります.そのため、
/var/www/html
ディレクトリを両方のコンテナで共有する設定が必要です.
そのため,WordPressを動かすPHPコンテナの/var/www/html
ディレクトリと、Nginxコンテナの同じく /var/www/html
ディレクトリの両方を、ローカルマシン上の共通のWebフォルダにマウント(接続)する必要があります。
Dockerのボリューム機能を使用することで,Webサーバーのコンテンツを,ローカルマシン(自分のPC)と共有することができます.
これらの共有設定を実現するために、docker-compose.ymlファイルにvolumes(ボリューム)の設定を追加する必要があります.以下のように修正します.
version: "3.8"
services:
nginx:
build: src/nginx/.
container_name: inception_nginx
ports:
- "80:80"
volumes:
- ./web:/var/www/html
wordpress:
build: src/wordpress/.
container_name: inception_wordpress
volumes:
- ./web:/var/www/html
これにより,inceptionディレクトリにwebフォルダーが作成されます.docker compose up --build
を再度実行すると,以下のようにディレクトリが変更されます.
DockerがWebフォルダーを作成して,/var/www/html
の内容をwebフォルダーにマウントしました.
テストとして,以下のindex.html
ファイルを作成して,以下の内容を追加し,docker compose up --build
コマンドを実行することで,ファイルがレンダリングされるかを確認します.
<h1> It works </h1>
http://127.0.0.1にアクセスして,以下のようにレンダリングされるかを確認します.
同様に,テストとして,index.php
ファイルをweb
ディレクトリに追加して,以下の内容を追加し,docker compose up --build
を実行し,phpファイルもレンダリングされることを確認する.
<?php
echo "<h1>PHP Test Page</h1>";
echo "<p>Current time: " . date('Y-m-d H:i:s') . "</p>";
// サーバー情報の表示
echo "<h2>Server Information:</h2>";
echo "<ul>";
echo "<li>PHP Version: " . phpversion() . "</li>";
echo "<li>Server Software: " . $_SERVER['SERVER_SOFTWARE'] . "</li>";
echo "<li>Server Name: " . $_SERVER['SERVER_NAME'] . "</li>";
echo "</ul>";
http://127.0.0.1にアクセスして,以下のようにレンダリングされるかを確認します.
これで,PHP/Wordpressの環境構築ができました.
3. DB環境構築
mariadbのセットアップ,Wordpressをレンダリングされるようにしていきます.
mariadbのセットアップを行います.
以下のように,docker-compose.ymlにmariadbを追加します.
主な変更点は以下になります
- 公式イメージを利用してmariadbをインストール
- wordpressとmariadbに適切な環境変数を設定し,接続情報を共有
- サービス間の依存関係をdepends_onで定義し,起動順序を制御
- データベースのデータを永続化するためにdb_dataボリュームを使用
version: "3.8"
services:
nginx:
build: src/nginx/.
container_name: inception_nginx
ports:
- "80:80"
volumes:
- ./web:/var/www/html
depends_on:
- wordpress
wordpress:
build: src/wordpress/.
container_name: inception_wordpress
volumes:
- ./web:/var/www/html
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
db:
image: mariadb:latest
container_name: inception_db
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
MYSQL_ROOT_PASSWORD: somewordpress
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
そして,次にwordpressをインストールするスクリプトを作成します.
設定に伴って,以下のようなフォルダ構造にします.
wordpressフォルダに作ったscript.sh
に,以下の内容を追加します.
script.shは以下の,役割を持っています
- WP-CLIツールのダウンロードと設定
- WordPressコアファイルのインストール
- データベース接続の設定
- WordPressの初期設定(管理者アカウントの作成など)
- PHP-FPMの起動
#!/bin/bash
cd /var/www/html
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
./wp-cli.phar core download --allow-root
./wp-cli.phar config create --dbname=wordpress --dbuser=wordpress --dbpass=wordpress --dbhost=db --allow-root
./wp-cli.phar core install --url=localhost --title=inception --admin_user=admin --admin_password=admin --admin_email=admin@admin.com --allow-root
php-fpm8.2 -F
そして,この変更に伴って,script.shがコンテナ内で実行されるように,wordpressのDockerfileを以下のように修正します.
FROM debian:latest
RUN apt-get update && apt-get install -y \
php-fpm \
php-mysql \
curl
COPY www.conf /etc/php/8.2/fpm/pool.d/.
COPY script.sh .
RUN chmod +x script.sh
CMD ["./script.sh"]
この修正後,docker compose up --build
を実行します.
以下の表示になるまで少し待ちます(少し時間かかります).
http://127.0.0.1にアクセスすると,以下のようにレンダリングされます.
これで,3つのコンテナを利用してwordpressを立ち上げることに成功しました.
まとめ
今回は,ミニマムな構成でwordpressのセットアップを行いました.
課題では,他にも要件が細かく設定されていたり,今回触れていない仕組み等が必要になるので,サブジェクトを確認しながら頑張ってください!
課題で作ったもの
参考にした記事
参考にした技術書
イラストでわかるDockerとKubernetes (Software Design plus)
図解即戦力 仮想化&コンテナがこれ1冊でしっかりわかる教科書
Discussion