LoginSignup
21
20

More than 1 year has passed since last update.

Docker For Macが遅い:対策の実験(docker-sync)

Last updated at Posted at 2019-08-29

docker-facebook-1024x536-1-1024x536.png
前回のまとめた資料から実際テストしてみた内容をまとめてみました。(人^─^)

会社の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でみると20秒以上)です。特に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を同期&マウントしてないので、「初期のデータベースを更新」が比較的に早い(25分くらい)ですね。キタ━━(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画面を表示してみました。全体的に2秒くらいで画面が表示されました。♪(´ε` )

課題&疑問点

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

興味がある方はこちらへ
Laravel + Docker + 開発環境
Docker For Macが遅い:対策 - Mutagen編

21
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
20