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に追加していく。
docker-compose.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
docker-compose.override.yml---
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>