Ubuntuサーバでdocker composeを使い、Nginx+PHP+MySQLのWordPress環境を構築する方法

投稿者: | 2021-02-23

前回はUbuntuサーバにDockerを導入し、コンテナイメージの取得からコンテナの起動、コンテナの停止・削除を行いました。今回はコンテナでWordPressの環境を構築する方法について解説します。

実施環境・構成

■Dockerホスト

OS Ubuntu Server 20.10
Docker 20.10.3
Docker Compose 1.28.2

■Webサーバ

Nginx 1.18
PHP 8.0
WordPress 5.6.1

■DBサーバ

MySQL 8.0.23

今回はWebサーバをDockerfileから作成し、DBサーバはMySQL公式のイメージを使用します。

前提条件

今回はUbuntuサーバ上でDockerのインストールが完了している想定で進めます。Dockerのインストールが終わっていない方は下記の記事にてインストールをお願いします。

・UbuntuサーバにDockerを導入し、コンテナの起動から停止・削除までを行う方法

https://www.kdkwakaba.com/archives/1585

Docker Composeのインストール

初めにDocker Composeをインストールします。今回はcurlコマンドを使用した方法でインストールを行います。

・Docker Compsoeをインストールし、実行権限を付与する
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.28.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 
$ sudo chmod +x /usr/local/bin/docker-compose

Docker Composeのインストール後、バージョン確認を行いバージョンが表示されることを確認します。

・Docker Compsoeのバージョンを確認する
$ docker-compose --version
docker-compose version 1.28.2, build 67630359

各種設定ファイル、WordPressの準備

Docker Composeのインストール完了後、今回作成するWordPressの準備およびNginxの設定ファイル、サービスを複数起動するsupervisorの設定ファイルを作成します。今回のフォルダ構成は以下の通りとなります。

hoge ─┬─ Dockerfile
    ├─ docker-compose.yml
    └─ cp_file ─┬─ server.conf
               ├─ supervisord.conf
                      └─ wordpress ─┬─ wp-config.php
                                    └─ --- 省略 ---

各ファイルの概要は以下の通りです。

server.conf Nginxのサーバの設定ファイル
supervisord.conf supervisorの設定ファイル
wordpress WordPress本体、今回はwp-config.phpを事前に設定しておく

初めに、Nginxのサーバの設定を行うserver.confを作成します。

・作業用フォルダを作成し、server.confを作成する
$ mkdir cp_file
$ vi cp_file/server.conf

■server.conf
------------------------------------------------------------
server {
        listen 80;
        root /var/www/html/wordpress;
        index index.php;
        server_name localhost;

        location / {
            try_files $uri $uri/ /index.php?$args =404;
        }

        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php8.0-fpm.sock;
        }
}
------------------------------------------------------------

server.conf作成後、supervisord.confを作成します。

・supervisord.confを作成する
$ vi cp_file/supervisord.conf

■supervisord.conf
------------------------------------------------------------
[supervisord]
nodaemon=true

[program:nginx]
command=/bin/bash -c "nginx"

[program:php8.0-fpm]
command=/bin/bash -c "service php8.0-fpm start"
------------------------------------------------------------

supervisord.conf作成後、WordPressをダウンロードしwp-config.phpに今回使用するデータベースの設定をします。

・WordPressをダウンロードしwp-config.phpを設定する
$ cd cp_file
$ wget https://wordpress.org/latest.tar.gz
$ tar zxf latest.tar.gz
$ rm -rf latest.tar.gz
$ cp wordpress/wp-config-sample.php wordpress/wp-config.php
$ vi wordpress/wp-config.php

■wp-config.php
------------------------------------------------------------
 <省略>
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );

/** MySQL database username */
define( 'DB_USER', 'wordpress' );

/** MySQL database password */
define( 'DB_PASSWORD', 'PasSw@rD' );

/** MySQL hostname */
define( 'DB_HOST', 'db' );
 <省略>
------------------------------------------------------------

コンテナ間通信用のネットワーク作成

設定ファイルの準備後、WebサーバとDBサーバ間で通信可能にするためネットワークを作成します。ネットワークの作成は「docker network create」コマンドを使用します。

・コンテナ間通信用のネットワークを作成する
$ docker network create wp-network

「docker network ls」コマンドでネットワークが作成されたことを確認します。

・ネットワークを確認する
$ docker network ls
NETWORK ID     NAME                 DRIVER    SCOPE
 <省略>
73d56a4cf18c   wp-network           bridge    local

Webサーバのイメージ作成、DBサーバのイメージ取得

ネットワークの作成後、Webサーバのイメージを作成します。WebサーバのイメージはUbuntu公式が提供している「ubuntu/nginx」イメージをベースにDockerfileから作成します。

・cp_fileから1つ上の階層に戻りWebサーバのDockerfileを作成する
$ cd ..
$ vi Dockerfile

■Dockerfile
------------------------------------------------------------
FROM ubuntu/nginx

# デフォルトのシェルをbashにする
SHELL ["/bin/bash", "-c"]

# Nginxのデフォルトの設定ファイルを削除し、server.confをコピーする
RUN rm -rf /etc/nginx/sites-available/default
RUN rm -rf /etc/nginx/sites-enabled/default
COPY cp_file/server.conf /etc/nginx/sites-available/
RUN ln -s /etc/nginx/sites-available/server.conf server.conf
RUN mv server.conf /etc/nginx/sites-enabled/

# PHP8.0とsupervisorをインストールする
RUN apt update -y
RUN apt -y install software-properties-common
RUN add-apt-repository -y ppa:ondrej/php
RUN apt update -y
RUN apt -y install php8.0-fpm php8.0-mysql supervisor
COPY cp_file/supervisord.conf /etc/supervisor/conf.d/

# WordPressをコピーし、フォルダの所有者を変更する
COPY cp_file/wordpress /var/www/html/wordpress
RUN chown -R www-data.www-data /var/www/html/wordpress

# Webサーバのポート(80番)を設定する
EXPOSE 80

STOPSIGNAL SIGTERM

# supervisordを起動する
CMD ["/usr/bin/supervisord"]
------------------------------------------------------------

Dockerfile作成後、「docker build」コマンドを使用し、Webサーバのイメージを作成します。

・Webサーバのイメージを作成する
$ docker build -t wp-web .

Webサーバのイメージ作成後、「docker pull」コマンドを使用しDBサーバのイメージを取得します。今回はMySQL 8.0.23のイメージを取得します。

・MySQL 8.0.23のイメージを取得する
$ docker pull mysql:8.0.23

コンテナイメージを確認し、WebサーバのイメージとMySQLのイメージがあることを確認します。

・WebサーバとDBサーバのコンテナイメージを確認する
$ docker image ls
wp-web         latest    006f648a8f79   6 minutes ago   398MB
mysql          8.0.23    2933adc350f3   13 days ago     546MB
ubuntu/nginx   latest    3554108decf2   2 months ago    143MB

docker-compose.ymlの作成

コンテナイメージの作成後、docker-compose.ymlファイルを作成します。コンテナ削除後もWordPressのデータを保持するために、WebサーバとDBサーバに永続化ボリュームの設定も行います。

・docker-compose.ymlを作成する
$ vi docker-compose.yml

■docker-compose.yml
------------------------------------------------------------
version: "3"

services:
  db:
    image: mysql:8.0.23
    networks:
      - wp-network
    volumes:
      - db_vol:/var/lib/mysql
    restart: always
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password 
    environment:
      MYSQL_ROOT_PASSWORD: SO7fO4hHw
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: PasSw@rD

  web:
    depends_on:
      - db
    image: wp-web
    networks:
      - wp-network
    volumes:
      - web_vol:/var/www/html/wordpress
    ports:
      - 8080:80
    restart: always

networks:
  wp-network:
    external: true
volumes:
  db_vol:
  web_vol:
------------------------------------------------------------

コンテナの起動・動作確認

docker-compose.ymlの作成後、コンテナを起動します。

・docker-compose.ymlの設定からコンテナを起動する
$ docker-compose up -d

コンテナ起動後、WebサーバのコンテナとDBサーバのコンテナが起動されたことを確認します。

・コンテナを確認する
$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                  NAMES
47763484d68c   wp-web         "/docker-entrypoint.…"   4 seconds ago   Up 3 seconds   0.0.0.0:8080->80/tcp   hogehoge_web_1 
332bec14df27   mysql:8.0.23   "docker-entrypoint.s…"   5 seconds ago   Up 3 seconds   3306/tcp, 33060/tcp    hogehoge_db_1 

コンテナ起動後「http://<サーバのIPアドレス>:8080/」にアクセスし、WordPressの初回設定画面が表示されることを確認します。

コンテナの停止・削除

docker-composeコマンドで起動したコンテナを停止・削除するには、「docker-compose down」コマンドを使用します。

・docker-composeで起動したコンテナを停止・削除する
$ docker-compose down