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」でのコミットログはこちら。