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 Encrypt. Die 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.
{{percentage}} % positiv