Docker-compose: deploying service in multiple hosts Docker-compose: deploying service in multiple hosts docker docker

Docker-compose: deploying service in multiple hosts


Example "dev-compose-deploy.yml" file for your reference -

version: "3"services:  nginx:    image: nexus.example.com/pl/nginx-dev:latest    extra_hosts:      - "dev-pldocker-01:10.2.0.42”      - "int-pldocker-01:10.2.100.62”      - "prd-plwebassets-01:10.2.0.62”    ports:      - "80:8003"      - "443:443"    volumes:      - logs:/app/out/    networks:      - pl    deploy:      replicas: 3      labels:        feature.description: “Frontend”      update_config:        parallelism: 1        delay: 10s      restart_policy:        condition: any      placement:        constraints: [node.role == worker]    command: "/usr/sbin/nginx"  viz:    image: dockersamples/visualizer    ports:      - "8085:8080"    networks:      - pl    volumes:      - /var/run/docker.sock:/var/run/docker.sock:ro    deploy:      replicas: 1      labels:        feature.description: "Visualizer"      restart_policy:        condition: any      placement:        constraints: [node.role == manager]networks:pl:volumes:logs:


With docker swarm mode, you can deploy a version 3 compose yml file using:

docker stack deploy -c docker-compose.yml $your_stack_name

The v3 syntax removes a few features that do not apply to swarm mode, like links and dependencies. You should also note that volumes are stored local to a node by default. Otherwise the v3 syntax is very similar to the v2 syntax you may already be using. See ether following for more details:

https://docs.docker.com/compose/compose-file/

https://docs.docker.com/engine/swarm/


[ Original answer before v3 of the docker-compose.yml ]

For a single docker-compose.yml to deploy to multiple hosts, you need to use the standalone swarm (not the newer swarm mode, yet, this is rapidly changing). Spin up a swarm manager that has each host defined as members of its swarm, and then you can use constraints inside your docker-compose.yml to define which services run on which hosts.

You can also split up your docker-compose.yml into several files, one for each host, and then run multiple docker-compose up commands, with a different DOCKER_HOST value defined for each.

In both cases, you'll need to configure your docker installs to listen on the network, which should be done by configuring TLS on those sockets. This documentation describes what you need to do for that.


You can use docker compose version 3 which provides ability to do multi host deployment without using multiple compose files. All you need is to define labels for each node in the cluster and use the label name for placement constraint.