Docker composeでwordpressを複数立ち上げるお話

パソコン関係

はじめに

docker composeを使用して複数のサイトを立ち上げようとした際、うまく行かなかったので原因と解決方法を記しておきます。
ゴリ押し方法なので、ベストでは無い可能性が高いです。
なおかつ間違いもあるかもしれません。
メモリ節約のため、database1個に対して複数のwordpressを接続します。
※wordpressとdatabaseを1対1で立ち上げる場合はすんなり出来ました。

環境

OS : ubuntu 20.04
dockerが使用できる状況ならそれほど変わらないと思います。

docker_compose.yml

構成は下記の通りです。
USERやPASSWORD、URL関係はセキュリティの関係上書き換えています。

version: "3.8"
services:
# MySQL
  wp_db:
    container_name: wp_db
    image: mysql:8.0
    volumes:
      - ./wp_db:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress1
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
  # wordpress1
  wordpress1:
    container_name: wordpress1
    depends_on:
      - wp_db
    image: wordpress:php8.0-apache
    restart: always
    environment:
      WORDPRESS_DB_HOST: wp_db:3306
      WORDPRESS_DB_USER: user
      WORDPRESS_DB_PASSWORD: pass
      WORDPRESS_DB_NAME: wordpress1
    volumes:
       - ./wordpress/html:/var/www/html
       - ./php/php.ini:/usr/local/etc/php/conf.d/php.ini
  # wordpress2
  wordpress2:
    container_name: wordpress2
    depends_on:
      - wordpress1
    image: wordpress:php8.0-apache
    restart: always
    environment:
      WORDPRESS_DB_HOST: wp_db:3306
      WORDPRESS_DB_USER: user
      WORDPRESS_DB_PASSWORD: pass
      WORDPRESS_DB_NAME: wordpress2
    volumes:
       - ./wordpress_cafe/html:/var/www/html
       - ./php_cafe/php.ini:/usr/local/etc/php/conf.d/php.ini
#https-portal ssl証明書発行
  https-portal:
    container_name: https-portal
    image: steveltn/https-portal:1
    ports:
      - '80:80'
      - '443:443'
    restart: always
    volumes:
      - ./certs:/var/lib/https-portal
    environment:
      #STAGE: 'staging' # オレオレ証明書
      STAGE: 'production' # 本番でコメントアウトを外す
      #FORCE_RENEW: 'true' # 証明書強制リセット
      CLIENT_MAX_BODY_SIZE: 100M # アップロード量の制限 def:1MB
      #WEBSOCKET: "true" # websoket使用時に有効にする
      HSTS_MAX_AGE: 60 # 秒 httpsに強制転送
      DOMAINS: >-
        [site1].com -> http://wordpress1:80,
        [site2].com -> http://wordpress2:80,
  
    depends_on:
       - wordpress2

勘違いしたこと

まず、下記の箇所で[wordpress1]というdatabaseが作られます。

environment:
  MYSQL_DATABASE: wordpress1


なのでwordpressとdatabaseが 1対1のときは問題なく動きます。
一回、downしてwordpress2と書き換えれば[wordpress2]というdatabaseが追加されるんじゃないかなと思っていましたが、up -dでは追加されませんでした。
build からの up -d は試していません。
ひょっとするといけるかもですが、先に他の方法で解決してしまったのでやってません。

解決方法

やりたいことはdatabaseを作ることなので、力技で行けば簡単です。
dockerで工夫するとかはしません。
直接MySQLを操作してdatabaseを作成し権限を付与します。
各種コマンドは下記の通りです。

# dockerのID確認
docker ps
# コンテナに入る
docker exec -it [コンテナID] /bin/bash
# MySQLのコマンドに入る(rootで)
mysql -u [ユーザー名] -D [データベース名] -p
#パスワードを入力する
# データベースを確認する
show database;
# データベース作成
create database [データベース名];
# ここで専用のユーザーを作成したほうが良い
# ユーザーに権限付与
grant all ON [データベース名].* TO [ユーザー名];

複数のサイトが一つのVPSに相乗りするようになり、MySQLを複数立ち上げるメモリの余裕もなかったので、コマンドでdatabaseを増やすという方法を取りました。
結果として同じ環境を立ち上げれるというdocker composeのメリットを潰す感じになってしまいました。
とりあえず動いてるので(<- 危険なやつ)とりあえず良しとしています。

タイトルとURLをコピーしました