5. Traefik a vlastní doména lokálně (20 min)
Výstup bloku: WordPress běží na http://wp.localhost a Adminer na http://adminer.localhost bez zapamatování portů.
Co je reverzní proxy (3 min)
Traefik poslouchá na portu 80 (a 443) a podle domény v požadavku posílá provoz do správného kontejneru.
prohlížeč ──▶ Traefik :80 ──┬─ Host(wp.localhost) ──▶ wordpress
└─ Host(adminer.localhost) ──▶ adminer
Výhoda: porty se nemapují jednotlivě, nové služby se přidají pár řádky (labely) a Traefik si je najde sám přes Docker socket.
Doména na lokálním počítači (3 min)
Doména *.localhost se na většině systémů přeloží na 127.0.0.1 sama (macOS, Linux, moderní prohlížeče na Windows). Pokud ne, přidat do souboru hosts:
- Windows:
C:\Windows\System32\drivers\etc\hosts(editor spustit jako správce), - macOS / Linux:
/etc/hosts(sudo nano /etc/hosts).
127.0.0.1 wp.localhost adminer.localhost
Pro vlastní fiktivní doménu (např. wp.skoleni.test) je zápis do hosts nutný vždy.
Traefik jako samostatný stack (6 min)
Složka traefik, soubor compose.yml:
services:
traefik:
image: traefik:v3.6
restart: unless-stopped
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --providers.docker.network=proxy
- --entrypoints.web.address=:80
- --api.dashboard=true
- --api.insecure=true
ports:
- "80:80"
- "8082:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- proxy
networks:
proxy:
name: proxy
docker compose up -d
Dashboard: http://localhost:8082.
Poznámky:
exposedbydefault=false= Traefik zveřejní jen kontejnery straefik.enable=true.--api.insecureje jen pro lokální školení. Na serveru nikdy.- Docker socket je citlivé místo, dává přístup k informacím o všech kontejnerech.
Úprava předchozího stacku (6 min)
V wp-stack/compose.yml:
- Odebrat
ports:uwordpressaadminer. - Přidat
labelsa připojit je do sítěproxy.
adminer:
image: adminer
restart: unless-stopped
networks: [default, proxy]
labels:
- traefik.enable=true
- traefik.http.routers.adminer.rule=Host(`adminer.localhost`)
- traefik.http.routers.adminer.entrypoints=web
- traefik.http.services.adminer.loadbalancer.server.port=8080
wordpress:
image: wordpress:latest
restart: unless-stopped
depends_on:
- db
networks: [default, proxy]
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wp
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
volumes:
- wp_data:/var/www/html
labels:
- traefik.enable=true
- traefik.http.routers.wp.rule=Host(`wp.localhost`)
- traefik.http.routers.wp.entrypoints=web
- traefik.http.services.wp.loadbalancer.server.port=80
Na konec souboru přidat síť:
networks:
proxy:
external: true
Databáze zůstává jen v interní síti default, ven není vidět. To je záměr.
docker compose up -d
Otevřít http://wp.localhost a http://adminer.localhost.
Pozor: WordPress má uloženou adresu localhost:8080 z předchozí instalace. Buď smazat volumes (docker compose down -v) a nainstalovat znovu, nebo v Nastavení změnit adresu webu.
HTTPS (jen zmínka)
Pro lokální školení stačí HTTP. Na serveru se přidá entrypoint websecure a certifikát (Let's Encrypt, nebo vlastní wildcard). Princip zůstává stejný, mění se labely entrypoints a tls.
Typické problémy
- Port 80 je obsazený (Apache, IIS, jiný kontejner):
docker ps, případně uvolnit. 404 page not foundz Traefiku: kontejner není ve stejné sítiproxy, nebo chybítraefik.enable=true.- Nový Docker Desktop (Engine 29 a novější) nefunguje se staršími Traefik než 3.6.1 kvůli verzi Docker API. Proto
traefik:v3.6. - Doména se nepřeloží: zkontrolovat soubor hosts a restartovat prohlížeč.