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:

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:

Úprava předchozího stacku (6 min)

V wp-stack/compose.yml:

  1. Odebrat ports: u wordpress a adminer.
  2. Přidat labels a 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