Docker for Macのホスト、コンテナー間の同期が遅い問題をDocker標準機能で解決する


photo credit: maijou2501 Docker-4 via photopin (license)

弊サイトでは、Mac の WordPress 開発環境の構築にDocker For Mac | Dockerをオススメしています。弊サイトでも、Docker で作る最強・最速のローカル WordPress 環境で、Docker の基本的な操作方法から、WordMove による本番環境と開発環境の同期方法までご紹介していますが、Docker for Mac には 1 点問題がありました。それは、ホスト側(Mac)からコンテナー側にマウントしているボリュームの同期速度が遅い点。ホスト側のファイルを更新するだけで、コンテナー側のファイルを更新できるため非常に便利なのですが、Docker のファイルシステム(osxfs)の仕様上、ファイル更新からコンテナーへの反映までにラグがありました。

たとえば、ホスト側で CSS ファイルを編集し、編集した内容が正しく反映できているかどうかを確認するために、ブラウザを立ち上げてキャッシュを削除してリロードしても、更新が反映されるまではかなりのラグがありました。

docker cp <Container ID>:<src paath> <dest path>

ファイル更新の都度、コマンドを実行する、またはコンテナーの再起動を実施することで上記の問題は改善されるのですが、それではわざわざマウントしている意味がありません。しかし、ここ最近の Docker for Mac のアップデートにより同期速度が改善されました。今回、実機で使用している Docker のバージョンは以下の通りです。

Docker version 17.09.0-ce, build afdb6d4

ホストとコンテナーのボリュームの同期が遅い問題を解決する

Docker によるコンテナーの管理は、docker-composeが便利です。詳細については、たった 1 行で複数コンテナーを起動!Docker Compose で WordPress 環境をもっと楽に管理しよう!をご参照ください。

docker-compose.yml に追加するたった 1 つの単語

docker-composeによるコンテナーの管理を行うためには、あらかじめdocker-compose.ymlと呼ばれる YAML 形式のファイルを作成しておく必要があります。前述の WordPress 開発環境構築のためにご紹介した yml ファイルが以下の通りですが、今回はボリュームの同期速度を改善するためのオプションを追加しています。

# mysql
db:
  image: mysql
  container_name: db
  environment:
    MYSQL_ROOT_PASSWORD: pass
# wordpress
wordpress:
  image: ottan/wordpress
  container_name: wordpress
  links:
    - db:mysql
  ports:
    - "8080:80"
  volumes:
    - ~/Dropbox/vccw/www/wordpress/wp-content/themes:/var/www/html/wp-content/themes:cached

それが、volumes:オプションの最後に追加した:cachedです。このオプションを追加することで、同期速度が従来もかなり改善されます。たった、この 1 つのオプションを追加するだけで、前述のブラウザのリロードによる CSS ファイルの編集の反映を確認する程度であれば、気にならないくらいの同期速度になりました。

もし、Docker for Mac を使用してい、ホストとコンテナー間の同期の遅さの問題に苦しんでいる場合、docker-sync などのサードパーティ製ツールを使用しているが、Docker 標準機能だけで解決したい(余計なコンテナーを作成しリソースを消費したくない)という場合には、こちらの方法をお試しください。

comments powered by Disqus