Docker Swarm, Portainer und Traefik kombiniert

 

Wie bereits mehrfach auf dieser Seite erwähnt, verwende ich für den Zugriff auf meine Docker-Container primär den Reverse-Proxy Traefik. Um die Container in einer grafischen GUI verwalten zu können, habe ich zusätzlich Portainer im Einsatz. Für einen Single-Server passt das Setup so weit, wer aber mehrere Server einsetzen will, kann dazu Docker-Swarm verwenden. Ich habe dazu zunächst Portainer in Kombination mit Swarm getestet und das Setup um Traefik inklusive SSL mit Let´s Encrypt erweitert. 

Portainer und Swarm: Stack Deploy

Wer Docker installiert und Swarm initialisiert hat, kann Portainer durch die Anlage folgender Konfiguration starten:

Inhalt der Datei: portainer-agent-stack.yml:

[+]
services:
  agent:
    image: portainer/agent:2.14.2
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
    networks:
      - agent_network
    deploy:
      mode: global
      placement:
        constraints: [node.platform.os == linux]

  portainer:
    image: portainer/portainer-ce:2.14.2
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    ports:
      - "9443:9443"
      - "9000:9000"
      - "8000:8000"
    volumes:
      - portainer_data:/data
    networks:
      - agent_network
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.role == manager]

networks:
  agent_network:
    driver: overlay
    attachable: true

volumes:
  portainer_data:

Beim Einsatz von Docker-Swarm können Container über den Befehl "stack deploy" angelegt und gestartet werden:

Stack Deploy

me@l1:/var/docker/portainer$ docker stack deploy -c /var/docker/portainer/portainer-agent-stack.yml portainer

GUI

Die Portainer-GUI kann jetzt über die IP-Adresse des Servers und dem in der Konfiguration verwendeten Port 9443 gestartet werden. In meinem Fall hat der Server die IP-Adresse 192.168.1.176, der Aufruf erfolgt demnach über https://192.168.1.176:9443/

Damit Container innerhalb von Portainer verwaltet werden können, müssen diese darin angelegt werden. Wer bisher docker-compose einsetzt, muss die YML-Dateien etwas für Docker-Swarm anpassen, siehe: Docker Compose vs. Docker Swarm: verwenden und verstehen

This stack was created outside of Portainer. Control over this stack is limited.

Portainer kann durch das Mapping von docker.sock auf alle Docker-Resourcen zugreifen. Nachdem Portainer selbst in Docker läuft, wird auch Portainer als Container gelistet. Portainer lässt sich natürlich schlecht in Portainer anlegen, wenn Portainer noch gar nicht gestartet wurde. Aus diesem Grund muss Portainer eine Ausnahme bleiben und es ergibt natürlich Sinn, dass dessen Container nur beschränkt verwaltet werden kann.  

Einen Schritt weiter geht das folgende Deployment, indem Traefik und Portainer in einem Deployment zusammengefasst wird, inklusive Traefik-Dashboard.

Portainer und Traefik inkl. Dashboard und https-Internetzugriff (Let’s Encrypt)

Als Voraussetzung für Let`s Encrypt wird ein DNS-Eintrag und eine öffentliche IP-Adresse benötigt, siehe sichere https Verbindung: Traefik Reverse Proxy + Let´s EncryptDie Basis dieser Konfiguration stammt vom der offiziellen Dokumentation: https://docs.portainer.io/advanced/reverse-proxy/traefik.

Ergänzend habe noch das Traefik-Dashboard aktiviert.

[+]
services:
  traefik:
    image: "traefik:v2.8"
    command:
      #- "--log.level=DEBUG"
      - "--api.dashboard=true"
      - "--providers.docker=true"   
      - "--api.insecure=true"   
      - "--providers.docker.swarmMode=true"
      - "--providers.docker.exposedbydefault=false" 
      - "--entrypoints.web.address=:80"
    deploy:
      mode: replicated
      replicas: 1
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.traefik.rule=Host(`traefik.yourdomain.com`)"
        - "traefik.http.routers.traefik.service=api@internal"
        - "traefik.http.routers.traefik.middlewares=traefik-auth"   
        - "traefik.http.services.traefik.loadbalancer.server.port=8080"  
        - "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$2y$$05$$ool59Dzqut1BSYoZkmnqRuZgLJrrbBvM3jV0BmU09lHsunIWEuAsy"
    ports:
      - "80:80"
      - "443:443"
    networks:
      - public
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"    

  agent:
    image: portainer/agent:latest
    environment:
      # REQUIRED: Should be equal to the service name prefixed by "tasks." when
      # deployed inside an overlay network
      AGENT_CLUSTER_ADDR: tasks.agent
      # AGENT_PORT: 9001
      # LOG_LEVEL: debug
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
    networks:
      - agent_network
    deploy:
      mode: global
      placement:
        constraints: [node.platform.os == linux]

  portainer:
    image: portainer/portainer-ce:latest
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    volumes:
      - data:/data
    networks:
      - public
      - agent_network

    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.role == manager]
      labels:
      - "traefik.enable=true"
      - "traefik.http.routers.portainer.rule=Host(`portainer.yourdomain.com`)"
      - "traefik.http.routers.portainer.entrypoints=web"
      - "traefik.http.services.portainer.loadbalancer.server.port=9000"
      - "traefik.http.routers.portainer.service=portainer"
      - "traefik.docker.network=public"
      # Edge
      #- "traefik.http.routers.edge.rule=Host(`edge.yourdomain.com`)"
      #- "traefik.http.routers.edge.entrypoints=web"
      #- "traefik.http.services.edge.loadbalancer.server.port=8000"
      #- "traefik.http.routers.edge.service=edge"

networks:
  public:
    external: true
  agent_network:
    external: true

volumes:
   data:

Der Wert traefik.yourdomain.com muss dem zuvor erstellten DNS-Eintrag ersetzt werden. Damit das Traefik-Dashboard mit einem eigenen Benutzernamen und Passwort geschützt wird, muss der Parameter "traefik.http.middlewares.traefik-auth.basicauth.users" entsprechend angepasst werden. Wie in dem Artikel "sichere https Verbindung: Traefik Reverse Proxy + Let´s Encrypt" beschrieben, kann der Parameter für den Zugriff dazu in Linux mit folgendem Befehl generiert werden: "echo $(htpasswd -nB admin) | sed -e s/\\$/\\$\\$/g"

Fazit

Wer mehrere Docker-Server einsetzt, bekommt mit Portainer und Traefik die Basis für den Zugriff und die Verwaltung der Container. Für den sinnvollen Betrieb wird allerdings ein zentraler Speicher für die Volumes benötigt, siehe dazu: Webserver mit Docker Container umziehen, Theorie und Praxis. 

Details zu Swarm, siehe Docker Compose vs. Docker Swarm: verwenden und verstehen.

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!

Fragen / Kommentare


Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu Mehr Details