mutagenでDocker remote accessをいい感じにする

· ·

MacにDocker Desktopを入れたくないなと思ったので、Docker remote accessを使うことにした。

その際にvolumesのマウントが出来ないので困っていたところ、mutagenというツールがあることを知ったので使ってみた。

mutagenのインストール 🔗

brew install mutagen-io/mutagen/mutagen mutagen-io/mutagen/mutagen-compose

Linuxの場合はコンパイル済みバイナリが配布されているのでそれを任意のディレクトリにコピーする。

※mutagen-agents.tar.gzもmutagenと同じディレクトリにコピーする。

docker contextの設定 🔗

Configure remote access for Docker daemon を参考にリモートアクセス可能なdocker daemonを立ち上げ、docker contextでリモートのdocker daemonを登録する。

docker context create --docker host=tcp://example.com:2375 remote
docker context use remote

docker-composeの設定 🔗

今回はシンプルにnginxでdataディレクトリの中身を配信するコンテナを立ち上げる。

mutagenを使っていないユーザーとdocker-compose.ymlを共有することを想定してmutagenに関する設定はdocker-compose.override.ymlに追加していく。

---
version: '3'
services:
  nginx:
    image: nginx:latest
    volumes:
      - nginx-data:/usr/share/nginx/html
    ports:
      - 8080:80

volumes:
  nginx-data:
    driver: local
    driver_opts:
      type: none
      device: "./data"
      o: bind
---
services:
  nginx:
    networks:
      # mutagenのコンテナと同じネットワークに所属する必要がある
      - forwarding

volumes:
  nginx-data:

networks:
  forwarding:


x-mutagen:
  sync:
    defaults:
      ignore:
        vcs: true
      permissions:
        # 未指定の場合0600になりnginxのプロセスから読み込みが出来ない
        defaultFileMode: '0644' 
        defaultDirectoryMode: '0755'
    nginx-data:
      alpha: './data'
      # volumesの名前と合わせる
      beta: volume://nginx-data 
      # https://mutagen.io/documentation/synchronization#modes
      # ローカルの変更をリモートにコピーするが、リモートの変更は反映されない
      mode: one-way-replica 
  forward:
    nginx:
      # 127.0.0.1のポート8080にbind
      source: tcp:127.0.0.1:8080
      # forwardingのネットワークからnginxコンテナのポート80へフォーワードする
      destination: network://forwarding:tcp:nginx:80 

設定がどのようになるか確認。

mutagen-compose config

mutagenの起動 🔗

適当にファイルを配置する。

mkdir data
echo 'Hello World!' > data/index.html

mutagen-composeでmutagenを起動する。

mutagen-compose up

これで手元のファイルの変更がリモートのコンテナに反映され、http://127.0.0.1:8080/で内容が確認できるようになった。

ハマったポイント 🔗

mutagen-agents.tar.gzをコピーしていなかった 🔗

mutagenインストール時の注釈に書いたが、mutagen-agent.tar.gzのコピーを忘れると動かない。

docker-compose.override.ymlにvolumesを書き忘れると起動に失敗する 🔗

volumesを書き忘れるとbindマウントの設定が残ってしまい、リモートのdocker上のディレクトリをマウントしようとして失敗する。

動かないときはmutagen-compose configで設定がどのようになっているか確認する。

設定を変更したとき反映されない 🔗

おそらくmutagen daemonが設定を保持しているのだが、エラーが発生した時に設定を変更しても反映されないことが多々あった。

都度以下のコマンドを実行していた。

mutagen-compose down ; killall mutagen ; rm -rf ~/.mutagen/

既にvolumeが存在する場合起動に失敗する (2023/06/17追記) 🔗

mutagen-composeを使わずにvolumeが作成されていた場合一度消す必要がある。

docker volume ls
docker volume rm <VOLUME NAME>