Docker For Macが遅い：対策の実験（docker-sync）

![docker-facebook-1024x536-1-1024x536.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489182/bfe1f4c5-8394-67d4-06ff-85a7aec9285e.png)
[前回](https://qiita.com/FattyRabbit/items/b81575ed9d2f463fa619)のまとめた資料から実際テストしてみた内容をまとめてみました。(人^─^)

会社のLaravelプロジェクトのdockerの開発環境で試してました。

## 問題になりそうなところ
先ずdocker-compose.ymlを分析して同期する対象を決めてみました。

```docker-composer.yml
version: '2'
services:
  mysqldata: <- *1
    image: busybox
    volumes:
      - ./docker/mysql/storage:/var/lib/mysql
  mysql:
    build: ./docker/mysql
    volumes_from:
      - mysqldata <- *1
    ports:
      - ${DOCKER_NUM}4306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=app_db
  php:
    container_name: web_php
    build: ./docker/php
    ports:
      - ${DOCKER_NUM}8888:80
      - ${DOCKER_NUM}443:443
    volumes:
      - .:/var/www/html <- *2
    links:
      - mysql
  smtp:
    image: phpdockerio/mailhog:latest
    ports:
      - ${DOCKER_NUM}1025:1025
      - ${DOCKER_NUM}8025:8025
```
***「＊1」 : DBA***

- DBのファイルをDocker化する場合はvolumesが適切かと思います。SyncするとDatabaseファイルの構成上、大変なことになると思います。

- Docker for Macの場合はvolumesが遅いのでMacに直接にインストールしてDockerから接続するか、Docker化するがvolumnsはしない（DB内容はDBAに接続してみるかDockerの中に入ってみる）と思います。

***「＊2 」: 今回はこれだけdocker-syncの対象にしてみいます。***

## 現在の速度  
Top画面を表示してみました。全体的に遅い（google developer toolsでみると２０秒以上）です。特にHtml（DB関連かな）が遅いですね。Σ(´Д｀)ﾊｯ!!

100Mのファイルを作成します。Docker内部で実行します。

```
# time dd if=/dev/zero of=speedtest bs=1024 count=102400
102400+0 records in
102400+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 86.2196 s, 1.2 MB/s

real    1m26.162s
user    0m1.110s
sys     0m8.190s
```
ｳﾋｬ━━ヽ(ﾟДﾟ)ﾉ━━!!

では、docker-syncを利用して同期してみましょう。

## 同期するように変更  
先ず、docker-syncをインストール

```
# gem install docker-sync
Fetching: thor-0.20.3.gem (100%)
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.
```
つ〜〜 ( ´з｀)･∵.ﾌﾞｯ

```
# sudo gem install docker-sync
```
次は監視するための物ですが、今回は使ってません。

```
# brew install fswatch
```
自分のPCはrsyncがインストールされているので、省略します。(´∀｀*)ｳﾌﾌ

実際、テストしてみると大きく同期なのでファイルの権限的な部分の問題が多かったので他のファイルも一部修正しました。

```docker-sync.yml
version: '2'

syncs:
  document-root:
    sync_strategy: rsync
    notify_terminal: true
    sync_host_ip: 'auto'
    sync_host_port: 10872
    sync_excludes: [ '.git', '.idea', 'vendor', 'docker', '*.yml' ]
    sync_args: '-v'
    src: ./
    sync_userid: '33'
```
「sync_userid」についてはContainerのユーザー番号です。

```docker-composer.yml
version: '2'
services:
  mysqldata:
    image: busybox
  mysql:
    build: ./docker/mysql
    ports:
      - ${DOCKER_NUM}4306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=app_db
  php:
    container_name: web_php
    build: ./docker/php
    ports:
      - ${DOCKER_NUM}8888:80
      - ${DOCKER_NUM}443:443
    environment:
      - APACHE_RUN_USER=www-data
      - APACHE_RUN_GROUP=www-data
    volumes:
      - document-root:/var/www/html
    links:
      - mysql
  smtp:
    image: phpdockerio/mailhog:latest
    ports:
      - ${DOCKER_NUM}1025:1025
      - ${DOCKER_NUM}8025:8025
volumes:
  document-root:
    external: true
```
## 修正後の速度  
DBを同期＆マウントしてないので、「初期のデータベースを更新」が比較的に早い（２５分くらい）ですね。ｷﾀ━━(pﾟ∀ﾟq)━━!!

では、100Mのファイルを作成します。

```
# time dd if=/dev/zero of=speedtest bs=1024 count=102400
# time dd if=/dev/zero of=speedtest bs=1024 count=102400
102400+0 records in
102400+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 1.41639 s, 74.0 MB/s

real    0m1.432s
user    0m0.140s
sys     0m1.240s
```
同じくTop画面を表示してみました。全体的に２秒くらいで画面が表示されました。♪(´ε｀ )

## 課題＆疑問点  
- ログファイルやコンテイナーのファイルを見るのが面倒で、速度に問題がないまま共有する方法が必要かと思います。
- 結局DBの問題ではないのか？DB以外はマウント（volumes）を利用しても使えるのではないか？ 検証しないとわかりません。(;´ｖ_ｖ)ゞ
- 次回は「CE 17.12 (edge) 」を試してみましょう！！ -> ***初期状態の「docker-composer.yml」で試してみました。結果としては４・５秒くらいでTop画面が表示されました（DBの使用頻度にもよると思います）。テストはできるレベルですね。***

> 興味がある方はこちらへ
> [Laravel + Docker + 開発環境](https://fatty-rabbit.hatenablog.com/entry/2020/01/30/000000)
> [Docker For Macが遅い：対策 - Mutagen編](https://fatty-rabbit.hatenablog.com/entry/2021/04/21/194920)