Help us understand the problem. What is going on with this article?

Vagrantを使う「Mac最速のDocker環境」を初心者向けに解説【遅いMac for Dockerを卒業】

下記の記事を参考にVB上にDocker環境を構築してみたのですが、いくつか調べて対応しなければいけなく、初心者にとってはとっつきにくいかと思いました。

参考: DXを大幅に低下させるDocker for Macを捨ててMac最速のDocker環境を手に入れる

初心者向けで細かくコマンドを解説していきたいと思います。

2020年4月2日追記: docker-composeのInstallをプラグインに変更しました。

2020年5月6日追記: mutagenのセッションリセット方法を追記しました。

はじめに

前提

  • Homebrew導入済み
  • Dockerの使い方がわかる

対象者

  • Mac for Dockerを使っている人
  • Docker上で開発をしていて、重いなって感じてる人

大まかな流れ

  1. VirtualBoxをインストール
  2. Vagrantをインストール
  3. Vagrantの設定ファイル作成
  4. Mutagenのインストール・セットアップ
  5. VagrantにSSH接続してDocker起動

導入方法

VirtualBoxをインストール

VirtualBoxをbrew caskを使ってインストールします。

brew cask install virtualbox

インストール開始時にパスワード入力を求められるので、パスワードの入力をします。

Vagrantをインストール

Vagrantをインストールします。

brew cask install vagrant

パスワード入力を求められるのでパスワードの入力をします。

Vagrant Boxをダウンロード

続いては、ボックスを追加します。(ダウンロードされるので時間がかかります)

ボックスがいわゆるOSの部分になります。ダウンロードに結構時間がかかります。

vagrant box add ubuntu/xenial64

ダウンロードが完了したらvagrant box listで確認します。

vagrant box list
ubuntu/xenial64 (virtualbox, 20200229.0.0)

Vagrant Pluginをインストール

必要となるVagrant Pluginをインストールします。

vagrant plugin install vagrant-disksize vagrant-hostsupdater vagrant-mutagen vagrant-docker-compose

Vagrantのセットアップ

開発ディレクトリに移動します。

cd ~/my_app

vagrant initで環境ファイルを作成します。

~/my_app
vagrant init ubuntu/xenial64

作成されたVagrantfileを編集していきます。

中身を下記の内容に書き換えてください。

~/my_app/Vagrantfile
Vagrant.configure('2') do |config|
  config.vm.box = 'ubuntu/xenial64'

  config.vm.hostname = 'my-app'

  config.vm.network :private_network, ip: '192.168.50.10'

  config.vm.provider :virtualbox do |vb|
    vb.gui = false
    vb.cpus = 4
    vb.memory = 4096
    vb.customize ['modifyvm', :id, '--natdnsproxy1', 'off']
    vb.customize ['modifyvm', :id, '--natdnshostresolver1', 'off']
  end

  config.disksize.size = '30GB'
  config.mutagen.orchestrate = true

  config.vm.synced_folder './', '/home/vagrant/app', type: "rsync",
    rsync_auto: true,
    rsync__exclude: ['.git/', 'node_modules/', 'log/', 'tmp/']

  config.vm.provision :docker, run: 'always'
  config.vm.provision :docker_compose
end

必要に応じて調整してください。
ご自身のスペック以上を設定するとフリーズするようです。

config.vm.hostname = 'my-app' 任意のホストネーム
vb.cpus = 4 CPUコア数
vb.memory = 4096 メモリサイズ
config.disksize.size = '30GB' ディスクサイズ

Mutagenのインストール・セットアップ

続いて、ファイル同期ソフトのMutagenをインストールします。

brew install mutagen-io/mutagen/mutagen

その後、Vagrantfileと同じ階層にmutagen.yml作成します。

~/my_app
touch mutagen.yml
vim mutagen.yml
~/my_app/mutagen.yml
sync:
  app:
    mode: "two-way-resolved"
    alpha: "./"
    beta: "my-app:/home/vagrant/app"
    ignore:
      vcs: true
      paths:
        - "/node_modules"
        - "/log"
        - "/tmp"

beta: "my-app:/home/vagrant/app"my-app
Vagrantfileで設定したhostnameと一致させてください。

Vagrantを起動

Vagrantを起動します。

~/my_app
vagrant up

VirtualBoxを初めて入れた方は、このタイミングで「セキュリティとプライバシー」で弾かれるので、下記記事を参考にダウンロードしたアプリケーションの許可を許可して、再度vagrant upします。

インターネットからダウンロードしたアプリの実行許可

初回起動時はDockerとDocker Composeがインストールされるので時間がかかります。

sshのconfigファイルを作成していないと、このタイミングでエラーが出るようです。

下記の記事にて対処法を解説くださったので、エラーの方は参考にしてみてください。

`initialize': No such file or directory エラーの対処法

仮想環境にSSH接続

vagrant upが完了したらSSH接続します。

~/my_app
vagrant ssh

Welcome to Ubuntu 16.04.6 LTSと出ていたらSSH接続完了です。

~/my_app
vagrant ssh
vagrant
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-174-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

 * Latest Kubernetes 1.18 beta is now available for your laptop, NUC, cloud
   instance or Raspberry Pi, with automatic updates to the final GA release.

     sudo snap install microk8s --channel=1.18/beta --classic

 * Multipass 1.1 adds proxy support for developers behind enterprise
   firewalls. Rapid prototyping for cloud operations just got easier.

     https://multipass.run/

1 package can be updated.
1 update is a security update.

New release '18.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

アプリケーションディレクトリに移動してdocker-composeを起動してみましょう!

~/
cd app
docker-compose up

立ち上がったアプリケーションにはVagrantfileで指定したIPアドレスでアクセスできます。

http://192.168.50.10:3000/

それでは快適Dockerライフをお楽しみください!

Vagrantの終了方法

vagrant haltにてVMを終了します。

~/my_app
vagrant halt

vagrant statusにて終了できたか確認できます。

poweroffになっていれば終了しています。
runningになっていればvagrant haltにて終了してください。

~/my_app
vagrant status
=> Current machine states:

default        poweroff (virtualbox)

vagrant haltを行わずにVMを終了した場合にはセッションが削除されずに残ってしまうという問題があるそうです。

そのまま再度起動すると、mutagenが多重にセッションを貼りバグの原因になるそうなので、mutagen sync listで不要なセッションがないか確認してください。

~/my_app
 mutagen sync list
=>
--------------------------
No sessions found
--------------------------

もしNo sessions foundではなく、セッションが表示される場合はデーモンを再起動するとセッションがリセットされます。

mutagen daemon stop
mutagen daemon start

再度mutagen sync listを行いセッションがなくなっているか確認してください。

結果

rails consoleの初回起動が42秒短縮されました。
Docker for Mac: 46秒
VM on Docker: 4秒

time rails c
=> Loading development environment (Rails 5.2.4.1)
# Docker for Mac
real   46.693s
# VirtualBox + Docker
real    4.458s
time rubocop
=> Inspecting 92 files
# Docker for Mac
real   58.52s
# VirtualBox + Docker
real    5.54s
time rspec
=> 54 examples, 0 failures
# Docker for Mac
real   12.28s
# VirtualBox + Docker
real    5.91s

Dockerの初回起動も早くなり、軽快に開発が進められるようになりました!

まとめ

VirtualBoxやVagrantを初めて触ったので仮想環境について勉強になりました。

私自身はDockerでの開発を始めたばかりで、そもそもDocker for Mac以外を使ったことがなかったので、そういうもんだとばかり思っていました。

参考にさせて頂いた記事を見つけ、実際に試してみてとてもよかったです。

とてもためになったので、なぜVM環境に載せたのか、など下記記事をチェックしてみてください!

参考: DXを大幅に低下させるDocker for Macを捨ててMac最速のDocker環境を手に入れる

necocoa
普段はRailsを書いています。
https://www.wantedly.com/users/129323538
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした