Display a Docker Swarm cluster with 3 nodes
Rhonal Chirinos

Rhonal Chirinos @rhonalchirinos

Location:
Buenos aires
Joined:
Mar 16, 2019

Display a Docker Swarm cluster with 3 nodes

Publish Date: Jun 16
2 1

✅ Task

Display a Docker Swarm cluster with 3 nodes

📦 Create the API

Folder: swarm-api

swarm-api/Dockerfile

FROM node:22.13-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install && npm audit fix --force

COPY . .

EXPOSE 3000

CMD ["node", "main.js"]
Enter fullscreen mode Exit fullscreen mode

swarm-api/package.json

{
  "name": "swarm-api",
  "version": "1.0.0",
  "main": "main.js",
  "license": "MIT",
  "dependencies": {
    "express": "^5.1.0",
    "pg": "^8.16.0"
  }
}
Enter fullscreen mode Exit fullscreen mode

swarm-api/main.js

const express = require('express');
const { Pool } = require('pg');

const app = express();
const port = process.env.PORT || 3000;

const pool = new Pool({
  host: process.env.PGHOST || 'postgres',
  user: 'postgres',
  password: process.env.PGPASSWORD || 'secret',
  database: 'postgres',
  port: 5432,
});

app.get('/', async (req, res) => {
  const result = await pool.query('SELECT NOW()');
  res.json({ message: 'Hello from API', time: result.rows[0].now });
});

app.listen(port, '0.0.0.0', () => {
  console.log(`API running on port ${port}`);
});
Enter fullscreen mode Exit fullscreen mode

🛠️ Build the Docker image

docker build --tag rhonalchirinos/hello-api:latest .
Enter fullscreen mode Exit fullscreen mode

☁️ Push to Docker Hub

docker login
docker push rhonalchirinos/hello-api:latest
Enter fullscreen mode Exit fullscreen mode

🌐 Create an Overlay Network

docker network create -d overlay hello-net
Enter fullscreen mode Exit fullscreen mode

ℹ️ Why an overlay network? Overlay networks allow containers and services to communicate across multiple Docker nodes in a Swarm. This eliminates the need for OS-level routing.

🐳 Initialize Docker Swarm

docker swarm init 
Enter fullscreen mode Exit fullscreen mode

➕ Add Worker Nodes to the Swarm

docker swarm join --token SWMTKN-1-xxxxx 192.168.64.6:2377
Enter fullscreen mode Exit fullscreen mode

📌 You can get the worker token using:

docker swarm join-token worker
Enter fullscreen mode Exit fullscreen mode

🛢️ Create a PostgreSQL Service

docker service create \
  --name postgres \
  --env POSTGRES_PASSWORD=secret \
  --mount type=volume,source=testdb,target=/var/lib/postgresql/data \
  --network hello-net \
  postgres
Enter fullscreen mode Exit fullscreen mode

🚀 Deploy the API Service in Swarm

First, check if services are listed:

docker service ls
Enter fullscreen mode Exit fullscreen mode

Then create the service:

docker service create \
  --name some-api \
  --replicas 3 \
  --publish 3000:3000 \
  --network hello-net \
  rhonalchirinos/hello-api:latest
Enter fullscreen mode Exit fullscreen mode

You can inspect the published ports with:

# inspect ports
docker service inspect some-api --format '{{json .Endpoint.Ports}}' | jq
Enter fullscreen mode Exit fullscreen mode

🧪 Test the API

curl <http://localhost:3000>
Enter fullscreen mode Exit fullscreen mode

Comments 1 total

Add comment