クリエイター:メタボ兔

ウェブやアプリの開発者で利用する色な技術やサーバーや開発環境の設定について共有する場

Docker For Macが遅い:対策 - Mutagen編

概要

以前Qiitaに以下のような記事を書いていますが、結果としては満足できなくてRaspberryPiにDockerを動かしてソースをsyncする形で使っていました。

qiita.com

qiita.com

qiita.com

その後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が使えるようになった内容でした。

qiita.com

でも、設定画面と現在利用しているバージョン(3.3.1)と違ったので、もうちょっと調べましたら。。。

qiita.com

結果、現在のバージョンには入ってないようですが、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

細かい説明は以下の記事をご参考してください。

tech.griphone.co.jp

テスト結果

テストは三つの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の場合はそれほどでもなかったです。

但し、ネットが繋がらないと使えない弱点もありますね。