54
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

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

54
46
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
54
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?