今回の目的
既存のRuby on Railsアプリケーションをローカルマシン(基本Mac)上の複数Docker Hostで動かす
※Railsアプリケーションを複数立ち上げるという意味ではなく、Railsアプリケーションを含む複数の開発環境を持ちたいケースになります
基本構成
複数コンテナ構成
- rails app (ruby image base)
Based on docker library But this is deprecated at 5/15/2017 - database (mysql image base)
- KVS (redis or memcache image base)
それぞれを別コンテナとして立ち上げ、連携させる。
= Docker Composeを使用
詳細
docker-compose.yml
, Dockerfile
等は以下Githubに。
Github hihats/rails-on-docker
基本的には上記リポジトリのREADMEに書いてあるとおりの手順ですが、rails newでイチから作成する段階で動作するかは試しておりません。
あくまでこのリポジトリに「既存のRailsアプリケーションのリポジトリ」をマージさせた上で、docker-machine create
からdocker-compose up -d
までの確認のみ。
ちなみにMac && DockerToolboxでの動作確認のみです(理由は後述)
Docker for Mac対応
軽くDocker for Macについて説明
インストールだけでビルドできる
Docker用の軽量仮想環境HyperKitを使用して構築できる。
つまりDocker for Macを起動しているだけで、最初からいきなり、docker-compose build
で各コンテナのビルド可能。
具体的には、dockerコマンドが常に/var/tmp/docker.sock
を通してUnixドメインソケット通信するようになっている。Socket APIでDocker Engineを操作可能なため、直接MacからAPI叩いてdockerを動かしているような感覚です。
ところが
そうなると、ソケットが単一になるのでインターフェースも単一に限られてしまう?(実際、Dockerホストの指定方法はlocalhostのみっぽい)
これでは基本的に複数のマイクロサービスを並行で動かして独立して開発する自分の作業フローには合わなくなりそう。
However, if you want to create multiple local machines, you need Docker Machine, which is still available to create and manage machines for power users or multi-node experimentation.
https://docs.docker.com/machine/get-started/#prerequisite-information
やはり雲行きが。。
複数立ち上げるなら未だ docker machineが必要。
Currently, there is no docker-machine create driver for HyperKit, so you will use virtualbox driver to create local machines. (See the Docker Machine driver for Oracle VirtualBox.) Note that you can run both HyperKit and Oracle VirtualBox on the same system.
https://docs.docker.com/machine/get-started/#prerequisite-information
せっかくのHyperkitも docker machine用のドライバがまだない。
Currently
なので、今後に期待か。
つまり複数環境で使う場合(Railsに限らず)
従来通り、docker-machine create --driver virtualbox ***
で作成するしかない。(2017/4時点)
今後、Docker MachineでHyperkitを指定できるようになるか、Docker for Macが複数ホスト保持可能になるか、気長に待ちましょう。
幸い、Docker for MacにもDocker Machineは入っているので特に何もせず、これまで通り使えます。
手軽に「ひとつRailsアプリをDockerで使ってみたい」という場合にはHyperKitでよいと思います。docker system系のコマンドが使えるようになっただけでもDocker for Mac超超便利だす。
実用にあわせてより拡張する
npmなどのパッケージ群や、DBのデータそのものをVolumeとする別コンテナをたてたほうが、定期的に同期するケースなどで理に適っています。
参考
今回はとりあえず、開発着手しているRailsをDockerで動かしてみたい場合のソースコードとなっております。