A container that syncronizes volumes within a Swarm cluster in asynchroned way. In fact, there are some scenarios where you want keep synchronized some volume across the Swarm cluster. For example, if you want ensure a simple high availability.
The files are usually synchronized within 5 seconds.
It is composed by Lsync and Csync2. It is designed to be deployed inside a Docker Stack.
You can build the image giving the following commands:
git clone https://github.com/fabrizio2210/Docker_Volume_Synchronizator.git
cd Docker_Volume_Synchronizator
docker build -t docker_volume_sync -f docker/x86_64/Dockerfile .
The container works only in a docker Swarm cluster and has to be deployed in the same Stack of the service that you want synchronize.
I suggest to create a dedicated network beacause the ingress network doesn't do the service discovery.
The service has to be created mounting the Docker socket (/var/run/docker.sock
) and the volumes to synchronize.
Then, you should pass a random key (only A-Z a-z 0-9 digit) as env var CSYNC2_KEY.
In the deploy of this image you should define the service to synchronize with the label async.service
.
In the deploy of the image to sync you should define the label async.volumes
with the name of the volume to sync.
An example of a stack that use this image.
In this case the service to synchronize is jenkins
, so async.service: 'jenkins'
in services->async->deploy->labels
.
The volumes to sync are wp_content_async jenkins_home
, so async.volumes: 'wp_content_async,jenkins_home'
in services->jenkins->deploy->labels
Remember to mount the volumes on both services.
version: '3.3'
services:
jenkins:
image: jenkins/jenkins
deploy:
replicas: 1
labels:
async.volumes: 'wp_content_async,jenkins_home'
traefik.frontend.rule: 'Host:fabrizio.no-ip.dynu.net'
ports:
- "8080:8080"
volumes:
- jenkins_home:/var/jenkins_home
- wp_content_async:/var/www/html
restart: always
networks:
- network-async
async:
image: fabrizio2210/docker_volume_synchronizer
deploy:
mode: global
labels:
async.service: 'jenkins'
volumes:
- jenkins_home:/opt/data
- wp_content_async:/opt/data2
- /var/run/docker.sock:/var/run/docker.sock
environment:
CSYNC2_KEY: dasbdsfsdfsdfn12dsfsdfsdfsdbc9089nfdg24342hjgfdsa
volumes:
jenkins_home:
driver: 'local'
driver_opts:
type: 'none'
o: 'bind'
device: "/var/mount1/"
wp_content_async:
driver: 'local'
driver_opts:
type: 'none'
o: 'bind'
device: "/var/mount2/"
networks:
network-async:
external: true
These are the commands to use this stack.
docker swarm init
docker network create --driver overlay network-sync
docker stack deploy -c tests/stack.yml test-stack
To test this project you should install Vagrant. After that you can use the following commands.
vagrant-tools/setup.sh
tests/sync_with_stack.sh