以前より一つのサーバー上で複数サイトをプリフィックスをつけて運用していました。
しかし、サイト数が多くなってくると、データベースやそれぞれのファイルがどうしてもごちゃごちゃしてくるものです。
負荷の分散やサービスの分離、自分自身の勉強目的の意味も込めて、コンテナ化を試してみようと思い立った次第です。
既存の環境
単純に、1つのウェブサーバーで複数のコンテンツを捌いているだけでした。
データベースもプリフィックスを付与して運営していました。
コンテナ化された環境
これはコンテナ化されたサイトの概要図です。
これだけ見て「ああ、なるほど。」と思えた方はもう説明不要だと思います。
それぞれのdockerコンテナはこのようになっています。
WordPressの動作に必要な環境が一つのコンテナにまとまっており、複数のサイトを立てた場合でも互いに干渉しないようになっています。
また、コンテンツやデータベースなどは外出しとし、各イメージの再構築を行ってもデータが失われないようになっています。
これによって構成を含めた全体データのバックアップが可能になった上に、サイトの複製も簡単に行えるようになりました。
環境の構築
docker-compose.yamlなどの設定ファイル一式はGithubにあげています。(→github)
コンテナの構成
nginx
DockerHub(nginx)
ウェブサーバーのイメージです。
バージョン依存性は無いのでlatestでも大丈夫です。
内部の待ち受けポートは80ですが、ホスト側には8080を開いています。
構成を複製し、複数サイトを立てる場合はホスト側(コンテナ外向き)のポートを8080から変更する必要があります。
mariaDB
DockerHub(mariaDB)
データベースサーバーのイメージです。アシカかわいい。
MySQLでも構いません。ただし、MySQLは8.x系からデフォルトの認証プラグインが変更になったため、初期設定状態では動きません。ご注意ください。(「caching_sha2_password」で検索)
WordPress
DockerHub(WordPress)
WordPress本体のイメージです。
内部にphp-fpmを持っているイメージを使用しています。
apacheを内包したイメージもあり、そちらを使う場合はnginxのイメージが不要になります。
コンテナ内 環境変数の設定[.env]
各イメージには環境変数が渡され、初期設定されるようになっています。
主に設定が必要な環境変数を.envにまとめているので、環境に合わせて変更してください。
特に以下は、記号を含めたランダム文字列などにすると安全です。
MYSQL_ROOT_PASSWORD MYSQL_PASSWORD WORDPRESS_AUTH_KEY WORDPRESS_SECURE_AUTH_KEY WORDPRESS_LOGGED_IN_KEY WORDPRESS_NONCE_KEY WORDPRESS_AUTH_SALT WORDPRESS_SECURE_AUTH_SALT WORDPRESS_LOGGED_IN_SALT WORDPRESS_NONCE_SALT
コンテナ内 nginxの設定[conf/nginx/default.conf]
コンテナ内のウェブサーバーとして動作するnginxを設定します。
上記GitHubのファイルではdefault.confを格納しています。
必要に応じて設定してください。
※デフォルトでWordPressが動作するようにはなっています。
ホスト側 nginxの設定[sample/www.sample.com.conf]
ホスト側のバーチャルホスト+リバースプロキシとして動作するnginxを設定します。
上記GitHubのファイルではサンプルとしてwww.sample.com.confを格納しています。
このサンプルは常時SSL化+HTTP2対応化をしています。
鍵ファイルの設定またはSSLの無効化、バーチャルホストのサーバー名、プロキシの送出先となるポートなどを環境に合わせて設定してください。
環境の立ち上げ
上記設定が完了したら、あとは docker-compose up -d
などで起動させます。
コメント