Home > Back-end >  How to clone a docker stack on the same server
How to clone a docker stack on the same server

Time:11-26

I want to practice using docker-compose. I have a tournament happening over the weekend and I want to set up 10 copies of the same web app on ONE server with urls like:

http://team1.example.com
http://team2.example.com
etc...
http://team10.example.com

There will be 10 teams in the tournament, and they will all go to their respective url http://team<your team number>.example.com via web browser, save some information to a database, and maybe even modify the code on the actual server.

So I built a simple nodejs app that simply writes data to a mongo database. Then I decided to set up two websites http://team1.example.com and http://team2.example.com. So I made this docker compose file:

version: '3'

services:
  api1:
    image: dockerjohn/tournament:latest
    environment:
      - DB=database1
    ports:
      - 80:3000
    networks:
      - net1
  db1:
    image: mongo:4.0.3
    container_name: database1
    networks:
      - net1
  api2:
    image: dockerjohn/tournament:latest
    environment:
      - DB=database2
    ports:
      - 81:3000
    networks:
      - net2
  db2:
    image: mongo:4.0.3
    container_name: database2
    networks:
      - net2

networks:
  net1:
  net2:

Then I installed apache web server to reverse proxy team 1 to port 80 and team 2 to port 81. This all works fine.

To set up the remaining teams 3 to 10, I have to duplicate the entries I have in my docker compose yml file and duplicate virtual host entries in apache.

My question: Is there a docker command that will let me clone each docker stack (team 1, team2, etc...) more easily without all this data entry? Do I need Kubernetes to do this?

CodePudding user response:

Kubernetes would be way easier to set this up. It can take care of the reverse proxy setup too if you install the nginx controller.

You could create a single Kubernetes manifest containing:

  • a mongodb deployment, service, persistent volume claim
  • a nodejs deployment, service

You can then apply this 10 times, each time using a different namespace:

kubectl -n team01 -f manifest.yaml
kubectl -n team02 -f manifest.yaml
kubectl -n team03 -f manifest.yaml
...

Of course, you would need 10 different ingress rules because you want 10 different domains, but that would be the only thing you need to copy-paste.

CodePudding user response:

I figured it out. There are options for docker called swarm and stack. First, I simplified my docker-compose.yml file to just this:

version: '3'

services:
  api:
    image: dockerjohn/tournament:latest
    environment:
      - DB=$DB
    ports:
      - $WEB_PORT:3000
    networks:
      - mynet
  db:
    image: mongo:4.0.3
    networks:
      - mynet


networks:
  mynet:

Then I ran these commands from the same folder as my docker-compose file like this

docker swarm init
DB=team1_db WEB_PORT=81 docker stack deploy -c docker-compose.yml team1
DB=team2_db WEB_PORT=82 docker stack deploy -c docker-compose.yml team2
DB=team3_db WEB_PORT=83 docker stack deploy -c docker-compose.yml team3
DB=team4_db WEB_PORT=84 docker stack deploy -c docker-compose.yml team4
DB=team5_db WEB_PORT=85 docker stack deploy -c docker-compose.yml team5
etc...

You have to structure the DB env variable as <stack name located at the end of my docker stack deploy command>_<job name in the docker-compose yaml file>.

Now I just need to find a way to simplify my apache set up so I don't have to duplicate so many vhost entries . I heard there's a docker image called Traefik which can do this reverse proxy. Maybe I'll try that out and update my answer after.

  • Related