紫の開発日記。

同人サークルサイトを運営するにあたっての作業内容等を書きます。

【第3回】DockerでVPS上に独自ドメイン・SSLなWordpressサイトを立ち上げる

このシリーズの概略については、こちら↓をお読みください。
yukari-n-u.hatenablog.com

これは私個人の備忘録なので、内容については保証しかねます。
ただ、間違っている箇所があれば教えいただけると嬉しいです。

はじめに

Dockerの導入に関しては、前回の記事をお読みください。
yukari-n-u.hatenablog.com

今回は、Docker上にnginx(Let's Encrypt)+MySQL+Wordpressの環境を作りました。
正直これを本番環境にするのはいろいろどうなの?とは思いますが、一応これで動いたからヨシ!

環境

ConoHa VPS
CentOS 7.7.1908
Docker 19.03.5
Docker-compose 1.25.0

ドメインの準備

取得したドメインのゾーン編集をし、VPSIPアドレスと紐付けしておきます。これはドメインの管理者によっていろいろだと思うので割愛。まだドメインがなければ、localhostIPアドレスを直書きすれば動くと思います。

フォルダ、ファイルの準備

まず適当なところにデータの置き場所となるフォルダを作成します。
私は「nu_style」という名前で、一般ユーザのホームディレクトリ直下に作りました。

$ mkdir nu_style
$ cd nu_style

そのフォルダ内に、以下のような「docker-compose.yml」というファイルを作成します。<>内の内容は適当に書き換えてください。また、サービス名がwpとかtest_wpとかになってますが、これも対応さえ変えなければ自由に書き換えて大丈夫です。
私の場合は本番サイトとそのテスト環境という想定をしているので、サービス名にtest_をつけた二つ目のMySQLWordpressコンテナも作成しています。複数サイトの必要がない場合は、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 &amp; 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