docker-syncを使ってみる

## 概要
ホストのフォルダとコンテナ内のフォルダの同期方法について調べていて見かけたので試してみる。

## 実行環境について
Vagrantで構築している下記CentOS7.5環境で試す。
※ [vagrant/CentOS7.5](https://github.com/reflet/vagrant-centos-7.5)

上記環境については、プロビジョニングで下記アプリが自動でインストールされます。

- docker
- docker-compose
- git, vim

## docker-syncのインストール
CentOSのyumが使えないようなので、gemでインストールすることにしました。

```bash:ターミナル
# rubyのインストール
$ sudo yum -y install ruby ruby-devel

# gemコマンドにてdocker-syncをインストール
$ gem install docker-sync

# バージョン確認
$ docker-sync -v
0.5.7
```

## 同期の方法について
rsync、unisonの指定ができるようです。
ただし、どちらの方法を使うにも下記ツールのインストールが必要そうです。

- rsync : fswatch
- unison: unison, unison-fsmonitor

unisonは、brewでのインストールが必要で、面倒そうなのでやめるてrsyncを選択する。
※ [Qiita - CentOSでも使用できるHomebrew(Linuxbrew)の導入](https://qiita.com/CyberMergina/items/36f34b5b722b7bf4a26d)

## fswatchのインストール
下記コマンドにて、インストールする。
※ [fswatch – Monitors Files and Directory Changes or Modifications in Linux](https://www.tecmint.com/fswatch-monitors-files-and-directory-changes-modifications-in-linux/)

```bash:ターミナル
# ソースダウンロード
$ wget https://github.com/emcrisostomo/fswatch/releases/download/1.9.3/fswatch-1.9.3.tar.gz
$ tar -xvzf fswatch-1.9.3.tar.gz
$ cd fswatch-1.9.3

# インストール
$ ./configure
$ make
$ sudo make install 

# バージョン確認
$ fswatch --version
fswatch 1.9.3
```

## ファイル構成
ファイルの構成は、以下のようになります。

```:ファイル一覧
├ sync                ※ 同期するフォルダ
│  └ .gitkeep
│
├ docker-compose.yml  ※ docker-composeの設定
└ docker-sync.yml     ※ docker-syncの設定
```

## docker-compose.yml

```yaml:docker-compose.yml
version: '2'
services:
  code:
    image: busybox
    container_name: 'code'
    tty: true
    volumes:
      - sync-volume:/var/www/   # ← ここでボリュームを指定する

volumes:
  sync-volume:  # ← ここでdocker-syncで作成した外部のボリュームを読み込む
    external: true
```

## docker-sync.yml

```yaml:docker-sync.yml
version: "2"
syncs:
  sync-volume:
    src: './sync/'
    sync_host_ip: '127.0.0.1'
    sync_host_port: '5000'
    sync_strategy: 'rsync'
    sync_excludes: ['.idea']
```

以上で準備完了。

## テスト
同期されるかテストしてみる。

```bash:ターミナル
# sync-volume生成
$ docker-sync start
          ok  Starting rsync for sync sync-volume
          ok  Synced /home/vagrant/opt/docker-sync/sync/
     success  Rsync server started
          ok  Synced /home/vagrant/opt/docker-sync/sync/
     success  Starting Docker-Sync in the background

# sync-volumeコンテナが起動する
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
72a142f55b72        eugenmayer/rsync    "/entrypoint.sh supe…"   17 minutes ago      Up 20 seconds       0.0.0.0:5000->873/tcp   sync-volume

# sync-volumeが出来上がる
$ docker volume ls
DRIVER              VOLUME NAME
local               sync-volume
```

同期するcodeコンテナを起動する。

```bash:ターミナル
$ docker-compose up -d
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
e2068d320626        busybox             "sh"                     4 seconds ago       Up 3 seconds                                code
72a142f55b72        eugenmayer/rsync    "/entrypoint.sh supe…"   19 minutes ago      Up About a minute   0.0.0.0:5000->873/tcp   sync-volume
```

syncフォルダ内にファイルを作ってみる。

```bash:ターミナル
$ touch sync/test.log
```

コンテナ内にファイルが作られたか確認してみる。

```bash:ターミナル
$ docker exec code ls -la /var/www
total 0
-rw-r--r--    1 1000     1000             0 Jun 19 11:22 .gitkeep
-rw-r--r--    1 1000     1000             0 Jun 19 11:52 test.log
```

問題なく同期されるようです。
ただし、ホストのフォルダをコンテナ内にマウントするのと特に動きが同じみたい。
（同期するとコンテナ内のファイルが消えてホスト側のファイルで上書きされる）

やりたかったのは、コンテナ内のフォルダをホスト側に共有したいという用途には使えなさそう・・・。
（コンテナ内のファイルを残したまま、ホストのフォルダに共有したかった・・・）

下記コマンドで、コピーしてごにょごにょするしかないのかな・・・

```bash:ターミナル
docker cp code:/var/www/ ./sync/
```

残念。

## 参考サイト
- [docker-sync/example/docker-sync.yml](https://github.com/EugenMayer/docker-sync/blob/master/example/docker-sync.yml)
- [docker-syncを使わないホスト・コンテナ間での爆速ファイル同期](https://qiita.com/kai-zoa/items/dffbe5e38d3d8bf21556)
- [docker-syncでホスト-コンテナ間を爆速で同期する](https://qiita.com/pocari/items/0340049742927f3a94b7)