※KUSANAGIをディスる趣旨はありません。
※技術的な内容はほとんどありません。(最後に少しあるかも・・・)
先日KUSANAGI Run on Dockerで構築していたサーバが落ちてました。
原因はディスク不足でDocker内のPHPが正しく立ち上がらず、その結果Dockerが落ちるというものでした。
ただ、それまでも若干の不安要素というか不安定な部分もあり・・・
DockerとKUSANAGIの相性があまり良くないような雰囲気というか、私の求める動きをしないというか・・・
結局のところDockerが魔物なのかな〜と思う今日この頃です。
結局何があったのか
- ディスクが冗談抜きでギリギリまで使われてvimもまともに動かなくなった
- Dockerが死んでDBが取り出せなくなった
- 復旧に過去最高の時間がかかった
文字に起こすと大したことない雰囲気で複雑な気持ちになっていますが、今回の件を受けてDocker内にデータを保存しない設定をしました。
KUSANAGIとは仲良くなりたい気持ちがあるの今回もKUSANAGI RoDで構築してます。
ただ、公式の手順だと外部のDBに接続できなかったので完全に手探りで接続する形になり将来がとても不安です。
やったこと
- 外部にMySQLを構築し、KUSANAGIのDBを移行(窃盗)
- KUSANAGIのボリュームをユーザ直下に移動(拉致)
多分開発者の方に怒られるだろうという内容です・・・
元々KUSANAGIのボリュームはDockerのデフォルトディレクトリに保存されているのでコピーして削除して置き換えました。
DBはダンプファイルを取得してMySQLに流し込み、Docker-compose.ymlに設定値を追加し、wp-config.phpを書き換えて外に向けました。
外部DBに接続
KUSANAGI公式のprovison時にSQLサーバのホストを指定する方法ではエラーが出て上手くDockerコンテナが作成されなかったため、既存のコンテナ作成時にできるdocker-compose.ymlに内容を追記して対応しました。
今回は前回記事のKUSANAGI RoD docker-compose.ymlに追記していきます。
※作業をする場合は”docker-compose down”でコンテナを停止させてください。
前回の記事は以下を参照ください。
変更箇所は以下の通りです。
version: '3'
networks:
default:
driver: bridge
driver_opts:
com.docker.network.driver.mtu: 9000
services:
httpd:
container_name: <コンテナ名>_httpd
image: primestrategy/kusanagi-nginx:1.21.1-r1
restart: always
env_file:
- .kusanagi
- .kusanagi.httpd
volumes:
- kusanagi:/home/kusanagi:rw #:roを:rwに変更:roがない場合は追加 *1
- kusanagi:/etc/letsencrypt
- kusanagi:/var/www/html/.well-known
- ./nginx/conf.d/mylogs.conf:/etc/nginx/conf.d/mylogs.conf #*2
ports:
- "80:8080"
- "443:8443"
- "3306:3306" #ここに外部SQLと接続するためのポートを追加
extra_hosts:
- "<fqdn値>:127.0.0.1"
## CONFIG
config:
container_name: <コンテナ名>_config
restart: always
build:
context: ./wpcli
user: "1000:1001"
env_file:
- .kusanagi
- .kusanagi.wp
- .kusanagi.db
volumes:
- database:/var/run/mysqld
- kusanagi:/home/kusanagi:rw #:roを:rwに変更:roがない場合は追加 *1
command: wp --version
php:
container_name: <コンテナ名>_php
image: primestrategy/kusanagi-php:7.4.22-r0
restart: always
env_file:
- .kusanagi
- .kusanagi.php
- .kusanagi.mail
network_mode: "service:httpd"
volumes:
- database:/var/run/mysqld
- kusanagi:/home/kusanagi:rw #:roを:rwに変更:roがない場合は追加
- ./php/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini #追加 *3
## MYSQL
db:
container_name: <コンテナ名>_db
image: mariadb:10.5.12-focal
restart: always
user: "999:999"
env_file:
- .kusanagi.mysql
network_mode: "service:httpd"
volumes:
- database:/var/run/mysqld
- database:/var/lib/mysql
## FTPD
ftp:
container_name: <コンテナ名>_ftp
image: primestrategy/kusanagi-ftpd:1.0.2-r9
restart: always
network_mode: "service:httpd"
env_file:
- .kusanagi
- .kusanagi.wp
volumes:
- kusanagi:/home/kusanagi:rw #:roを:rwに変更:roがない場合は追加 *1
volumes:
kusanagi:
database:
設定後”docker-compose up -d”でコンテナを起動し、コンテナ内のwp-config.phpに外部DBの接続情報を記載してください。
また、事前にMySQL にwordpressのDBユーザ、wordpressのDBを作成し、データ移行を済ませておいてください。
KUSANAGIボリュームの移動
次ぎに同じdocker-compose.ymlにKUSANAGIのドキュメントルートに当たるディレクトリを別の場所にマウントするための設定を追記します。
追記内容は以下の通りです。
version: '3'
networks:
default:
driver: bridge
driver_opts:
com.docker.network.driver.mtu: 9000
services:
httpd:
container_name: <コンテナ名>_httpd
image: primestrategy/kusanagi-nginx:1.21.1-r1
restart: always
env_file:
- .kusanagi
- .kusanagi.httpd
volumes:
- kusanagi:/home/kusanagi:rw #:roを:rwに変更:roがない場合は追加 *1
- kusanagi:/etc/letsencrypt
- kusanagi:/var/www/html/.well-known
- ./nginx/conf.d/mylogs.conf:/etc/nginx/conf.d/mylogs.conf #*2
ports:
- "80:8080"
- "443:8443"
extra_hosts:
- "<fqdn値>:127.0.0.1"
## CONFIG
config:
container_name: <コンテナ名>_config
restart: always
build:
context: ./wpcli
user: "1000:1001"
env_file:
- .kusanagi
- .kusanagi.wp
- .kusanagi.db
volumes:
- database:/var/run/mysqld
- kusanagi:/home/kusanagi:rw #:roを:rwに変更:roがない場合は追加 *1
command: wp --version
php:
container_name: <コンテナ名>_php
image: primestrategy/kusanagi-php:7.4.22-r0
restart: always
env_file:
- .kusanagi
- .kusanagi.php
- .kusanagi.mail
network_mode: "service:httpd"
volumes:
- database:/var/run/mysqld
- kusanagi:/home/kusanagi:rw #:roを:rwに変更:roがない場合は追加
- ./php/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini #追加 *3
## MYSQL
db:
container_name: <コンテナ名>_db
image: mariadb:10.5.12-focal
restart: always
user: "999:999"
env_file:
- .kusanagi.mysql
network_mode: "service:httpd"
volumes:
- database:/var/run/mysqld
- database:/var/lib/mysql
## FTPD
ftp:
container_name: <コンテナ名>_ftp
image: primestrategy/kusanagi-ftpd:1.0.2-r9
restart: always
network_mode: "service:httpd"
env_file:
- .kusanagi
- .kusanagi.wp
volumes:
- kusanagi:/home/kusanagi:rw #:roを:rwに変更:roがない場合は追加 *1
volumes:
kusanagi: #ここから
driver_opts:
type: none
device: <マウントする絶対パス>
o: bind #ここまで
database:
その後、以下のコマンドでDockerVolumeにあるKUSANAGIディレクトリをマウントするディレクトリにコピーします。
cp -rf /var/lib/docker/volumes/<provison名>_kusanagi/_data/<provison名> <マウントする絶対パス>
正しくコピーできたことを確認し、以下のコマンドでDocker volumeを削除します。
#dockerのボリューム一覧を取得
docker volume ls
#指定したボリュームを削除
docker volume rm <provison名>_kusanagi
これでKUSANAGIコマンドを移動する準備は完了です。
後は勇気を出して”docker-compose up -d”と唱えるだけです。
上手くいけばコンテナが起動します。
このままではパーミッションの問題でwordpressが表示されないため適切なパーミッションを指定してください。
指定の仕方は前回と同じなので省略します。
おわり
かなり駆け足で書いてしまいましたが、試行錯誤の末の結果なので実際の作業は以上だと思います。
この設定をすることで何らかの事情でDockerがお亡くなりになってもDBとwordpressファイル自体は確保できると思います。
後現在考えているのは、同じ環境をもう一つ用意し、ドキュメントルートとDBを共有した複数のWordpressを立ち上げ負荷分散を行うなどです。(もしくはテスト環境とするか)
どちらにしろ必要なデータを全て外だしできればやりたいようにできるかなと考えています。
コメント