【開発】初心者がdocker-composeでWordPress環境をCentOSとNginxとMysqlで構築する話
こんにちは、やもり(yamori-tech)です。
開発として「docker-composeでWordPress環境をCentOSとNginxとMysqlで構築する話」について書こうと思います。
結論としては、docker-composeでCentOS+WordPress+Nginx、CentOS+Mysqlの2つのコンテナを構築・連携し、WordPressが立ち上がることを確認しました。
なぜ作ったか
最近、色んな所で「Dockerを使ってますか?」「便利だよね!」と言われる機会が増えた印象があります。お恥ずかしながら、チュートリアルを軽〜く触った程度で、実践でDockerfileを作ったり、docker-composeを利用したことがありませんでした。
今後ためにもdockerの使い方を実践的に学びたいなと思い、WordPressの立ち上げまでをdockerやdocker-composeでやってみることにしました。Docker HubにはCentOS+Apache+MysqlでWordPressを構築するサンプルがあります。
基本的にはこちらのサンプルで良いと思うのですが、少し自分で設定をアレンジしたい場合(ラズパイで連携してみたいとか、WebサーバにApacheでなくNginxを使いたいとか、MysqlじゃなくてMariaDBにしたいんだ、ナドナド...)、自分でDockerfileを書いたり、docker-composeの構成を考える必要があります。また WordPress の構築は、DBサーバ・Webサーバとの連携を理解し進めなければうまくいかないので、このあたりの勉強にもなります。
Docker Hubやその他、情報公開してくださっている諸先輩方の情報を参考に、勉強がてら作成してみました。
どのように作ったか
構成は人それぞれで、軽く調べただけでも、同じ方法はほとんどなさそうでした。皆様、オリジナルでやられているようです。(できたものが正義!)
私は初心者ですので、まずはbasic にやってみようと、今回はDocker Hubをお手本に、docker-composeでCentOS+WordPress+Nginx、CentOS+Mysqlの2つのコンテナを連携させる構成としました。
構築環境
- PC:MacBook Air
- MacOS: Catalina version 10.15.7
- Docker:version 20.10.2
- docker-compose:version 1.27.4
ファイル構成
適当なフォルダに必要なファイルやフォルダを置き、それらを前提にしDockerfileを作成しました。
以降、作成ファイルを列挙します。
./html/www/index.html (デバック用)
nginxが動いているか確認するためのものです。WordPressの場合は基本的に必要ないと思います。
hello world! from dockerfile of nginx
./nginx/nginx.repo(nginxのリポジトリを追加するため)
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
./nginx/conf.d./default.conf
server {
listen 80;
server_name localhost;
root /home/yamori/wordpress;
location / {
index index.html index.htm index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; # ./php/php-fpm.d/www.conf listenと同じものを記載する
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
./php/index.html
デバック確認用です。(適宜利用)
<?php
phpinfo();
?>
./php/php-fpm.d/www.conf(etc/php-fpm.d/www.conf コピーしたもの)
コピーしたwww.confの一部を下記のように書き換えます。
user = nginx
group = nginx
# 選べる
;listen = /var/run/php-fpm/php-fpm.sock #今回は下記を選ぶ
listen = 127.0.0.1:9000
listen.owner = nginx
listen.group = nginx
./wordpress/wp-config.php
wordpressの公式サイトから引っ張ってきました。DBのところだけ変えています。
<?php
ini_set( 'display_errors', 1 );
date_default_timezone_set('Asia/Tokyo');
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');
/** MySQL database username */
define('DB_USER', 'wordpress');
/** MySQL database password */
define('DB_PASSWORD', 'wordpress');
/** MySQL hostname */
define('DB_HOST', 'db:3306');
/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');
/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');
define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');
define('AUTH_SALT', 'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT', 'put your unique phrase here');
define('NONCE_SALT', 'put your unique phrase here');
$table_prefix = 'wp_'; define('WPLANG', '');
define('WP_DEBUG', false);
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
require_once(ABSPATH . 'wp-settings.php');
?>
pluginとthemesについて
こちらは空のフォルダを作成したらOKです。
Dockerfile の作成
以下、作成したDockerfileになります。参考サイトでの採用が多かったCentOSのバージョンを7を指定しています。
FROM centos:7
RUN yum update -y \
&& yum install epel-release -y \
&& yum clean all
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
WORKDIR ./home
RUN mkdir yamori
WORKDIR ./yamori
RUN mkdir www
WORKDIR /
COPY ./nginx/nginx.repo etc/yum.repos.d/
RUN yum install nginx -y \
&& yum install php-fpm php-devel php-mbstring php-mysqlnd php-mcrypt php-pear php-gd php-pecl-xdebug php-opcache php-pecl-memcached --enablerepo=remi,remi-php74,epel -y \
&& yum clean all
RUN mkdir /var/run/php-fpm
COPY ./nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf
COPY ./html /usr/share/nginx/html
COPY ./php/php-fpm.d/www.conf etc/php-fpm.d/
WORKDIR /home/yamori/
# WordPress install
RUN curl -LO https://ja.wordpress.org/latest-ja.tar.gz
RUN tar xvzf latest-ja.tar.gz
ADD ./php/index.php /home/yamori/wordpress/
ADD ./wordpress/wp-config.php /home/yamori/wordpress/wp-config.php
RUN chmod 755 wordpress
RUN chmod 755 /home/yamori/wordpress/index.php
RUN chown -R nginx:nginx wordpress
RUN rm latest-ja.tar.gz -f
CMD /usr/sbin/nginx -c /etc/nginx/nginx.conf && /usr/sbin/php-fpm --nodaemonize
docker-compose.yml の作成
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
build: .
depends_on:
- db ports:
- 8085:80
volumes:
- ./themes:/home/yamori/wordpress/wp-content/themes
- ./plugins:/home/yamori/wordpress/html/wp-content/plugins
volumes:
db_data:
最後に作成したdocker-compose.yml をdocker-composeでbuild、run すれば、冒頭の動画のような結果になり、wordpressが表示されます。
詰まった点としては、wordpressが7.4以上からしか対応していない事に気づかず、7.0、7.2 等をyum install して動かずに困りました。(2021/09/20時点) 事前にWordpressのphp対応バージョンの確認をオススメします。
また、Nginxの設定やMySQLの設定確認、Dockerfileの記述方法を理解するのに時間がかかりました。(もっと修行しなくては…)
おまけ
おまけ1:Dockerとdcoker compose の基本的な使い方
コンテナのbuild
docker build . -t <image name>
docker-compose build
コンテナの起動方法
# --rm stop したらコンテナを消す
# -d デーモン起動
# -p port の指定
# 下記で動かないときは、run コマンドに -it をつけたし、最後に bash を書き足す(--rm は消す)
docker run --name <container name> --rm -d -p 8085:80 <image name / image id>
docker-compose up -d
コンテナの入り方(デバック時)
# デバッグしたいときは、bash をPS AUXで先頭になるようにする
docker exec -it <container id or name> bash
# CMD [] が実行されていない状態で入れる、CMDを手動実行してすすめる
# -> root# /usr/sbin/nginx -c /etc/nginx/nginx.conf root# /usr/sbin/php-fpm --nodaemonize &
コンテナを止めてイメージを消す
# docker について
docker stop <container id or name>
docker rm <container id or name>
docker rmi <image id or name>
# docker-compose について
docker-compose stop
docker-compose rm
docker rmi <image id or name>
起動コンテナを確認する
# psを使う -a はなくてもOK、詳細チェック時に使う
docker ps -a
docker-compose ps -a
作成imageを確認する
docker images
おまけ2:Dockerfileから systemctlを実行する
# systemctl の .service の場所を確認する
% bash cat /usr/lib/systemd/system/xxx-xxxxxx.service
# .service にアクセスして ExecStart を確認する
% bash [root@c51216b27dcd yamori]# cat /usr/lib/systemd/system/php-fpm.service
...
...
ExecStart=/usr/sbin/php-fpm --nodaemonize
...
まとめ
docker初心者でしたが、どうにか動くものができました。今後、機会があれば触っていこうと思います。またデプロイなどは経験が無いので、そのあたりのことも調べていきたいと思います。
参考サイト一覧
ネットワーク周りの知識が弱いこともあり、Dcoker関連だけでなくwebサーバの立て方など様々なサイトを拝見させていただきました。ありがとうございます。
公式
CentOSとWordpressとNginx
PHP-FPMとNginx
Dcokerとdcoker-compose
MySQLの使い方
systemdファイル