18
Help us understand the problem. What are the problem?
Organization

Docker Desktop for Mac の遅い問題を解決 2022

Docker for Mac が遅い! docker-sync や、 docker on Vagrant や、cached オプション、delegated オプションなどなど、いろんな解決策が紹介されましたが、それでもフレームワークなどを使っていると遅い、、、

というわけで Docker Desktop for Macの遅い問題を解決する、2022版バージョンをお届けします。

マウント先がドキュメントルートだから遅い

よくローカルのファイルをコンテナ内から参照するためのマウント先をドキュメントルート、要するに、 /var/html/html に設定する例を多く見ますが、これが問題の根源となっている。

ドキュメントルートをマウントせずにファイルを設置すると普通に早い。

ドキュメントルート以外にマウントして同期する

今回は、 /var/www/shared にマウントして、 lsyncd で同期する方法を選択しました。

以下、やったこと

ファイル構成は次のとおり。
ファイル中のパスなどは適宜ご自分の環境に合わせて調整してください。

- docker/
  - apache/
   - init.sh
  - dockerfile/
   - Dockerfile-php7.4
  - lsyncd/
    - lsyncd.conf.lua
  - docker-compose.yml

 

lsyncd の設定ファイルを準備

双方向に同期する設定にします。
delay 0 だと即同期なんですが、双方向ともに 0 に設定するとコンフリクトっぽい感じになってうまく同期されないので、ドキュメントルート側からローカル側に同期する設定だけ、delay 1 に設定します。

// docker/lsyncd/lsyncd.conf.lua

settings {
        logfile    = "/tmp/lsyncd.log",
        statusFile = "/tmp/lsyncd.status",
        nodaemon = false
}
sync {
        default.rsync,
        source = "/var/www/shared/",
        target = "/var/www/html/",
        delay = 0,
        delete="running",
        exclude={"node_modules", "tmp", ".git", ".idea", ".DS_Store", "docker"}
}
sync {
        default.rsync,
        source = "/var/www/html/",
        target = "/var/www/shared/",
        delay = 1,
        delete="running",
        exclude={"node_modules", "tmp", ".git", ".idea", ".DS_Store", "docker"}
}

 

Dockerfile に rsync と lsyncd を追加

lsyncd の設定ファイルをコンテナにコピーする設定も追加。

# docker/dockerfile/Dockerfile-php7.4

RUN apt-get update rsync lsyncd
COPY lsyncd/lsyncd.conf.lua /etc/lsyncd/lsyncd.conf.lua

 

イメージをビルド

M1対応もついでに。
ここでは「5-php7.4」というタグを付けてプッシュしています。

docker buildx build --platform linux/amd64,linux/arm64 -t baserproject/basercms:5-php7.4 -f dockerfile/Dockerfile-php7.4 --push .

 

初期化ファイルを準備

コンテナを立ち上げる際に一発目の rsync を実行しておきます。こちらは初回のみ実行されるよう、checkファイルの有無で制御しています。
また、ここで、毎回 lsyncd を立ち上げることに。

# docker/apache/init.sh

if [ ! -e '/var/www/shared/docker/check' ]; then
    rsync -av /var/www/shared/ /var/www/html --exclude='node_modules' --exclude='tmp' --exclude='.git' --exclude='.idea' --exclude='.DS_Store' --exclude='docker'
    touch /var/www/shared/docker/check
    echo "container setup is complete"
fi
service lsyncd start

 

docker-compose.yml にて shared にマウントするように設定

/var/www/html でなく、 /var/www/shared にマウントするように設定します。
また、先ほど作った初期化ファイルの実行設定を書きます。

// docker/docker-compose.yml

services:
  bc5-php:
    container_name: bc5-php
    image: baserproject/basercms:5-php7.4
    volumes:
      - ../:/var/www/shared:delegated
    ports:
      - "80:80"
      - "443:443"
    command: bash -c "/var/www/shared/docker/apache/init.sh && apache2-foreground"

コンテナ実行

コンテナを立ち上げます。

docker-compose up -d

以上でおわり。お疲れさまでした。
これまでからするとかなり爆速!
 
 
baserCMSの CakePHP4系化の開発プロジェクト「ucmitz」でのコミットログはこちら。

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
Sign upLogin
18
Help us understand the problem. What are the problem?