やもりの技術ブログ

日々の生活で行った技術的な活動や日頃感じたことを書きます。

【開発】初心者がdocker-composeでWordPress環境をCentOSとNginxとMysqlで構築する話

こんにちは、やもり(yamori-tech)です。

開発として「docker-composeでWordPress環境をCentOSとNginxとMysqlで構築する話」について書こうと思います。


www.youtube.com

結論としては、docker-composeでCentOS+WordPress+Nginx、CentOSMysqlの2つのコンテナを構築・連携し、WordPressが立ち上がることを確認しました。

 

なぜ作ったか

最近、色んな所で「Dockerを使ってますか?」「便利だよね!」と言われる機会が増えた印象があります。お恥ずかしながら、チュートリアルを軽〜く触った程度で、実践でDockerfileを作ったり、docker-composeを利用したことがありませんでした。

今後ためにもdockerの使い方を実践的に学びたいなと思い、WordPressの立ち上げまでをdockerやdocker-composeでやってみることにしました。Docker HubにはCentOSApache+MysqlWordPressを構築するサンプルがあります。

hub.docker.com

基本的にはこちらのサンプルで良いと思うのですが、少し自分で設定をアレンジしたい場合(ラズパイで連携してみたいとか、WebサーバにApacheでなくNginxを使いたいとか、MysqlじゃなくてMariaDBにしたいんだ、ナドナド...)、自分でDockerfileを書いたり、docker-composeの構成を考える必要があります。また WordPress の構築は、DBサーバ・Webサーバとの連携を理解し進めなければうまくいかないので、このあたりの勉強にもなります。

Docker Hubやその他、情報公開してくださっている諸先輩方の情報を参考に、勉強がてら作成してみました。

どのように作ったか

f:id:yamori-tech:20210922223208p:plain

全体概要(overview)

構成は人それぞれで、軽く調べただけでも、同じ方法はほとんどなさそうでした。皆様、オリジナルでやられているようです。(できたものが正義!)

私は初心者ですので、まずはbasic にやってみようと、今回はDocker Hubをお手本に、docker-composeでCentOS+WordPress+Nginx、CentOSMysqlの2つのコンテナを連携させる構成としました。

構築環境

  • PC:MacBook Air
  • MacOS: Catalina version 10.15.7
  • Docker:version 20.10.2
  • docker-compose:version 1.27.4

ファイル構成

適当なフォルダに必要なファイルやフォルダを置き、それらを前提にしDockerfileを作成しました。

f:id:yamori-tech:20210922233225p:plain

ファイル構成の詳細

以降、作成ファイルを列挙します。

./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ファイル