Docker Swarm networking vs Docker Compose
Docker Swarm networking vs Docker Compose
Evening y’all
I’ll try to keep it brief, I need to move my reverse proxy (traefik) to another machine and I’m opting to utilize Docker Swarm for the first time this way I’m not exposing a bunch of ports on my main server over my network, so ideally I’d like to have almost everything listening on local host while traefik does it’s thing in the background
Now I gotta ask, is Docker Swarm the best way to go about this? I know very little about Kubernetes and from what I’ve read/watched it seems like Swarm was designed for this very purpose however, I could be entirely wrong here.
What are some key changes that differ typical Compose files from Swarm?
Snippet of my current compose file:
services: homepage: image: ghcr.io/gethomepage/homepage hostname: homepage container_name: homepage networks: main: ipv4_address: 172.18.0.2 environment: PUID: 0 # optional, your user id PGID: 0 # optional, your group id HOMEPAGE_ALLOWED_HOSTS: MY.DOMAIN,* ports: - '127.0.0.1:80:3000' volumes: - ./config/homepage:/app/config # Make sure your local config directory exists - /var/run/docker.sock:/var/run/docker.sock #:ro # optional, for docker integrations - /home/user/Pictures:/app/public/icons restart: unless-stopped labels: - "traefik.enable=true" - "traefik.http.routers.homepage.rule=Host(`MY.DOMAIN`)" - "traefik.http.routers.homepage.entrypoints=https" - "traefik.http.routers.homepage.tls=true" - "traefik.http.services.homepage.loadbalancer.server.port=3000" - "traefik.http.routers.homepage.middlewares=fail2ban@file" traefik: image: traefik:v3.2 container_name: traefik hostname: traefik restart: unless-stopped security_opt: - no-new-privileges:true networks: main: ipv4_address: 172.18.0.26 ports: # Listen on port 80, default for HTTP, necessary to redirect to HTTPS - target: 80 published: 55262 mode: host # Listen on port 443, default for HTTPS - target: 443 published: 57442 mode: host environment: CF_DNS_API_TOKEN_FILE: /run/secrets/cf_api_token # note using _FILE for docker secrets # CF_DNS_API_TOKEN: ${CF_DNS_API_TOKEN} # if using .env TRAEFIK_DASHBOARD_CREDENTIALS: ${TRAEFIK_DASHBOARD_CREDENTIALS} secrets: - cf_api_token env_file: .env # use .env volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./config/traefik/traefik.yml:/traefik.yml:ro - ./config/traefik/acme.json:/acme.json # - ./opt:/opt #- ./config/traefik/config.yml:/config.yml:ro - ./config/traefik/custom-yml:/custom # - ./config/traefik/homebridge.yml:/homebridge.yml:ro labels: - "traefik.enable=true" - "traefik.http.routers.traefik.entrypoints=http" - "traefik.http.routers.traefik.rule=Host(`traefik.MY.DOMAIN`)" #- "traefik.http.middlewares.traefik-ipallowlist.ipallowlist.sourcerange=127.0.0.1/32, 192.168.1.0/24, 208.118.140.130, 172.18.0.0/16" #- "traefik.http.middlewares.traefik-auth.basicauth.users=${TRAEFIK_DASHBOARD_CREDENTIALS}" - "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https" - "traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https" - "traefik.http.routers.traefik.middlewares=traefik-https-redirect" - "traefik.http.routers.traefik-secure.entrypoints=https" - "traefik.http.routers.traefik-secure.rule=Host(`traefik.MY.DOMAIN`)" #- "traefik.http.routers.traefik-secure.middlewares=traefik-auth" - "traefik.http.routers.traefik-secure.tls=true" - "traefik.http.routers.traefik-secure.tls.certresolver=cloudflare" - "traefik.http.routers.traefik-secure.tls.domains[0].main=MY.DOMAIN" - "traefik.http.routers.traefik-secure.tls.domains[0].sans=*.MY.DOMAIN" - "traefik.http.routers.traefik-secure.service=api@internal" - "traefik.http.routers.traefik.middlewares=fail2ban@file" networks: main: external: true ipam: config: - subnet: 172.18.0.0/16 gateway: 172.18.0.1
I censored out my actual domain with MY.DOMAIN
so if that confuses people i apologize.
Update:
So, I’ve came across an application called Traefik-Kop which essentially allows for swarm like communication between traefik and two docker engines.
This isn’t full-proof as I do have to expose ports over the main server however, this was the simplest way of achieving what I was going for.
I want to say thank you to everyone who has commented I haven’t had much time to respond to comments here but I have read them all, y’all’s insight is much appreciated!
Update 2:
People here suggest Pangolin however, I just spent the last 3 hours trying to integrate pangolin with the Traefik instance that I already have setup, it was not fun, i couldn’t figure out how Pangolin is able to communicate with Traefik if it doesn’t expose any ports or define docker labels, once I figured out Pangolins web-ui runs on 3002:3002
I was able to reverse proxy it however, when attempting to login I kept running into 404 errors.
I’ll give it another go when I’m no longer frustrated with it as it does seem like the best route for me to take.