Docker for WindowsでRailsチュートリアルを行った作業ログ
MacBook ProのBootcampで仮想化がオフ
再起動してMacに入り「起動ディスク」画面を開いてBOOTCAMPのHDDを選択して再起動する。
『仮想ハード ディスクがある記憶域は、仮想ハード ディスクの共有をサポートしていません。』というエラー
『仮想ハード ディスクがある記憶域は、仮想ハード ディスクの共有をサポートしていません。』というエラーが出て
Hyper-VマネージャーでもDocker for Windowsでも上手く進まなかった。
Docker for Windowsをいったん削除して、
『Windowsの機能』からHyper-Vを無効にして再起動後に再度Hyper-Vを有効にして
Docker for Windowsを再インストールするとエラーが出なくなった。
Windowsのボリュームをマウントできない
設定画面にてShared DrivesのCをチェックしてパスワード入れたが動かない。
Docker for WindowsのStable版を入れていたので、Beta版のmsiを落としてアップデートするとマウントできるようになった。
docker公式のQuickstart: Docker Compose and Railsをやってみる
https://docs.docker.com/compose/rails/ の手順通りに進めてみる。
途中、現時点の Docker for Windows の docker-compose では、docker-compose run ...を実行することができないため、rails newすることができない。
C:\Users\diffshare\docker\rails>docker-compose --version docker-compose version 1.8.0, build d988a55 C:\Users\diffshare\docker\rails>docker-compose run web rails new . --force --database=postgresql --skip-bundle ERROR: Interactive mode is not yet supported on Windows. Please pass the -d flag when using `docker-compose run`.
docker-compose run -d ...という形では実行できるが、標準出力を見ることができないため面倒である。
幸いなことに docker run ... は動作をするので、そちらを用いて解決を行える。
C:\Users\diffshare\docker\rails>docker images REPOSITORY TAG IMAGE ID CREATED SIZE rails_web latest 5a76ef9eaa8d 27 minutes ago 865.2 MB
前述のURLのとおり、docker-compose buildを行っていると、ディレクトリ名+サービス名(ここではrails_web)でイメージが作成されているので、
そのイメージを用いてrails newする。
C:\Users\diffshare\docker\rails>docker run --rm -v %cd%:/myapp rails_web rails new . --force --database=postgresql --skip-bundle exist create README.md create Rakefile create config.ru create .gitignore force Gemfile create app create app/assets/config/manifest.js create app/assets/javascripts/application.js create app/assets/javascripts/cable.js create app/assets/stylesheets/application.css create app/channels/application_cable/channel.rb create app/channels/application_cable/connection.rb create app/controllers/application_controller.rb create app/helpers/application_helper.rb create app/jobs/application_job.rb create app/mailers/application_mailer.rb create app/models/application_record.rb create app/views/layouts/application.html.erb create app/views/layouts/mailer.html.erb create app/views/layouts/mailer.text.erb create app/assets/images/.keep create app/assets/javascripts/channels create app/assets/javascripts/channels/.keep create app/controllers/concerns/.keep create app/models/concerns/.keep create bin create bin/bundle create bin/rails create bin/rake create bin/setup create bin/update create config create config/routes.rb create config/application.rb create config/environment.rb create config/secrets.yml create config/cable.yml create config/puma.rb create config/spring.rb create config/environments create config/environments/development.rb create config/environments/production.rb create config/environments/test.rb create config/initializers create config/initializers/application_controller_renderer.rb create config/initializers/assets.rb create config/initializers/backtrace_silencers.rb create config/initializers/cookies_serializer.rb create config/initializers/cors.rb create config/initializers/filter_parameter_logging.rb create config/initializers/inflections.rb create config/initializers/mime_types.rb create config/initializers/new_framework_defaults.rb create config/initializers/session_store.rb create config/initializers/wrap_parameters.rb create config/locales create config/locales/en.yml create config/boot.rb create config/database.yml create db create db/seeds.rb create lib create lib/tasks create lib/tasks/.keep create lib/assets create lib/assets/.keep create log create log/.keep create public create public/404.html create public/422.html create public/500.html create public/apple-touch-icon-precomposed.png create public/apple-touch-icon.png create public/favicon.ico create public/robots.txt create test/fixtures create test/fixtures/.keep create test/fixtures/files create test/fixtures/files/.keep create test/controllers create test/controllers/.keep create test/mailers create test/mailers/.keep create test/models create test/models/.keep create test/helpers create test/helpers/.keep create test/integration create test/integration/.keep create test/test_helper.rb create tmp create tmp/.keep create tmp/cache create tmp/cache/assets create vendor/assets/javascripts create vendor/assets/javascripts/.keep create vendor/assets/stylesheets create vendor/assets/stylesheets/.keep remove config/initializers/cors.rb
そのまま作業を続けていくと、
$ docker-compose run web rake db:create
の部分が実行できない。docker run で実行する場合、コンテナをリンクする必要がある。
docker-compose buildおよびdocker-compose up -d後に次のコマンドでリンクするための調査を行う。
C:\Users\diffshare\docker\rails>docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0fe39974801f rails_web "bundle exec rails s " 4 seconds ago Up 2 seconds 0.0.0.0:3000->3000/tcp rails_web_1 85dddc1e2f8d mysql "docker-entrypoint.sh" 46 minutes ago Up 3 minutes 3306/tcp rails_db_1 C:\Users\diffshare\docker\rails>docker network ls NETWORK ID NAME DRIVER SCOPE f894b76071b8 bridge bridge local 287217ca2bdd docker_default bridge local c30e18497d80 host host local c017f8146f82 none null local 4e65602bd863 rails_default bridge local
まず、docker psでrails_webの名前を調べる。ここではrails_web_1となっている。
次にdocker networkでコンテナが所属するネットワークを調べる。ここではrails_defaultとなっている。
C:\Users\diffshare\docker\rails>docker run --rm -ti -v %cd%:/myapp --link rails_db_1:db --net rails_default rails_web bash root@128cbb9d3ce1:/myapp# ping db PING db (172.19.0.2): 56 data bytes 64 bytes from 172.19.0.2: icmp_seq=0 ttl=64 time=0.076 ms 64 bytes from 172.19.0.2: icmp_seq=1 ttl=64 time=0.101 ms ^C--- db ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.076/0.088/0.101/0.000 ms root@128cbb9d3ce1:/myapp# root@128cbb9d3ce1:/myapp# rake db:create Created database 'myapp_development' Created database 'myapp_test'
最初に db エイリアスへの通信が行えるかどうかを確認し、その後、rake db:create を行う。
データベースの構築ができたので、localhost:3000にブラウザからアクセスすれば見えるはずである。
docker run使わずに素直にdocker-compose run -dした方がいいのかもしれない。
Docker公式のrails構築法では、Gemfileを更新するごとにdocker-compose buildを実行する必要があり、bundle installに時間がかかる。
bundle関係は別コンテナとしてリンクする方法をとるのが良いらしい。