はじめに
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のメリットを潰す感じになってしまいました。
とりあえず動いてるので(<- 危険なやつ)とりあえず良しとしています。