Docker for Mac遅すぎる問題の解決

こんにちは、イタンジの福崎です。 Docker for Macですがプロジェクトが大きくなるのに比例して重くなっていき、我慢できなくなりました。 docker syncを試したりもしたんですが安定しないので、もうMacからLinuxに変更しようかと思ったりもしましたがVagrant使うことで解決しました。 以下はその内容の共有です。

やりたいこと

  • MacVagrant入れる
  • MacVagrant間でフォルダを共有
  • コーディングは今まで通りMacで行い、Dockerの実行はVagrantで行う

環境構築手順

$ mkdir vagrant
$ cd vagrant
$ vagrant init bento/ubuntu-19.04
  • Vagrantfileにdockerのprovisionとフォルダの共有設定を追記
# Vagrantfile

Vagrant.configure("2") do |config|
  + config.vm.synced_folder "/Users/user/Work", "/home/vagrant/work",create:"true"
  + config.vm.provision "docker"
  # forwardしたいportをお好みで、rails使ってるので3000をforward
  + config.vm.network "forwarded_port", guest: 3000, host: 3000
end


$ vagrant provision
  • 後はdocker-compose入れてdocker起動したいプロジェクトに移動してdocker-compose up
$ vagrant up

## vagrantにつなぐ
$ vagrant ssh

## vagrant上でdocker-composeのinstall
$ sudo apt install docker-compose

## 後は起動したいプロジェクトに移動してdocker-compose up
$ cd  work/project
$ docker-compose up

あとがき

これでWork以下のソースをMac上で修正して、Vagrantのdocker上で動作確認できる環境ができました。 Vagrantを起動するという手間は増えますが一瞬で起動するのでそんなに苦にならないと思います。 動作は感動するくらい早くなりました、もっと早くからやっとけばよかった。 Docker for Mac使ってて重いなと感じてる方は是非お試しください。

参考

Docker for MacをやめてVM(Ubuntu 16.04)の中でDockerを動かして開発する - こんちゃんブログ

はまったとこ

こんな感じでmysqlのデータをvolumesでprojectの下に突っ込んでいた影響で、permission errorになりました。

# docker-compose.yml

db:
    image: mysql:5.7
    volumes:
      - ./docker/db:/var/lib/mysql
      - ./docker/sql:/sqlscripts

db/mysql以下は systemd-coredump で作成されるようなのでsynced_folderで以下を追加

# Vagrantfile

Vagrant.configure("2") do |config|
  + config.vm.synced_folder "/Users/user/Work/project/docker/db", "/home/vagrant/work/project/docker/db", owner: 'systemd-coredump', group: 'systemd-coredump'
end

変更してもこんな感じのエラーが出ます

[ERROR] InnoDB: Operating system error number 95 in a file operation.
[ERROR] InnoDB: Error number 95 means 'Operation not supported'
[ERROR] InnoDB: File ./ib_logfile0: 'Linux aio' returned OS error 195. Cannot continue operation
[ERROR] InnoDB: Cannot continue operation.

これはcommandに innodb-use-native-aio を指定するといけました

# docker-compose.yml
  db:
    command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci --innodb-use-native-aio=0