Docker for Macが遅いのでcoreos-vagrantを利用

Tag:

「Docker for Mac」は、ファイルIOが遅いという問題があります。そこで、問題解消されるまで、Vagrantを利用することにしました。

関連issueと対処方法

issue

ファイルIOが遅い問題について、下記issueで取り上げられてます。
https://github.com/docker/for-mac/issues/77
https://github.com/docker/for-mac/issues/1592

対処方法

いくつか対処方法があるようです。

1. docker-syncを使う
https://github.com/EugenMayer/docker-sync
仕組みがいまいちわからなかったので試してないです。

2. cachedオプションを使う
docker-composeの場合、以下だけで良さそう。

 volumes:
        - "{local directory}:{docker directory}:cached"

上記設定でビルドし直したのですが、まだ遅い、、、。もう少し改善されないかな。

参考) https://github.com/docker/for-mac/issues/77#issuecomment-292277623

3. vagarnt + nfsマウント + docker
「Docker for Mac」の改善を待つこととして、今回はこれで対処します。
(vagrantとは、なかなか縁がきれないw)

vagarnt + nfsマウント + docker環境の作成

Vagrantfileには、CoreOS Vagrantを利用します。Docker実行に最低限必要なLinuxイメージとなっているようです。

フォルダ構成として、以下のようになるよう作成していきます。
(ここでは、coreos-vagrantとlaradockを動かすとこまで確認します。)

projects/
 │
 ├── coreos-vagrant/  
 │   (仮想マシン内でホストマシンの ../ とnfsマウントでフォルダ共有するようにVagrantfileを設定)
 │
 ├── laradock/        
 │   (コンテナ内で仮想マシンの ../ とフォルダ共有するようにdocker-compose.ymlを設定)
 │
 ├── projectA/
 │
 └── projectB/

仮想マシン立ち上げ

ホストマシン上でcoreos-vagrantリポジトリをクローンします。

$mkdir projects
$cd projects/
$git clone https://github.com/coreos/coreos-vagrant.git
Cloning into 'coreos-vagrant'...
remote: Counting objects: 461, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 461 (delta 2), reused 8 (delta 2), pack-reused 450
Receiving objects: 100% (461/461), 118.25 KiB | 0 bytes/s, done.
Resolving deltas: 100% (205/205), done.

Vagrantfileを編集します。

$cd coreos-vagrant/
$cp Vagrantfile Vagrantfile_org
$vi Vagrantfile

ここでは、以下のように変更しました。:nfs => trueとなってますね。

$diff Vagrantfile Vagrantfile_org 
31c31
< $vm_memory = 2048
---
> $vm_memory = 1024
140c140
<       config.vm.network :private_network, ip: "172.17.8.101"
---
>       config.vm.network :private_network, ip: ip
145c145
<       config.vm.synced_folder "../", "/home/core/share", id: "core", :nfs => true, :mount_options => ['nolock,vers=3,udp']
---
>       #config.vm.synced_folder ".", "/home/core/share", id: "core", :nfs => true, :mount_options => ['nolock,vers=3,udp']

仮想マシンを立ち上げます。

$vagrant up

nfsマウントでホストマシンの/etc/exportsに書き込みが必要なため、パスワード入力が求められます。

nfsマウントに失敗する場合

もし、nfsマウントで失敗した場合、以下のことを確認してみてください。

ホストマシンでnfsdが稼働しているか確認
enabledになっているか確認します。

$sudo nfsd status
Password:
nfsd service is enabled
nfsd is running (pid 2898, 8 threads)
IPが一致していることを確認
ホストマシンで許可したIPと仮想マシンで設定されたIPが一致することを確認します。

まずは、ホストマシンで確認。

$cat /etc/exports
# VAGRANT-BEGIN: 502 aa478b93-b8ff-46f6-a763-13420f89c73b
"/projects" 172.17.8.101 -alldirs -mapall=502:20
# VAGRANT-END: 502 aa478b93-b8ff-46f6-a763-13420f89c73b

次に仮想マシンで確認。

$vagrant ssh
Last login: Sat Jul 22 15:20:32 UTC 2017 from 10.0.2.2 on pts/0
Container Linux by CoreOS alpha (1478.0.0)
core@core-01 ~ $ ifconfig|grep -A 2 eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.8.101  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::a00:27ff:feaa:7276  prefixlen 64  scopeid 0x20<link>
core@core-01 ~ $ 

docker-composeをインストール

仮想マシンにログインします。

$vagrant ssh
Last login: Sat Jul 22 15:21:18 UTC 2017 from 10.0.2.2 on pts/0
Container Linux by CoreOS alpha (1478.0.0)
core@core-01 ~ $ 

dockerはすでにインストールされてます。

core@core-01 ~ $ docker version
Client:
 Version:      17.05.0-ce
 API version:  1.29
 Go version:   go1.7.6
 Git commit:   89658be
 Built:        Wed Jul 19 00:29:07 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.05.0-ce
 API version:  1.29 (minimum version 1.12)
 Go version:   go1.7.6
 Git commit:   89658be
 Built:        Wed Jul 19 00:29:07 2017
 OS/Arch:      linux/amd64
 Experimental: false
core@core-01 ~ $ 

docker-composeはインストールされてないので、インストールします。

core@core-01 ~ $ sudo -i
core-01 ~ # mkdir -p /opt/bin
core-01 ~ # curl -L https://github.com/docker/compose/releases/download/1.13.0/docker-compose-`uname -s`-`uname -m` > /opt/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   617    0   617    0     0    944      0 --:--:-- --:--:-- --:--:--   944
100 8079k  100 8079k    0     0  1190k      0  0:00:06  0:00:06 --:--:-- 1642k

バージョンはhttps://github.com/docker/compose/releasesで確認してください。

権限付与してログアウトします。

core-01 ~ # chmod +x /opt/bin/docker-compose
core-01 ~ # logout

laradockをダウンロード

試しにコンテナを立ち上げたいので、個人的によく利用するlaradockをダウンロードします。

Vagrantfileで設定した共有フォルダに移動後、laradockリポジトリをクローンします。

core@core-01 ~ $ cd /home/core/share                
core@core-01 ~/share $ git clone https://github.com/LaraDock/laradock.git
Cloning into 'laradock'...
remote: Counting objects: 5403, done.
remote: Total 5403 (delta 0), reused 0 (delta 0), pack-reused 5403
Receiving objects: 100% (5403/5403), 5.66 MiB | 1.55 MiB/s, done.
Resolving deltas: 100% (2786/2786), done.
core@core-01 ~/share $ 

設定も編集しておきます。

core@core-01 ~/share $ cd laradock/
core@core-01 ~/share/laradock $ cp env-example .env
core@core-01 ~/share/laradock $ vi .env
core@core-01 ~/share/laradock $ diff .env env-example 
278c278
< DOCKER_HOST_IP=192.168.11.10
---
> DOCKER_HOST_IP=10.0.75.1

DOCKER_HOST_IPは、xdebugで利用する設定値なので、仮想マシンのIPではなく、ホストマシンのIP(MacのIP)を設定してます。

laradockでは、「.env」の「APPLICATION」で共有フォルダを指定できます。ここでは、以下デフォルトのままとします。

core@core-01 ~/share/laradock $ cat .env | grep APPLICATION
APPLICATION=../

コンテナ立ち上げ

core@core-01 ~/share/laradock $ docker-compose up -d nginx mysql

コンテナ状況確認

稼働中コンテナを確認

リソース使用状況を確認

docker container stats $(docker container ls --format={{.Names}})


メモリのLIMITは1.958GiBになってます。Vagrantfileにて仮想マシンで利用できるメモリを2GBにしているためですね。

ネットワークを確認

起動したコンテナで提供するサービスのポートもLISTEN状態です。

作業開始手順

コンテナを起動して、workspaceで作業するまでの手順です。

$vagrant up
$vagrant ssh
Last login: Sat Jul 22 16:33:48 UTC 2017 from 10.0.2.2 on ssh
Container Linux by CoreOS alpha (1478.0.0)
core@core-01 ~ $ cd ~/share/laradock/
core@core-01 ~/share/laradock $ docker-compose up -d nginx mysql
core@core-01 ~/share/laradock $ docker-compose exec workspace bash
root@05340082f3a2:/var/www# ls
coreos-vagrant  laradock

スポンサーリンク