Traefik Proxy
작성일:
Docker 기반 서비스 자동 감지 및 요청을 처리하는 Reverse proxy
Traefik Proxy
- https://doc.traefik.io/traefik/
- docker.sock 을 통해 Rule 기반 서비스를 찾고 요청을 처리함
- Docker 이외에 Kubernetes, Docker Swarm, AWS, Mesos, Marathon 등을 지원
Quick Start
docker-compose.yml
reverse-proxy
: traefik reverse proxy 서비스- Docker Out of Docker (DooD) 같은 형태로 서비스 감지
- 서비스와 같은 Docker network 내에 있어야 호출이 가능
whoami
: Client 호출정보를 보여주는 간단한 서비스labels
을 통해whoami
서비스 Rule 등록- Host 기반 Rule 적용 :
"traefik.http.routers.whoami.rule=Host(
whoami.localhost)"
traefik.http.routers.<router_name>.rule=
- Docker Routers 규칙
- Rule 종류
- 서비스에 Port 가 노출 되어야 함 : Expose port (or Publish port)
version: '3'
services:
reverse-proxy:
# The official v2 Traefik docker image
image: traefik:v2.6
# Enables the web UI and tells Traefik to listen to docker
command: --api.insecure=true --providers.docker
ports:
# The HTTP port
- "80:80"
# The Web UI (enabled by --api.insecure=true)
- "8080:8080"
volumes:
# So that Traefik can listen to the Docker events
- /var/run/docker.sock:/var/run/docker.sock
whoami:
# A container that exposes an API to show its IP address
image: traefik/whoami
labels:
- "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
# reverse-proxy 서비스 시작
$ docker-compose up -d reverse-proxy
# whoami 서비스 시작
$ docker-compose up -d whoami
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e457ff5e01cb traefik/whoami "/whoami" 59 minutes ago Up 59 minutes 80/tcp traefik_whoami_1
Dashboard Router 확인
Test
$ curl -H Host:whoami.localhost localhost
Hostname: e457ff5e01cb
IP: 127.0.0.1
IP: 172.18.0.4
RemoteAddr: 172.18.0.3:56928
GET / HTTP/1.1
Host: whoami.localhost
User-Agent: curl/7.77.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 172.18.0.1
X-Forwarded-Host: whoami.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 4c17ac309109
X-Real-Ip: 172.18.0.1
Yaml 파일 분리
- Docker network 생성 후, 같은 Network 에서 서비스 시작
whoami
서비스에 replicas 적용 테스트
같은 Docker network 에 있어야 호출이 가능함
Port가 Expose만 되어도 호출이 가능하므로, 여러개의 인스턴스를 실행 할 수 있음
$ docker network create traefik_network
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
f27ea9f9e602 bridge bridge local
efde6948625c host host local
1ad7a260c513 none null local
fdd561c514ee traefik_network bridge local
reverse-proxy
version: '3'
services:
reverse-proxy:
# The official v2 Traefik docker image
image: traefik:v2.6
# Enables the web UI and tells Traefik to listen to docker
command: --api.insecure=true --providers.docker
ports:
# The HTTP port
- "80:80"
# The Web UI (enabled by --api.insecure=true)
- "8080:8080"
volumes:
# So that Traefik can listen to the Docker events
- /var/run/docker.sock:/var/run/docker.sock
networks:
default:
external:
name: traefik_network
whoami
version: '3'
services:
whoami:
# A container that exposes an API to show its IP address
image: traefik/whoami
labels:
- "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
deploy:
replicas: 4
networks:
default:
external:
name: traefik_network
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
95c2a5aea831 traefik/whoami "/whoami" 4 seconds ago Up 3 seconds 80/tcp traefik_whoami_3
406e1342044e traefik/whoami "/whoami" 4 seconds ago Up 3 seconds 80/tcp traefik_whoami_4
790f19b04598 traefik/whoami "/whoami" 4 seconds ago Up 3 seconds 80/tcp traefik_whoami_2
9d764c51212e traefik/whoami "/whoami" 4 seconds ago Up 3 seconds 80/tcp traefik_whoami_1
$ curl -s -H Host:whoami.localhost localhost | grep Hostname
Hostname: 790f19b04598
$ curl -s -H Host:whoami.localhost localhost | grep Hostname
Hostname: 95c2a5aea831
$ curl -s -H Host:whoami.localhost localhost | grep Hostname
Hostname: 9d764c51212e
$ curl -s -H Host:whoami.localhost localhost | grep Hostname
Hostname: 406e1342044e
댓글남기기