はじめに
MyCoachのアプリがリリースされました。
アプリとは別で、Web版のMyCoachも作成しておりました。
実際のコンテンツの方はこちらをご覧ください。
(現在はまだβ期間として運用しております。)
https://mycoach.re-engines.com/top
こちらのWeb版はDocker環境を作って開発しておりました。
さて、今回はリリースを機に、開発中ではいじれなかったDocker環境を少し改修してみたので、そのことを記事にしたいと思います。
ただ既に多くの方がまとめてくださっている内容なので、そこまで目新しいものはないと思います。
今回は、既存プロジェクトに組み込むということで記載していきたいと思います。
なんで改修しようと思ったか
今までは、RailsコンテナとMySQLコンテナの2つで構築しておりました。
コンパクトな構成ですね!
ただ、実際に本番でRailsを運用するときには、リバースプロキシを立てることが多いかと思います。
Dockerでも複数コンテナを組み合わせることで、そのような挙動を構築することができるので、ちょっと試してみたかったこともあります。
構成
使用するコンテナ
下記の4つのコンテナを使用します。
- Rails
- MySQL
- Nginx ← New!!
- Datastore ← New!!
Datastoreというコンテナが出てきましたが、このコンテナで共通のファイルや保持しておきたいファイルを持たせておきます。
各Dockerfile
各項目に関してディレクトリを切ってDockerfileや関連ファイルを保存します。
こうすることで、各環境も管理しやすくなるかと思います。
1 2 3 4 5 | ├ docker ┬ datastore │ ├ mysql │ ├ nginx │ └ rails └ docker-compose.yml |
ソースコードを載せると長くなってしまうので、リンクで失礼します。
https://github.com/naoki85/docker_rails/tree/master/docker
docker-compose.yml
複数コンテナを扱うときには
docker-compose.yml
が便利ですね。
これで、
docker-compose up
コマンドでまとめて起動できます。
(ビルドするときには
docker-compose build
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | version: '2' services: datastore: build: context: . dockerfile: ./docker/datastore/Dockerfile server: build: context: . dockerfile: ./docker/nginx/Dockerfile ports: - 80:80 volumes_from: - datastore depends_on: - datastore web: build: context: . dockerfile: ./docker/rails/Dockerfile command: bundle exec unicorn -p 3000 -c /app/config/unicorn/development.rb ports: - 3000:3000 volumes: - .:/app volumes_from: - datastore depends_on: - db links: - db - db:database - db:mysql extends: file: ./docker/mysql/password.yml service: password db: build: context: . dockerfile: ./docker/mysql/Dockerfile ports: - 3306:3306 volumes_from: - datastore depends_on: - datastore extends: file: ./docker/mysql/password.yml service: password |
そこまで複雑なことはしておりませんが、Railsのコンテナでは
unicorn
コマンドで起動しております。
また、
service: password
を記述することで、後ほど
database.rb
にMySQLのパスワードを記述する際、
password
と記述すれば解釈してくれます。
(普通にパスワードを記述しても大丈夫ですが。)
Unicorn
アプリケーションサーバーにはUnicornを使用します。
既にUnicornがインストールされていれば、Railsプロジェクト内に
unicorn
ディレクトリがあるかと思いますので、新しく
development.rb
を作成します(もしくは既にある場合は修正)。
1 2 3 4 5 6 7 | worker_processes 8 pid "/var/run/unicorn.pid" listen "/share/unicorn.sock" stdout_path "./log/unicorn.stdout.log" stderr_path "./log/unicorn.stderr.log" |
database.rb
注意することは、
host
で指定するDBは、
docker-compose.yml
で指定した
service
名になります。
1 2 3 4 5 6 | development: <<: *default database: app_development username: root password: root host: db |
起動してみる
ここまでで、Docker環境を起動して、
http://localhost
にアクセスしてみます(またはNginxで指定したホスト)。
これで、今まで通りのプロジェクトが表示されていれば成功です。
今回は既存プロジェクトでやってみましたが、新規プロジェクトでも同様の設定ができるかと思います。
気になること
Docker起動直後にアクセスすると、Nginxのエラー画面が表示されることがあります。
ちょっと待って、再度アクセスすると問題なく表示されているので、Unicornのプロセスが起動していないのかな、と思います。
この辺りを含め、改善した箇所などがあれば、随時更新していきたいと思います。
さいごに
Docker良いですね。
私は最近PCを変えたのですが、プロジェクトの開発環境を整える際、Dockerさえインストールしてしまえば、すぐに開発環境を整えることができました。
(その点だけでいうと、Vagrantでもできるとは思いますが。。。)
MyCoachの方も継続してアップデートする予定なので、今後ともよろしくお願いします!