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

Docker For Macが遅い:対策の実験

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 + 開発環境

FattyRabbit
韓国から1999年日本にきて色んなプロジェクトに参加しております。アンドロイドの画像編集・本作成プロジェクトで開発レーダー・メインエンジニアとして仕事して個人的にもアプリを開発・公開しています、仕事のほとんどウェブプロジェックトです。 Java、PHP、Spring Boot、Struts、Laravel、Google、Twitter、Facebook、Api
https://fatty-rabbit.tistory.com/
wiz_inc
Wizは、最新のIoTやICTサービスをお客様に届ける「ITの総合商社」です
http://012grp.co.jp/
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
ユーザーは見つかりませんでした