From 41c920115fd3a44eda4870f3d217754176ee214b Mon Sep 17 00:00:00 2001 From: chhanz <41337266+chhanz@users.noreply.github.com> Date: Fri, 27 Feb 2026 05:53:20 +0000 Subject: [PATCH] add : new post about Traefik basic usage --- _posts/2026-02-27-traefik-basic-usage.md | 271 ++++++++++++++++++ .../post/2026-02-27-traefik-basic-usage/1.png | Bin 0 -> 32899 bytes 2 files changed, 271 insertions(+) create mode 100644 _posts/2026-02-27-traefik-basic-usage.md create mode 100644 assets/images/post/2026-02-27-traefik-basic-usage/1.png diff --git a/_posts/2026-02-27-traefik-basic-usage.md b/_posts/2026-02-27-traefik-basic-usage.md new file mode 100644 index 0000000..9e90e5b --- /dev/null +++ b/_posts/2026-02-27-traefik-basic-usage.md @@ -0,0 +1,271 @@ +--- +layout: post +title: "[Docker] Traefik 기본 사용법" +description: "Traefik 기본 사용법" +author: chhanz +date: 2026-02-27 +tags: [docker] +categories: [docker] +--- + +# Traefik 기본 사용법 + +이번 포스팅에서는 Docker 환경에서 **Traefik**을 구성하고 사용하는 방법에 대해 기록하도록 하겠습니다. + +## Traefik 이란? + +Traefik은 클라우드 네이티브 환경을 위한 리버스 프록시 / 로드 밸런서입니다. +Nginx나 HAProxy와 같은 전통적인 프록시와 달리, 서비스를 자동으로 감지하고 라우팅 설정을 동적으로 업데이트하는 것이 특징입니다. + +특히 Docker 환경에서 컨테이너에 레이블(Label)만 추가하면 자동으로 라우팅이 설정되어, 별도로 설정 파일을 관리할 필요가 없습니다. + +## 테스트 환경 + +* 테스트 환경 : Amazon Linux 2023 +* Traefik : v3.3 + +## 핵심 개념 + +Traefik 은 4가지 핵심 컴포넌트로 구성됩니다. + +![Traefik 핵심 개념 흐름도](/assets/images/post/2026-02-27-traefik-basic-usage/1.png) + +### EntryPoints +외부에서 들어오는 네트워크 포트를 정의합니다. + +```yaml +entryPoints: + web: + address: ":80" + websecure: + address: ":443" +``` + +### Routers +요청을 규칙에 따라 분류하여 적절한 서비스로 연결합니다. + +```yaml +# Host 기반 라우팅 +rule: "Host(`example.com`)" + +# Path 기반 라우팅 +rule: "PathPrefix(`/api`)" + +# 복합 조건 +rule: "Host(`example.com`) && PathPrefix(`/api`)" +``` + +### Middlewares +라우터와 서비스 사이에서 요청/응답을 변환하는 플러그인입니다. + +| 미들웨어 | 용도 | +|----------|------| +| `basicAuth` | HTTP Basic 인증 | +| `redirectScheme` | HTTP → HTTPS 리다이렉트 | +| `stripPrefix` | URL 경로 앞부분 제거 | +| `rateLimit` | 요청 속도 제한 | +| `headers` | 헤더 추가/수정 | + +### Providers +Traefik이 라우팅 설정을 읽어오는 소스입니다. + +| Provider | 설명 | +|----------|------| +| `docker` | Docker 컨테이너 레이블 자동 감지 | +| `file` | 정적 YAML/TOML 파일 | +| `kubernetes` | Kubernetes Ingress | + +## 설치 (Docker Compose) + +아래와 같은 방법으로 Traefik 을 구성합니다. + +### 디렉토리 구조 + +``` +traefik/ +├── docker-compose.yml +├── traefik.yml ← 정적 설정 (Static Config) +└── dynamic.yml ← 동적 설정 (Dynamic Config) +``` + +### traefik.yml (정적 설정) + +```yaml +# traefik.yml +api: + dashboard: true + insecure: true # 대시보드 인증 없이 접근 (개발용) + +entryPoints: + web: + address: ":80" + +providers: + docker: + exposedByDefault: false # 레이블 없는 컨테이너는 노출 안 함 + file: + filename: /etc/traefik/dynamic.yml + watch: true # 파일 변경 자동 감지 + +log: + level: INFO +``` + +### docker-compose.yml + +```yaml +services: + traefik: + image: traefik:v3.3 + container_name: traefik + restart: unless-stopped + ports: + - "80:80" + - "127.0.0.1:8888:8080" # 대시보드 (로컬 전용) + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./traefik.yml:/etc/traefik/traefik.yml:ro + - ./dynamic.yml:/etc/traefik/dynamic.yml:ro + networks: + - traefik_net + +networks: + traefik_net: + external: true +``` + +> 대시보드 포트(`8888`)는 `127.0.0.1`에만 바인딩하여 외부 노출을 차단합니다. + +## 실전 예시 1 — Docker 컨테이너 라우팅 + +컨테이너에 레이블만 추가하면 Traefik 이 자동으로 라우팅 설정을 감지합니다. + +```yaml +services: + myapp: + image: nginx + labels: + - "traefik.enable=true" + - "traefik.http.routers.myapp.rule=Host(`myapp.example.com`)" + - "traefik.http.routers.myapp.entrypoints=web" + - "traefik.http.services.myapp.loadbalancer.server.port=80" + networks: + - traefik_net +``` + +위와 같이 레이블을 추가하면 `myapp.example.com` 으로 들어오는 요청이 해당 컨테이너로 자동 라우팅되는 것을 확인 할 수 있습니다. + +## 실전 예시 2 — Path 기반 라우팅 + +여러 서비스를 하나의 도메인에서 경로로 분리할 때 아래와 같이 구성합니다. + +```yaml +services: + # docs.example.com/ → open-webui + open-webui: + image: ghcr.io/open-webui/open-webui + labels: + - "traefik.enable=true" + - "traefik.http.routers.webui.rule=Host(`docs.example.com`)" + - "traefik.http.routers.webui.entrypoints=web" + + # docs.example.com/docs/ → mkdocs + mkdocs: + image: squidfunk/mkdocs-material + labels: + - "traefik.enable=true" + - "traefik.http.routers.mkdocs.rule=Host(`docs.example.com`) && PathPrefix(`/docs`)" + - "traefik.http.routers.mkdocs.entrypoints=web" +``` + +## 실전 예시 3 — BasicAuth 미들웨어 + +특정 서비스에 HTTP Basic 인증을 추가하는 방법입니다. + +### 비밀번호 해시 생성 + +```bash +$ htpasswd -nb username password +username:$apr1$xxxxxxxx$hashedpassword +``` + +### dynamic.yml 에 미들웨어 정의 + +출력된 해시를 그대로 `dynamic.yml` 에 붙여넣으면 됩니다. + +```yaml +# dynamic.yml +http: + middlewares: + my-auth: + basicAuth: + users: + - "username:$apr1$xxxxxxxx$hashedpassword" +``` + +### 컨테이너 레이블에서 참조 + +```yaml +labels: + - "traefik.http.routers.myapp.middlewares=my-auth@file" +``` + +> 파일 프로바이더의 미들웨어를 Docker 레이블에서 참조할 때는 반드시 `@file` 접미사를 붙여야 합니다. + +## 실전 예시 4 — ELB 헬스체크 처리 + +AWS ELB(Elastic Load Balancer) 뒤에 Traefik을 배치할 때, ELB 헬스체크는 Host 헤더를 포함하지 않습니다. +이 경우 아래와 같이 별도 라우터를 파일 프로바이더로 등록합니다. + +```yaml +# dynamic.yml +http: + routers: + elb-health: + rule: "Path(`/health`)" + entryPoints: + - web + service: health-service + priority: 1 + + services: + health-service: + loadBalancer: + servers: + - url: "http://localhost" +``` + +위와 같이 구성하면 Host 조건 없이 `/health` 경로만으로 라우팅되어 ELB 헬스체크가 정상 통과됩니다. + +## 대시보드 + +Traefik 대시보드를 통해 현재 라우터/서비스/미들웨어 상태를 실시간으로 확인 할 수 있습니다. + +```bash +# 로컬에서 접속 +http://localhost:8888/dashboard/ + +# API 로 라우터 목록 확인 +$ curl http://localhost:8888/api/http/routers | jq . +``` + +## 주의 사항 + +Docker 레이블의 Host rule 작성 시 반드시 백틱(`` ` ``)을 사용해야 합니다. + +```yaml +# ✅ 올바른 문법 +- "traefik.http.routers.myapp.rule=Host(`myapp.example.com`)" + +# ❌ 작동 안 함 +- 'traefik.http.routers.myapp.rule=Host("myapp.example.com")' +``` + +## 참고 자료 + +* [Traefik 공식 문서](https://doc.traefik.io/traefik/) +* [Traefik Concepts](https://doc.traefik.io/traefik/getting-started/concepts/) +* [Docker Provider](https://doc.traefik.io/traefik/providers/docker/) +* [File Provider](https://doc.traefik.io/traefik/providers/file/) +* [BasicAuth Middleware](https://doc.traefik.io/traefik/middlewares/http/basicauth/) +* [Docker Hub — traefik](https://hub.docker.com/_/traefik) diff --git a/assets/images/post/2026-02-27-traefik-basic-usage/1.png b/assets/images/post/2026-02-27-traefik-basic-usage/1.png new file mode 100644 index 0000000000000000000000000000000000000000..ac1ea237ee610e3c1b928fc4e3ab67dfa1cabe36 GIT binary patch literal 32899 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