Docker For Macが遅い:対策 - Mutagen編
概要
以前Qiitaに以下のような記事を書いていますが、結果としては満足できなくてRaspberryPiにDockerを動かしてソースをsyncする形で使っていました。
その後Blimpという物を知って簡単なテストしたのが、放置した時間が長かったのかMacOSをアップされたのが原因かわからないが以下のエラーが出て全く解決方法が見つからず。。。
[Error] Get help at https://kelda.io/blimp/docs/help/ Message: Failed to connect to the Blimp cluster Error: check version: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp 34.82.73.248:443: i/o timeout"
Mutagen
Mutagen | Cloud-based development using your local tools
blimpのようにコンテイナーを全部Cloud化する物ではないですが、Volumesをホストのディレクトとコンテナのディレクトリの間に同期してくれる物のようです。
Docker for Macの機能に入っていた
最初みた記事はDocker for MacのEdge channelで、Mutagenが使えるようになった内容でした。
でも、設定画面と現在利用しているバージョン(3.3.1)と違ったので、もうちょっと調べましたら。。。
結果、現在のバージョンには入ってないようですが、Mutagenを使うことには問題がないとのことです。
テスト
環境
Mutagenのインストール
mutage composeコマンドを使用するためにはBeta版をインストールしないといけないようです。
brew install mutagen-io/mutagen/mutagen-beta
docker環境は自分が使用している物から要らない部分を削除して作りました。
Mutagen用 docker-compose.yml作成
元のdocker-compose.yml
version: "3" services: web: image: web build: context: ./web dockerfile: Dockerfile container_name: web ports: - "80:80" - "443:443" command: /sbin/init volumes: - ../app:/var/www/html:cached - ./web/conf.d/extra:/etc/httpd/conf.d/extra:ro tty: true stdin_open: true privileged: true restart: always depends_on: - "php7.3" - "dba" external_links: - "php7.3-fpm" logging: options: max-size: 5m max-file: "5" networks: local-server-net: ipv4_address: 172.16.0.2 dba: image: yobasystems/alpine-mariadb container_name: dba ports: - "3306:3306" volumes: - ./dba/mysql/data:/var/lib/mysql - ./dba/my.cnf:/etc/my.cnf environment: MYSQL_ROOT_PASSWORD: 12345678 MYSQL_CHARSET: "utf8mb4" TZ: Asia/Tokyo restart: always logging: options: max-size: 5m max-file: "5" networks: local-server-net: ipv4_address: 172.16.0.3 dns: image: dns build: context: ./dns dockerfile: Dockerfile args: DOCKER_LOCAL_IP: $DOCKER_LOCAL_IP container_name: dns ports: - "53:53/udp" - "53:53/tcp" volumes: - ./dns/dnsmasq.conf:/etc/dnsmasq.conf - ./dns/host-names:/etc/host-names restart: always cap_add: - NET_ADMIN networks: local-server-net: ipv4_address: 172.16.0.4 mailhog: image: mailhog build: context: ./mailhog dockerfile: Dockerfile container_name: mailhog ports: - "1025:1025" - "8025:8025" networks: local-server-net: ipv4_address: 172.16.0.5 php7.3: image: fpm-php:7.3 build: context: ./php-fpm dockerfile: 7.3_Dockerfile container_name: php7.3-fpm volumes: - ../app:/var/www/html external_links: - "dba" ports: - '9000' networks: local-server-net: ipv4_address: 172.16.0.8 networks: local-server-net: driver: bridge ipam: driver: default config: - subnet: 172.16.0.0/24
これをmutagen-compose.ymlに変更しました。
version: "3" services: web: image: web build: context: ./web dockerfile: Dockerfile container_name: web ports: - "80:80" - "443:443" command: /sbin/init volumes: - web_root:/var/www/html:cached - web_logs:/var/www/html/storage/logs:cached - ./web/conf.d/extra:/etc/httpd/conf.d/extra:ro tty: true stdin_open: true privileged: true restart: always depends_on: - "php7.3" - "dba" external_links: - "php7.3-fpm" logging: options: max-size: 5m max-file: "5" networks: local-server-net: ipv4_address: 172.16.0.2 dba: image: yobasystems/alpine-mariadb container_name: dba ports: - "3306:3306" volumes: - db_data:/var/lib/mysql - ./dba/my.cnf:/etc/my.cnf environment: MYSQL_ROOT_PASSWORD: 12345678 MYSQL_CHARSET: "utf8mb4" TZ: Asia/Tokyo restart: always logging: options: max-size: 5m max-file: "5" networks: local-server-net: ipv4_address: 172.16.0.3 dns: image: dns build: context: ./dns dockerfile: Dockerfile args: DOCKER_LOCAL_IP: $DOCKER_LOCAL_IP container_name: dns ports: - "53:53/udp" - "53:53/tcp" volumes: - ./dns/dnsmasq.conf:/etc/dnsmasq.conf - ./dns/host-names:/etc/host-names restart: always cap_add: - NET_ADMIN networks: local-server-net: ipv4_address: 172.16.0.4 mailhog: image: mailhog build: context: ./mailhog dockerfile: Dockerfile container_name: mailhog ports: - "1025:1025" - "8025:8025" networks: local-server-net: ipv4_address: 172.16.0.5 php7.3: image: fpm-php:7.3 build: context: ./php-fpm dockerfile: 7.3_Dockerfile container_name: php7.3-fpm volumes: - web_root:/var/www/html - web_logs:/var/www/html/storage/logs:cached external_links: - "dba" ports: - '9000' networks: local-server-net: ipv4_address: 172.16.0.8 networks: local-server-net: driver: bridge ipam: driver: default config: - subnet: 172.16.0.0/24 volumes: web_root: web_logs: db_data: x-mutagen: sync: defaults: ignore: vcs: true webRoot: alpha: "../app" beta: "volume://web_root" mode: "one-way-replica" ignore: paths: - "./storage/logs" configurationBeta: permissions: defaultFileMode: 0666 defaultDirectoryMode: 0777 webLogs: alpha: "../app/storage/logs" beta: "volume://web_logs" mode: "two-way-resolved" configurationBeta: permissions: defaultFileMode: 0666 defaultDirectoryMode: 0777 dbData: alpha: "./dba/mysql/data" beta: "volume://db_data" mode: "two-way-resolved" configurationBeta: permissions: defaultFileMode: 0666 defaultDirectoryMode: 0777
細かい説明は以下の記事をご参考してください。
テスト結果
テストは三つのAPIを5回位実行した後に5回分の時間を記録しました。
Mutagenの未対応
API | 機能 | 1回目 | 2回目 | 3回目 | 4回目 | 5回目 |
---|---|---|---|---|---|---|
A | Session情報の取得がメイン | 1.04s | 1.25s | 1.03s | 1.96s | 1.54s |
B | 設定ファイルから情報を取得がメイン | 2.76s | 2.56s | 3.32s | 2.45s | 2.12s |
C | DBから情報を取得がメイン | 3.10s | 2.75s | 3.57s | 2.58s | 2.38s |
Mutagenの対応
API | 機能 | 1回目 | 2回目 | 3回目 | 4回目 | 5回目 |
---|---|---|---|---|---|---|
A | Session情報の取得がメイン | 0.35s | 0.81s | 0.88s | 1.17s | 1.36s |
B | 設定ファイルから情報を取得がメイン | 0.83s | 0.80s | 1.05s | 1.39s | 1.14s |
C | DBから情報を取得がメイン | 1.16s | 1.03s | 1.14s | 1.20s | 1.53s |
感想
docker-syncと比べると初期コンテナーの立ち上がる時間が速いし、レスの速度も2倍位早くなった(テストした時のネットが早くなった部分もあり、他の記事では3倍とか)ので良い感じでした。
また、docker-syncの方は同期する際にやっぱりPCに負荷が掛かる印象でしたがmutagenの場合はそれほどでもなかったです。
但し、ネットが繋がらないと使えない弱点もありますね。