【第3回】DockerでVPS上に独自ドメイン・SSLなWordpressサイトを立ち上げる
このシリーズの概略については、こちら↓をお読みください。
yukari-n-u.hatenablog.com
これは私個人の備忘録なので、内容については保証しかねます。
ただ、間違っている箇所があれば教えいただけると嬉しいです。
はじめに
Dockerの導入に関しては、前回の記事をお読みください。
yukari-n-u.hatenablog.com
今回は、Docker上にnginx(Let's Encrypt)+MySQL+Wordpressの環境を作りました。
正直これを本番環境にするのはいろいろどうなの?とは思いますが、一応これで動いたからヨシ!
ドメインの準備
取得したドメインのゾーン編集をし、VPSのIPアドレスと紐付けしておきます。これはドメインの管理者によっていろいろだと思うので割愛。まだドメインがなければ、localhostのIPアドレスを直書きすれば動くと思います。
フォルダ、ファイルの準備
まず適当なところにデータの置き場所となるフォルダを作成します。
私は「nu_style」という名前で、一般ユーザのホームディレクトリ直下に作りました。
$ mkdir nu_style $ cd nu_style
そのフォルダ内に、以下のような「docker-compose.yml」というファイルを作成します。<>内の内容は適当に書き換えてください。また、サービス名がwpとかtest_wpとかになってますが、これも対応さえ変えなければ自由に書き換えて大丈夫です。
私の場合は本番サイトとそのテスト環境という想定をしているので、サービス名にtest_をつけた二つ目のMySQLとWordpressコンテナも作成しています。複数サイトの必要がない場合は、test_db以降を削除してください。また3つ以上のサイトを立ち上げたいときは、同じようなノリでサービスを付け加えればいいと思います。
version: '2' services: proxy: image: jwilder/nginx-proxy privileged: true ports: - 80:80 - 443:443 volumes: - ./data/docker-compose.d/certs:/etc/nginx/certs:ro - /etc/nginx/vhost.d - /usr/share/nginx/html - /var/run/docker.sock:/tmp/docker.sock:ro restart: always letsencrypt-proxy: image: jrcs/letsencrypt-nginx-proxy-companion privileged: true volumes: - ./data/docker-compose.d/certs:/etc/nginx/certs:rw - /var/run/docker.sock:/var/run/docker.sock:ro volumes_from: - proxy db: image: mysql:5.7.25 environment: MYSQL_DATABASE: db MYSQL_USER: <一つ目のサイトのMySQLのユーザ名> MYSQL_PASSWORD: <一つ目のサイトのMySQLのパスワード> MYSQL_RANDOM_ROOT_PASSWORD: "yes" wp: image: wordpress environment: WORDPRESS_DB_USER: <一つ目のサイトのMySQLのユーザ名> WORDPRESS_DB_PASSWORD: <一つ目のサイトのMySQLのパスワード> WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_NAME: db VIRTUAL_HOST: <一つ目のサイトのドメイン名> VIRTUAL_PORT: 80 LETSENCRYPT_HOST: <一つ目のサイトのドメイン名> LETSENCRYPT_EMAIL: <メールアドレス> volumes: - ./data/<一つ目のサイト名>/wp-content:/var/www/html/wp-content links: - db test_db: image: mysql:5.7.25 environment: MYSQL_DATABASE: test_db MYSQL_USER: <二つ目のサイトのMySQLのユーザ名> MYSQL_PASSWORD: <二つ目のサイトのMySQLのパスワード> MYSQL_RANDOM_ROOT_PASSWORD: "yes" test_wp: image: wordpress environment: WORDPRESS_DB_USER: <二つ目のサイトのMySQLのユーザ名> WORDPRESS_DB_PASSWORD: <二つ目のサイトのMySQLのパスワード> WORDPRESS_DB_HOST: test_db:3306 WORDPRESS_DB_NAME: test_db VIRTUAL_HOST: <二つ目のサイトのドメイン名> VIRTUAL_PORT: 80 LETSENCRYPT_HOST: <二つ目のサイトのドメイン名> LETSENCRYPT_EMAIL: <メールアドレス> volumes: - ./data/<二つ目のサイト名>/wp-content:/var/www/html/wp-content links: - test_db
※インデントの位置も重要っぽいです。ズレてる箇所があったらすみません。
このファイルの作成には、↓のサイトを参考にしました。
はじめてのDocker その2 〜SSLに対応した複数ドメイン環境を作る方法〜 | WebNAUT
ただこれだけは動かず、いろいろと付け加えたい機能もあったので以下の点を修正しました。
- MySQLのバージョンを5.7.25に指定する(最新版だとWordpressが動かない)
- wp-contentを、data/<サイト名>/wp-contentにマウントする(いじりやすい)
- MySQLのログインをrootで行わない(よくわからんけどその方がいいのでは?)
環境定数を直で記述していたり、そもそもバージョン2で書いてたり、いろいろセキュリティ上問題があるようなないような気がしますが、動いたからええんじゃよ。
コンテナの作成と起動
以下のコマンドを実行します。
$ docker-compose up -d
Let's Encryptの設定が終わるまで少し(数分~数時間)待ち、指定したドメインにアクセスすると、wordpressの初期設定画面が表示されると思います。
ファイルをアップロードしたい場合は、<最初に作ったフォルダ>/data/<サイト名>にマウントの設定をしたので、この下アップロードすれば普通のレンタルサーバみたいな感じで使えると思います。
コンテナの管理なんかは、↓とかを見ながらやるといいかと思います。
docker & docker-compose コマンド集 - Qiita
トラブルシューティングメモ
- 先の記事で述べたようにDockerを起動したにもかかわらず、「couldn't connect to docker daemon」というメッセージが表示された場合、一回ターミナルを閉じ接続し直すといけた。
- ブラウザで「Bad Gateway」と(nginxの画面で)の表示が出たときは、まだコンテナが立ち上がっていない(?)ので、2、30秒待つ。
- ブラウザで「Error Establishing a Database Connection」と(Wordpressの画面で)出たら、データベースへのログインに失敗している。ユーザ名やパスワードを見直す。
- ブラウザで「このサイトにアクセスできません」と(ブラウザのメッセージとして)出たら、ドメインの設定が間違っているか、Let's Encryptの設定待ち。前者の場合は設定を見直し、後者の場合は数十分~数時間程待つ。
所感
これでついにWordpressサイトが立ち上がりました!
まとめてみると意外とやることは少なくて、コツさえつかめば数分で環境が整いそうですね。
気に入らなかったらすぐ潰せますし、やっぱDockerはステキです。
ただ、これでほんとにいいのか?という疑問はやっぱり残りますね。個人開発者なら問題が起きたところでダメージはないんですが、実務で使うとなるといろいろ考慮すべき点が多そうです。
次回はおまけで、なぜかWordpress起動時に言語選択画面が出なかった場合の対策を書きます。
yukari-n-u.hatenablog.com