Docker Compose で WordPress をインストールする方法


このチュートリアルは、これらの OS バージョン用に存在します

  • Ubuntu 22.04 (Jammy Jellyfish)
  • Ubuntu 16.04 (Xenial Xerus)

このページでは

  1. 前提条件
  2. ステップ 1 - ファイアウォールを構成する
  3. ステップ 2 - Docker と Docker Compose をインストールする
  4. ステップ 3 - WordPress 用の Docker Compose ファイルを作成する
  5. ステップ 4 - Nginx の Docker Compose を更新する
  6. ステップ 5 - SSL 用に Docker Compose を更新する
  7. ステップ 6 - WordPress を起動してインストールする
  8. ステップ 7 - PhpMyAdmin にアクセスする
  9. ステップ 8 - WP-CLI にアクセスする
  10. ステップ 9 - WordPress のバックアップ
  11. ステップ 10 - WordPress をアップグレードする
  12. 結論

WordPress は、世界で最も人気のあるブログ プラットフォームです。シェル コマンド、スクリプトを使用した手動インストール、または一般的な Web ホストが提供する Web インストーラーの使用など、WordPress をインストールする方法はたくさんあります。 WordPress を実行するには、LAMP (Linux、Apache、MySQL、および PHP) または LEMP (Linux、Nginx、MySQL、および PHP) スタックをインストールする必要があります。

このチュートリアルでは、Docker/Docker Compose を使用して WordPress をインストールする方法を説明します。 Docker を使用すると、優先スタックをインストールするプロセスがはるかに簡単になります。同じ構成を使用して、WordPress を複数のサーバーにすばやくインストールできます。また、データベースを管理するための phpMyAdmin ツールと、SSL 経由でサイトを提供するための Nginx プロキシ サーバーもインストールします。

前提条件

  • A Linux server with a non-root user having sudo privileges. We are using a server running Ubuntu 22.04 for our tutorial.

  • A fully qualified domain name (FQDN) pointing to your server. For our purposes, we will use example.com as the domain name for the WordPress site and phpmyadmin.example.com for the phpMyAdmin website.

  • Make sure everything is updated.

    $ sudo apt update
    
  • Install basic utility packages. Some of them may already be installed.

    $ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
    

ステップ 1 - ファイアウォールの構成

最初のステップは、ファイアウォールを構成することです。 Ubuntu には、デフォルトで ufw (複雑でないファイアウォール) が付属しています。

ファイアウォールが実行されているかどうかを確認します。

$ sudo ufw status

次の出力が得られるはずです。

Status: inactive

SSH ポートを許可して、ファイアウォールを有効にしても現在の接続が切断されないようにします。

$ sudo ufw allow OpenSSH

HTTP および HTTPS ポートも許可します。

$ sudo ufw allow http
$ sudo ufw allow https

ファイアウォールを有効にする

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

ファイアウォールのステータスを再度確認します。

$ sudo ufw status

同様の出力が表示されるはずです。

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

ステップ 2 - Docker と Docker Compose をインストールする

Ubuntu 22.04 には、古いバージョンの Docker が付属しています。最新バージョンをインストールするには、まず Docker GPG キーをインポートします。

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Docker リポジトリ ファイルを作成します。

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

システム リポジトリ リストを更新します。

$ sudo apt update

Docker の最新バージョンをインストールします。

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

実行されていることを確認します。

$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-01-09 13:19:16 UTC; 9s ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 1863 (dockerd)
      Tasks: 7
     Memory: 20.5M
        CPU: 278ms
     CGroup: /system.slice/docker.service
             ??1863 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

デフォルトでは、Docker には root 権限が必要です。 docker コマンドを実行するたびに sudo を使用したくない場合は、ユーザー名を docker に追加してください。 > グループ。

$ sudo usermod -aG docker $(whoami)

この変更を有効にするか、次のコマンドを使用するには、サーバーからログアウトして同じユーザーとして再度ログインする必要があります。

$ su - ${USER}

ユーザーが Docker グループに追加されていることを確認します。

$ groups
navjot wheel docker

ステップ 3 - WordPress 用の Docker Compose ファイルを作成する

WordPress 設定用のディレクトリを作成します。

$ mkdir wordpress

ディレクトリに切り替えます。

$ cd wordpress

編集用に Docker 構成ファイルを作成して開きます。

$ nano docker-compose.yml

その中に次のコードを貼り付けます。

version: '3.9'

services:
  wp:
    image: wordpress:latest
    container_name: wordpress-app
    restart: unless-stopped
    expose:
      - 8080
    volumes:
      - ./config/php.conf.ini:/usr/local/etc/php/conf.d/conf.ini
      - ./wp-app:/var/www/html
      #- ./plugin-name/trunk/:/var/www/html/wp-content/plugins/plugin-name # Plugin development
      #- ./theme-name/trunk/:/var/www/html/wp-content/themes/theme-name # Theme development
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: "${DB_NAME}"
      WORDPRESS_DB_USER: "${DB_USER_NAME}"
      WORDPRESS_DB_PASSWORD: "${DB_USER_PASSWORD}"
      VIRTUAL_HOST: example.com
      LETSENCRYPT_HOST: example.com
    depends_on:
      - db
    links:
      - db

  wpcli:
    image: wordpress:cli
    container_name: wpcli_app
    volumes:
      - ./config/php.conf.ini:/usr/local/etc/php/conf.d/conf.ini
      - ./wp-app:/var/www/html
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: "${DB_NAME}"
      WORDPRESS_DB_USER: "${DB_USER_NAME}"
      WORDPRESS_DB_PASSWORD: "${DB_USER_PASSWORD}"
    depends_on:
      - db
      - wp

  pma:
    image: phpmyadmin/phpmyadmin
    container_name: pma
    restart: unless-stopped
    environment:
      # https://docs.phpmyadmin.net/en/latest/setup.html#docker-environment-variables
      PMA_HOST: db
      PMA_PORT: 3306
      MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
      UPLOAD_LIMIT: 50M
      VIRTUAL_HOST: phpmyadmin.example.com
      LETSENCRYPT_HOST: phpmyadmin.example.com
    expose:
      - 8081
    links:
      - db:db

  db:
    image: mysql:latest
    container_name: wordpressdb
    restart: unless-stopped
    command: [
        '--default_authentication_plugin=mysql_native_password',
        '--character-set-server=utf8mb4',
        '--collation-server=utf8mb4_unicode_ci'
    ]
    volumes:
      - ./wp-data:/docker-entrypoint-initdb.d
      - db_data:/var/lib/mysql
    environment:
      MYSQL_DATABASE: "${DB_NAME}"
      MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
      MYSQL_USER: "${DB_USER_NAME}"
      MYSQL_PASSWORD: "${DB_USER_PASSWORD}"

volumes:
  db_data:

Ctrl + X を押し、プロンプトが表示されたら Y を入力して、ファイルを保存します。

プルしている 2 つの WordPress イメージがあります。 1 つは Web サイト用で、もう 1 つは WP-CLI ツール用です。どちらのイメージも MySQL 8.0 Docker イメージに依存しています。ここでは、データベース資格情報の環境変数を設定します。両方のコンテナー用に 2 つのボリュームを作成しました。そのうちの 1 つは WordPress サイトの公開ファイルを指し、2 つ目はカスタム PHP.ini の場所を指します。 Nginx 仮想ホスト ドメインの環境変数と、WordPress サイトの SSL ドメインを暗号化することも定義しました。

さらに環境変数を追加し、カスタム wp-config.php データを Docker ファイルに追加できます。 WordPress の DockerHub ページから、追加の環境変数について学ぶことができます。

次のイメージは、同じ MySQL イメージに依存し、root パスワードを使用して接続する phpMyAdmin 用です。アップロードの上限は 50MB です。要件とデータベースのサイズに応じて変更できます。 WordPress サイトと同様に、Nginx 仮想ホスト ドメインを定義し、phpMyAdmin サイトの SSL ドメイン名を暗号化します。

最後の画像は MySQL データベース用です。デフォルトの認証方法と文字セットを設定するために、いくつかのコマンドを渡しました。また、データを保存するためのボリュームもいくつか作成しました。データベース資格情報の環境変数も設定しました。

次のステップは、構成ファイルで使用される変数の環境ファイルを作成することです。編集用の環境ファイルを作成して開きます。

$ sudo nano .env

その中に次のコードを貼り付けます。

DB_NAME=wordpress
DB_USER_NAME=username
DB_USER_PASSWORD=userpassword
DB_ROOT_PASSWORD=password

Ctrl + X を押し、プロンプトが表示されたら Y を入力して、ファイルを保存します。変数を、選択したユーザー名とパスワードに置き換えます。

カスタム php.ini ファイルを使用して、PHP 構成をカスタマイズできます。

PHP 構成用のフォルダーを作成します。

$ mkdir config

php.conf.ini ファイルを作成して開き、編集します。

$ nano config/php.conf.ini

その中に次のコードを貼り付けます。必要に応じて値を調整します。 PhpMyadmin コンテナーのアップロード制限は、このファイルで使用する値とは無関係です。

file_uploads = On
memory_limit = 500M
upload_max_filesize = 30M
post_max_size = 30M
max_execution_time = 600

Ctrl + X を押し、プロンプトが表示されたら Y を入力して、ファイルを保存します。

ステップ 4 - Nginx の Docker Compose を更新する

Nginx 構成用のディレクトリを作成します。

$ mkdir nginx

そのディレクトリ内に仮想ホスト用のディレクトリを作成します。

$ mkdir nginx/vhost

nginx/vhost/wordpress.example.com を作成して開き、編集します。

$ nano nginx/vhost/wordpress.example.com

その中に次のコードを貼り付けます。

server_tokens off;
client_max_body_size 30m;

Ctrl + X を押し、プロンプトが表示されたら Y を入力して、ファイルを保存します。

nginx/vhost/phpmyadmin.example.com ファイルについても同じことを行います。

$ nano nginx/vhost/phpmyadmin.example.com

その中に次のコードを貼り付けます。

server_tokens off;
client_max_body_size 50m;

Ctrl + X を押し、プロンプトが表示されたら Y を入力して、ファイルを保存します。

docker 構成ファイルを再度開きます。

$ nano docker-compose.yml

volumes: db_data: 行の前に次のコードを貼り付けます。

nginx:
    container_name: nginx
    image: nginxproxy/nginx-proxy
    restart: unless-stopped
    ports:
        - 80:80
        - 443:443
    volumes:
        - /var/run/docker.sock:/tmp/docker.sock:ro
        - ./nginx/html:/usr/share/nginx/html
        - ./nginx/certs:/etc/nginx/certs
        - ./nginx/vhost:/etc/nginx/vhost.d
    logging:
        options:
            max-size: "10m"
            max-file: "3"

Ctrl + X を押し、プロンプトが表示されたら Y を入力して、ファイルを保存します。

上記のコードでは、Nginx プロキシ Docker イメージをプルし、ポート 80 と 443 をホスト コンテナーに公開します。これは、外部世界への接続に使用されます。また、Nginx HTML ページ用のボリューム、すべての SSL 証明書が保存されるディレクトリ、および追加の nginx 構成を追加するために上記で使用した仮想ホスト用のディレクトリも作成しました。ここでは、WordPress および phpMyAdmin サイトのファイル アップロード サイズを構成しました。サイトのドメイン名は、前の手順で定義した環境変数から選択されます。

ステップ 5 - SSL 用に Docker Compose を更新する

docker compose ファイルを編集用に開きます。

$ nano docker-compose.yml

volumes: db_data: 行の前に次のコードを貼り付けます。

acme-companion:
    container_name: acme-companion
    image: nginxproxy/acme-companion
    restart: unless-stopped
    volumes_from:
        - nginx
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock
        - ./nginx/acme:/etc/acme.sh
    environment:
        DEFAULT_EMAIL: 

Ctrl + X を押し、プロンプトが表示されたら Y を入力して、ファイルを保存します。

ここでは、Nginx プロキシと連携して動作する Acme コンパニオン Docker イメージをプルしています。 Nginx コンテナーからボリュームをプルします。 SSL の暗号化に関するすべての構成を格納する acme.sh ツールのボリュームも定義します。最後に、環境変数を定義して SSL 証明書を Lets Encrypt に登録します。

ステップ 6 - WordPress を起動してインストールする

すべての構成ファイルが完成したので、コンテナーを起動して起動します。

$ docker compose up -d

数分待ってから、コンテナのステータスを確認します。

$ docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED          STATUS          PORTS                                                                      NAMES
c1e8a9b5169d   nginxproxy/acme-companion   "/bin/bash /app/entr…"   14 seconds ago   Up 7 seconds                                                                               acme-companion
8a37c78ff790   wordpress:latest            "docker-entrypoint.s…"   14 seconds ago   Up 7 seconds    80/tcp, 8080/tcp                                                           wordpress-app
4f9c777c97c2   phpmyadmin/phpmyadmin       "/docker-entrypoint.…"   14 seconds ago   Up 7 seconds    80/tcp, 8081/tcp                                                           pma
1b1dede46b07   nginxproxy/nginx-proxy      "/app/docker-entrypo…"   14 seconds ago   Up 11 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   nginx
b9cf64a2f4a3   mysql:latest                "docker-entrypoint.s…"   14 seconds ago   Up 11 seconds   3306/tcp, 33060/tcp                                                        wordpressdb

URL https://example.com を開いて、WordPress インストーラーを起動します。

言語を選択し、[続行] ボタンをクリックして次のページに進みます。

サイトの詳細を入力し、ユーザー名、パスワード、メール アドレスを選択して、[WordPress のインストール] ボタンをクリックしてインストールを開始します。

インストール成功ページに移動します。 [ログイン] ボタンをクリックして、ログイン ページに移動します。

ログイン情報を入力し、[ログイン] ボタンをクリックして WordPress ダッシュボードを開きます。

これで WordPress を使い始めることができます。

ステップ 7 - PhpMyAdmin にアクセスする

URL https://phpmyadmin.example.com から phpMyAdmin にアクセスできます。

ユーザー名として root を入力し、ルート パスワードを入力し、[ログイン] をクリックしてダッシュボードを開きます。

今すぐ phpMyAdmin を使い始めることができます。

ステップ 8 - WP-CLI にアクセスする

次のコマンドを使用して WP-CLI にアクセスできます。

$ docker compose run --rm wpcli cli version

次の出力が得られます。

[+] Running 2/0
 ? Container wordpressdb    Running                                                                                0.0s
 ? Container wordpress-app  Running                                                                                0.0s
WP-CLI 2.7.1

毎回このような長いコマンドを入力するのを避けるために、Linux のエイリアス機能を使用できます。

$ alias wp="docker compose -f ~/wordpress/docker-compose.yml run --rm wpcli"

コンテナ内のどこからでも次のコマンドを入力できるようになりました。

$ wp cli version

Linux のエイリアスは一時的なものです。エイリアスを永続的にするには、~/.bashrc ファイルを編集する必要があります。編集用に開きます。

$ nano ~/.bashrc

ファイルの最後に次の行を貼り付けます。

# Custom aliases
alias wp="docker compose -f ~/wordpress/docker-compose.yml run --rm wpcli"

Ctrl + X を押し、プロンプトが表示されたら Y を入力して、ファイルを保存します。

ファイルを入手して構成をリロードします。

$ source ~/.bashrc

WP-CLI の使用を開始できます。

ステップ 9 - WordPress のバックアップ

WordPress をバックアップする方法はいくつかあります。最も簡単な方法は、プラグインを使用することです。そのために利用できるプラグインがいくつかあります。 phpMyAdmin を使用してバックアップを作成することもできます。

コマンドラインを使用して WordPress データベースをバックアップすることもできます。 WordPress ディレクトリに切り替えます。

$ cd ~/wordpress

次のコマンドを使用して、WordPress データベースをバックアップします。 MySQL root パスワードを求められます。

$ docker compose exec db sh -c "exec mysqldump wordpress -uroot -p" | sudo tee wp-data/data_`date +%d-%m-%Y"_"%H_%M_%S`.sql >/dev/null
Enter password: password

上記のコマンドは、SQL バックアップを ~/wordpress/wp-data ディレクトリに作成します。

ディレクトリの内容を確認してください。

$ ls -al wp-data
total 908
drwxr-xr-x 2 root   root     4096 Jan 11 10:15 ./
drwxrwxr-x 6 navjot navjot   4096 Jan 11 10:05 ../
-rw-r--r-- 1 root   root   919814 Jan 11 10:14 data_11-01-2023_10_14_40.sql

ディレクトリにバックアップされたデータベースが表示されます。このデータベースは、phpMyAdmin ツールまたは次のコマンドを使用して復元できます。

$ docker compose exec db sh -c "exec mysql -uroot -p" < wp-data/data_11-01-2023_10_14_40.sql

定期的にデータベースをバックアップする cron ジョブを作成できます。

/etc/cron.daily ディレクトリにバックアップ スクリプトを作成し、編集用に開きます。

$ sudo nano /etc/cron.daily/wpbackup.sh

その中に次のコードを貼り付けます。

#!/bin/bash
docker compose exec db sh -c "exec mysqldump wordpress -uroot -p" | tee wp-data/data_`date +%d-%m-%Y"_"%H_%M_%S`.sql >/dev/null

Ctrl + X を押し、プロンプトが表示されたら Y を入力して、ファイルを保存します。

スクリプトを実行可能にします。

$ sudo chmod +x /etc/cron.daily/wpbackup.sh

これで、データベースは毎日バックアップされます。

ステップ 10 - WordPress をアップグレードする

WordPress をアップグレードする最も簡単な方法は、組み込みのアップデーターを使用することです。 Docker を使用してアップグレードすることもできます。最初のステップは、ステップ 9 のコマンドを使用して WordPress データベースをバックアップすることです。

次に、ディレクトリに切り替えます。

$ cd ~/wordpress

コンテナを停止します。

$ docker compose down --remove-orphans

最新のコンテナー イメージをプルします。

$ docker compose pull

必要に応じて、docker-compose.yml に変更を加えます。

WordPress コンテナを再起動します。

$ docker compose up -d

結論

これで、Docker Compose、phpMyAdmin、および WP-CLI を使用して WordPress をインストールするチュートリアルは終了です。質問がある場合は、以下のコメントに投稿してください。