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関係は別コンテナとしてリンクする方法をとるのが良いらしい。