arcanum_jp’s blog

おっさんの日記

Dockerで1コンテナで作成したワードプレス環境をdocker-composeでまとめる

ここからの続き。

Nginxを使ってみる。PHPの設定、Dockerベース - arcanum_jp’s blog


そうだ、ワードプレスを入れてみよう! - arcanum_jp’s blog


Dockerのコマンドベースで作成したワードプレス環境ですが、コンテナをうっかりdocker rm xxxなんてした日には泣いてしまうので、いつでも簡単にdocker-compose up -d --buildで作成できるようにまとめます。まとめたソースはこちらです。忙しい人向け

github.com


ギッハブ見れば別にもう明らかなんですけど、とりあえず下記で書いてみます。

ディレクトリ構成

単純にこんな感じですdocker-composeからDockerfileを実行し、CMDの内容をentrypoint.shの実行で書き換えます。entrypoint.sh内部ではinit.dbで必要なデータベースの作成などを行い、サービスを再起動します。そんな感じの流れです。コンテナがUPした状態でhttp://localhost:8080/ にアクセスするとワードプレスのサイト設定画面が表示されるまでを目指します。

[compose_wordpress]
  +ーー docker-compose.yml
  +ーー Dockerfile
  +ーー entrypoint.sh
  +ーー initdb.sql
  +ーー wp-config.php
  +ーー www.conf

docker-compose.yml

wordpressと言うコンテナ名で内容はDockerfileにまとめています。ポートはローカルの8080番ポートをコンテナの80番ポートにフォワードします。

version: '2'

services:
  wordpress:
    
    build:
      context: .
      dockerfile: Dockerfile
    
    ports:
      - "8080:80"

    #restart: always

Dockerfile

必要なものをインストールしてentrypoint.shを実行するのに必要なものをコピーしたりなんだり・・・特に特筆すべきものはありませんが ENV DEBIAN_FRONTEND noninteractive
は apt install xxxx する際にインタラクティブに聞いてくるアレ[Y/n]ですね、それを無視するオプションみたいです。

あ、apt install vimは不要ですね。これは単に確認する用に入れただけです。

FROM ubuntu

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        nginx \
        mysql-server \
        php-fpm \
        wget \
        unzip \
        php-mysql

RUN apt-get install -y vim


WORKDIR /var/www


# MySQL
COPY ./initdb.sql ./initdb.sql


# Nginx
COPY ./www.conf /etc/nginx/sites-enabled/default


# ワードプレスのファイルを配置しておく
RUN wget https://ja.wordpress.org/wordpress-5.4.1-ja.zip  --no-check-certificate
RUN unzip -q wordpress-5.4.1-ja.zip
RUN mv ./wordpress/* ./html
#RUN rm wordpress-5.4.1-ja.zip
#RUN rm -r ./wordpress
COPY ./wp-config.php ./html/wp-config.php

# その他Dockerfile後実行したい処理
COPY ./entrypoint.sh ./entrypoint.sh
RUN chmod +x ./entrypoint.sh
CMD ./entrypoint.sh
 

EXPOSE 80

entrypoint.sh

MySQLサービス、PHP-FPMサービスをバックグラウンドで起動後、Nginxをフォアグラウンドで起動します。"daemon off;"とうところですね。通常はバックグラウンド起動のところ、このオプションでフォアグラウンドにしています。これはdocker-compose でコンテナを起動すると通常処理が終了後にコンテナはExit状態となります。docker-composeはDockerのイメージを作るためのコマンドなのでこれはこれで正しいのですが、目的はワードプレスが使える環境なのでSTATUSがUPとなっている必要があります。そのため何かしらフォアグラウンドで実行状態が維持され、Exitにならないようにする必要があり、Nginxはフォアグラウンドで起動するようにしています。

set -e


service mysql start
mysql < initdb.sql


/etc/init.d/php7.4-fpm start

echo "daemon off;" >> /etc/nginx/nginx.conf
service nginx start

initdb.sql

MySQLワードプレス用のDB、ユーザーを生成しています。

create database wordpress;
create user wpadmin@localhost identified by 'password';
grant all on wordpress.* to wpadmin@localhost;

www.conf

長いのでコメントなどを削除して必要な部分のみにしています。index.phpをウエルカムファイルとし、*.phpにアクセスされた場合にPHP-FPMに連携するようにしています。内容は前々回で見た /etc/nginx/sites-available/defaultのコメントアウトしたものです。

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.php index.html index.htm;

        server_name _;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }


        # pass PHP scripts to FastCGI server
        location ~ \.php$ {
               include snippets/fastcgi-php.conf;
               fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        }

}

wp-config.php

ワードプレスの設定です。ワードプレスのzipにあったwp-config.php.sampleから作りました。DB_NAME、DB_USER、DB_PASSWORDは先ほどinitdb.sqlで作成したものを指定します。AUTH_KEYから始まるハッシュ値はwp-config.php.sampleにあるとおり、以下のURLにアクセスすると取得できます。

https://api.wordpress.org/secret-key/1.1/salt/

  ・・・省略

// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define( 'DB_NAME', 'wordpress' );

/** MySQL データベースのユーザー名 */
define( 'DB_USER', 'wpadmin' );

/** MySQL データベースのパスワード */
define( 'DB_PASSWORD', 'password' );


  ・・・省略

define('AUTH_KEY',         'Lb?=PLpsQM-E.3yk0O-kM#Y]`}1+fIXY>}Xd>2{,aPfu%I+-WvI).9,qn{xc!/m7');
define('SECURE_AUTH_KEY',  '{6cO-^OzU~gR-M5dMM2&l <=}a5+Iu S)h]pJ1r*G!pP@s(,-I#^@ntXbh+]ZvMv');
define('LOGGED_IN_KEY',    'l6zkb9>.|U$2.5W_~FE/-$)qa0q0W>$oidd%l`<*p5J@tGX1{-L-Er8qT}W$SmoR');
define('NONCE_KEY',        'O<-5)qE-&Ff?p,s|w{}Lq}Uu!.S@n<-1zlw_Sa+mg]va1vzl]>M9U~h-G8}<uAWV');
define('AUTH_SALT',        'l-`tB%5v?dV|n>-=7]&E)HDtYc9VX?Gpz9LUdDg#dknUbZm+=eS,11xS-TdnP`>2');
define('SECURE_AUTH_SALT', 'nT86dN7y<UY95Q[J$qHvmD)F/;k52m3@*n4=*h%C-TD+KYu+1FcJ+n=dv9Tjd-fs');
define('LOGGED_IN_SALT',   ':X5IZL)B}^%p3-#G<hMR8qS{Nm^ful?{P],w3/P, B^oES~;Xu^;@C)U_T&*aZ-F');
define('NONCE_SALT',       '.f$Ra-@XnvGnu>$E8(,l<^{/?9ry,TMn30NZ+h5)DCx]_@1Ky7Za[OP5e3{yp66E');

  ・・・省略

起動

上記の内容でdocker-compose.ymlのあるディレクトリで以下のコマンドを打ちます。

docker-compose up -d --build

Building wordpress
Step 1/15 : FROM ubuntu
 ---> 1d622ef86b13
Step 2/15 : ENV DEBIAN_FRONTEND noninteractive
 ---> Using cache
 ---> b9041b34f8cf
Step 3/15 : RUN apt-get update &&     apt-get install -y --no-install-recommends         nginx         mysql-server         php-fpm         wget         unzip         php-mysql
 ---> Using cache
 ---> 4c461047a430
Step 4/15 : RUN apt-get install -y vim
 ---> Using cache
 ---> 1694ae6b157b
Step 5/15 : WORKDIR /var/www
 ---> Using cache
 ---> 00a9f8b7665c
Step 6/15 : COPY ./initdb.sql ./initdb.sql
 ---> Using cache
 ---> 6833c6890529
Step 7/15 : COPY ./www.conf /etc/nginx/sites-enabled/default
 ---> Using cache
 ---> 60cb5f6aa5a0
Step 8/15 : RUN wget https://ja.wordpress.org/wordpress-5.4.1-ja.zip  --no-check-certificate
 ---> Using cache
 ---> 2cc2a311e47c
Step 9/15 : RUN unzip -q wordpress-5.4.1-ja.zip
 ---> Using cache
 ---> 7bcfbcce0892
Step 10/15 : RUN mv ./wordpress/* ./html
 ---> Using cache
 ---> af4964fedf6b
Step 11/15 : COPY ./wp-config.php ./html/wp-config.php
 ---> Using cache
 ---> bec46dfbe0ae
Step 12/15 : COPY ./entrypoint.sh ./entrypoint.sh
 ---> Using cache
 ---> e3f2a9888c0f
Step 13/15 : RUN chmod +x ./entrypoint.sh
 ---> Using cache
 ---> f66f7d95a939
Step 14/15 : CMD ./entrypoint.sh
 ---> Using cache
 ---> d357d43918f9
Step 15/15 : EXPOSE 80
 ---> Using cache
 ---> c9b258db64f2
Successfully built c9b258db64f2
Successfully tagged compose_wordpress_wordpress:latest
Starting compose_wordpress_wordpress_1 ... done


docker ps -aをするとコンテナが作成されUP状態となっているのがわかります。

f:id:arcanum_jp:20200613103528p:plain


さてlocalhost:8080にアクセスしてみます。サイト設定の画面が表示されました。

f:id:arcanum_jp:20200613103726p:plain


Docker、はじめ、大変だなぁ、またツール覚えるのかよ!とか思っていたけど使い始めたらとてもいいツールですね。