Note – if you don’t need to split your app into multiple instances, just forget about Docker Compose
Prepare the Docker Compose file, here’s a basic example
mkdir -p ~/compose/weblab/
cd ~/compose/weblab/
vi docker-compose.yml
version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: pbraun9/ubuntu:latest
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "8080:8080"
    networks:
      - webnet
networks:
  webnet:
and here’s how to create some depedencies – docker host constraints – among the instances
...
bind/map a folder from the docker host
make sure the folder exists on all the docker hosts
mkdir /datafs/weblab/ echo ok > /datafs/weblab/test
then e.g. in the web service stanza
    volumes:
      - /datafs/weblab:/weblab
run the thing
docker stack deploy -c docker-compose.yml APPLICATION
and check that the volume is available everywhere
docker ps docker exec -ti INSTANCE /bin/bash ls -alhF /weblab/
from some manager
run the lab application (webnet and web instances) and check on all the nodes at once
docker stack deploy -c docker-compose.yml lab1 docker stack ps lab1
review the services associated with an application
docker stack services lab1
from some manager
eventually scale the app and increase the number of instance replicas
vi docker-compose.yml docker stack deploy -c docker-compose.yml lab1
remove an application and all its instances
docker stack rm lab1
https://docs.docker.com/get-started/part3/#your-first-docker-composeyml-file
https://docs.docker.com/compose/swarm/#multiple-dependencies
https://docs.docker.com/compose/compose-file/#external