はじめに
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
を叩くと完成。
MYSQL_ROOT_PASSWORD=mysqlxxx
WORDPRESS_DB_PASSWORD=mysqlxxx
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: xxx@xxx.com
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: xxx@xxx.com
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自作など。あと監視など。フロントとバックエンドをいろいろ考えるとまた新しい困りごとが出てきそうだなと感じてます。
その他参考
-
書籍
-
nginx-proxy関連
-
->パスでルーティングもできる。
-
Docker操作関連
- docker-volume について
- [CentOS7にDockerでWordPressを入れる](https://qiita.com/kaityo256/items/0236db8b3 d92ee45f77b)
docker-compose関連