LoginSignup
13
13

More than 5 years have passed since last update.

docker-syncを使ってみる

Posted at

概要

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

実行環境について

Vagrantで構築している下記CentOS7.5環境で試す。
vagrant/CentOS7.5

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

  • docker
  • docker-compose
  • git, vim

docker-syncのインストール

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

ターミナル
# 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)の導入

fswatchのインストール

下記コマンドにて、インストールする。
fswatch – Monitors Files and Directory Changes or Modifications in Linux

ターミナル
# ソースダウンロード
$ 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

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

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']

以上で準備完了。

テスト

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

ターミナル
# 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コンテナを起動する。

ターミナル
$ 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フォルダ内にファイルを作ってみる。

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

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

ターミナル
$ 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

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

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

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

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

残念。

参考サイト

13
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
13