dockerマルチサイト構築(conoha+centos7+nginx-proxy, docker-compose)


はじめに

dockerを使って趣味サーバで依存関係を気にしなくて良い環境を安く作りたく、既存サーバーのリプレイスとしてdocker環境を構成。docker初心者です。

やりたかったこと

  • 複数のwebサーバ、webアプリをひとつのVPSで実行。
    •  www.xxx.com"→ウェブサーバへ。app1.xxx.com→webアプリへ。
  • dockerで運用、可能な限りdocker-composeだけで運用。
  • 趣味サーバなのでそこまでパフォーマンスは不要。将来的な拡張ができること。
  • https対応

構成イメージ

VPS

1年前、仕事の関係の検証でAWSとGCPとAzureを一気に作成しましたが結果検証環境程度であればVPSが一番安いという気づきがありました。最近はコンテナ関連日々変わっているのは理解しつつ、既存さくらを使っていたので評判のいいconohaを使ってみました。

初期セットアップ

基本設定。sshはポートを変更。公開鍵認証はセキュリティ観点というより昨今は圧倒的にいろいろ楽です。

docker エンジンセットアップ

Dockerは公式のドキュメントが非常に親切。公式の通りにやれば問題なく進みました。

ドメイン取得、DNS設定

ムームードメイン、ムームーDNSを利用。(結果安かったので。)
今回サブドメインでルーティングするため、使いそうなサブドメインをAレコードとして追加しておきます。

※実はここで一番時間をロス。
2日待っても全然DNS解決されない→whoisで確認→client holdになっている→?
→ドメイン開設後のメール認証忘れに気づく
→メール認証→2時間後にDNS解決される状態に。

マルチサイト構築(docker-compose)

ここからが今回の本番です。

docker-composeでの運用をいろいろ検討しましたが、複数のComposeファイルがあるのは面倒だと感じ、ひとつで統一。

最終的なディレクトリ構成
~/web
├── .env
├── docker-compose.yml
├── wordpress
│   ├── index.php
│   ├── …
└── wordpress2

wordpressフォルダはvolumeをマウントすることで自動作成されます。

->ローカル環境で諸々の動作確認

-> かなり構成を参考にさせていただきました。version: '2'で書かれたcomposeファイルがあとあとうまくいかなくなったので最終的にversion: '3'にしました。volumeのつくり方でつまづきその辺りを修正。networkの作り方やssl化はいろいろアレンジ。下記を好きなディレクトリに置いてdokcer-compose up -dを叩くと完成。

.env
MYSQL_ROOT_PASSWORD=mysqlxxx
WORDPRESS_DB_PASSWORD=mysqlxxx
docker-compose.yml
version: '3'

services:
  db:
    image: mysql:5.7
    container_name: mysql
    volumes:
      - "db-data:/var/lib/mysql"
    restart: always
    env_file: .env
    networks:
      - back_bridge
  wordpress:
    depends_on:
      - db
    image: wordpress
    container_name: wordpress
    expose:
      - "80"
    volumes:
      - "$PWD/wordpress:/var/www/html"
    env_file: .env
    environment:
      VIRTUAL_HOST: www.xxx.com
      WORDPRESS_DB_HOST: db:3306
      LETSENCRYPT_HOST: www.xxx.com
      LETSENCRYPT_EMAIL: [email protected]
    networks:
      - front_bridge
      - back_bridge
  db2:
    image: mysql:5.7
    container_name: mysql2
    volumes:
      - "db-data2:/var/lib/mysql"
    restart: always
    env_file: .env
    networks:
      - back_bridge
  wordpress2:
    depends_on:
      - db2
    image: wordpress
    container_name: wordpress2
    expose:
      - "80"
    volumes:
      - "$PWD/wordpress2:/var/www/html"
    env_file: .env
    environment:
      VIRTUAL_HOST: app1.xxx.com
      WORDPRESS_DB_HOST: db2:3306
      LETSENCRYPT_HOST: app1.xxx.com
      LETSENCRYPT_EMAIL: [email protected]
    networks:
      - front_bridge
      - back_bridge
  nginx-proxy:
    container_name: nginx_proxy
    image: jwilder/nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - html:/usr/share/nginx/html
      - dhparam:/etc/nginx/dhparam
      - vhost:/etc/nginx/vhost.d
      - certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
    labels:
    - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
    restart: always
    environment:
      TZ: Asia/Tokyo
    networks:
      - front_bridge
  letsencrypt-nginx-proxy-companion:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: nginx-proxy-lets-encrypt
    restart: always
    depends_on:
      - "nginx-proxy"
    volumes:
      - certs:/etc/nginx/certs:rw
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      NGINX_PROXY_CONTAINER: nginx-proxy
    networks:
      - front_bridge

volumes:
  db-data:
  db-data2:
  certs:
  html:
  vhost:
  dhparam:

networks:
  front_bridge:
    external: true
  back_bridge:
    driver: bridge

つまづいたところ

 ローカルのmac環境ではdbを所定のフォルダにマウントしてもうまくいっていたのですが、VPS環境だとwordpress経由のアップロードの際" Error establishing a database connection "に。dockerプロセスとrootプロセスの不一致が原因でしたが、いろいろこういった事象はあるようで、DBのvolumeはdockerに管理してもらうことにしました。

ポートの開き方などもDockerの癖が結構あることを知りました。firewalldのテストなどでも結構「?」ということは多かったです。

あとdocker-compose.ymlをいじっている最中は-dオプションなしでdocker-compose upを行うことを強く推奨します。

あとがき

 つまづくことはあったものの、コンテナの構成のこなれ感には感動。この構成であればCentOSではない方が良い気がします。慣れの問題で片付けていいものか悩みどころです。あとkubernetes等コンテナ管理については別途ちゃんと考えたいと思います。あとはCMS自作など。あと監視など。フロントとバックエンドをいろいろ考えるとまた新しい困りごとが出てきそうだなと感じてます。

その他参考

  • Docker操作関連

docker-compose関連