Railsの環境を構築して勉強していましたが、ちょっと他のマシンでRails動かしたい、となったとき、いちいちそのマシンでrbenvからRailsをインストールするまでをやるのが面倒だったので、開発環境をDockerで構築することにしました。これで他のマシンで開発がしたくなっても、Dockerとdocker-composeさえ入っていれば、3つコマンド打つだけで開発環境が整えられるようになりました。Dockerイメージを探すDockerHubにて。MySQLのDockerイメージはすぐに見つけられます。https://hub.docker.com/r/mysql/mysql-serverRailsのDockerイメージもあるのかなぁと思って探したらdeprecatedでした。https://hub.docker.com/_/rails/RubyのDockerイメージをRails用にビルドして使ってねとの記載がありました。DockerfileでRubyのDockerイメージをRails用にビルドして、docker-composeでそのRails用にビルドしたRubyコンテナとMySQLコンテナを立ち上げて連携させることにします。Rails用のディレクトリを作成する適当な場所に。このディレクトリ内に以下の四つのファイルを作成します。RubyイメージをRails用にビルドするDockerfileRubyのバージョンが2.5.1のイメージを使用します。バージョン上げたければ使用するDockerイメージを変更するだけで良いのがいいですね。installを行わなくて済むようにするためです。https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#leverage-build-cacheDockerfileは上から下に処理されるため、キャッシュを効かせたい処理はなるべく上の方に書いた方がいいと理解しています。installを行うようDickerfileに書いておくと、Gemfileに変更がない場合はこの処理をスキップし、過去のDockerイメージをキャッシュとして流用します。installが走ってしまいます。apt-getは必ずキャッシュされます。--no-cacheとno-cacheオプションをつけることでキャッシュを無視して完全に新規にビルドすることができます。docker-compose.ymlRailsのコンテナとMySQLのコンテナを立ち上げるdocker-compose.ymlを作成します。Railsのコンテナは前述の通りRubyのDockerイメージからDockerfileでビルドしたものを使います。MySQLは配布されているイメージそのまま。.は、カレントディレクトリのDockerfileをもとにビルドを行う、という意味です。volumesでは、カレントディレクトリをコンテナの/myappにマウントしています。これが前述のカレントディレクトリに存在するDockerfileやdocker-compose.yml、Gemfile、Gemfile.lock、およびRailsアプリケーションに利用するファイル/ディレクトリをマウントする設定です。その次のmysql_data:というハッシュのキーでコンテナの/var/lib/mysqlにマウントを行う設定ですが、これは名前付きボリュームでMySQLのデータを永続化する設定です。ホスト側のパスを意識する必要がなければ名前付きボリュームが便利です。コンテナを壊した後も他のコンテナからマウントできます。GemfileRailsを利用するため、使用したいRailsバージョンのみ書いておきます。installでそれに依存するGem達が自動的に追記されます。installで勝手に作成されるので空ファイルでいいですが、ファイル自体は作成しておきます。Linuxでやっているため都合ルートユーザですが、別にその必要はないです。execでラップし、--skip-bundleオプションをつけます。Gemfileを上書きするが良いか聞かれるのが面倒なので、--forceオプションもつけます。--skip-bundle123終わると、Railsアプリケーションに必要なファイル/ディレクトリがコンテナによってホスト側のカレントディレクトリに作成されているのがわかります。vendor1234GemfileやGemfile.lockもこのタイミングで書き換えられています。通常のRailsと一緒です。config/database.ymlにMySQLのホスト名とパスワードを記載します。ホスト名はdocker-compose.ymlのservicesでMySQLコンテナに付けた名前です。docker-composeで立てるコンテナは、同時に建てられた他のコンテナの名前をhostsファイルに自動的に指定してくれます。passwordはdocker-compose.ymlで指定したやつです。db:create1ブラウザから起動確認しておわり。おわりに環境を構築して満足しておわっていてはいけない。なんか作って勉強します。