본문 바로가기
WIKI 기술 지식 베이스

Docker Swarm에서 Traefik으로 서비스 노출하기 - 기본편

원문 보기 위키 갱신

출처: Docker Swarm에서 Traefik으로 서비스 노출하기 - 기본편 (Exposing Services with Traefik on Docker Swarm - Basic)

본문

Docker Swarm에서 Traefik으로 서비스 노출하기 - 기본편

이 가이드는 Docker Swarm을 써서 Traefik 프록시로 서비스를 노출하는 일을 시작하게 도와줘요. HTTP 트래픽을 라우팅하는 기본기, 경로(Path) 기반 라우팅 구성, 그리고 TLS로 서비스를 안전하게 지키는 법까지 배우게 됩니다.

사전 준비물

  • 초기화된 Docker Swarm 클러스터

  • Docker Swarm 개념에 대한 기본 이해

  • Traefik Docker Swarm 셋업 가이드를 따라 Traefik을 배포해 둔 상태

첫 HTTP 서비스 노출하기

whoami 애플리케이션을 써서 간단한 HTTP 서비스를 노출해 볼게요. 백엔드 서비스로 가는 기본 라우팅을 보여주는 예시입니다.

먼저, 아직 없다면 기존 docker-compose.yml 파일을 갱신하세요:

services:
  whoami:
    image: traefik/whoami
    networks:
      - traefik_proxy
    deploy:
      replicas: 3
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.whoami.rule=Host(`whoami.swarm.localhost`)"
        - "traefik.http.routers.whoami.entrypoints=web,websecure"

이걸 docker-compose.yml로 저장하고 스택을 배포하세요:

docker stack deploy -c docker-compose.yml traefik

서비스 확인하기

이제 서비스가 http://whoami.swarm.localhost/ 에서 동작해요. 잘 되는지 테스트해 볼게요:

curl -H "Host: whoami.swarm.localhost" http://localhost/

다음과 비슷한 출력이 보일 거예요:

Hostname: whoami.1.7c8f7tr56q3p949rscxrkp80e
IP: 127.0.0.1
IP: ::1
IP: 10.0.1.8
IP: fe80::215:5dff:fe00:c9e
RemoteAddr: 10.0.1.2:45098
GET / HTTP/1.1
Host: whoami.swarm.localhost
User-Agent: curl/7.68.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 10.0.1.1
X-Forwarded-Host: whoami.swarm.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 5789f594e7d5
X-Real-Ip: 10.0.1.1

이 출력이 확인해 주는 건, Traefik이 요청을 여러분의 whoami 애플리케이션까지 제대로 라우팅했다는 뜻이에요.

라우팅 규칙 추가하기

이제 URL 경로에 따라 트래픽을 서로 다른 서비스로 보내도록 라우팅을 확장해 볼게요. API 버저닝, 프론트엔드/백엔드 분리, 마이크로서비스 정리에 유용하게 쓸 수 있죠.

docker-compose.yml에 다른 서비스를 추가로 넣어 갱신하세요:

# ...

# New service
  whoami-api:
    image: traefik/whoami
    networks:
      - traefik_proxy
    environment:
      - WHOAMI_NAME=API Service
    deploy:
      replicas: 2
      labels:
        - "traefik.enable=true"
        # Path-based routing
        - "traefik.http.routers.whoami-api.rule=Host(`whoami.swarm.localhost`) && PathPrefix(`/api`)"
        - "traefik.http.routers.whoami-api.entrypoints=web,websecure"
        - "traefik.http.routers.whoami-api.service=whoami-api-svc"
        - "traefik.http.services.whoami-api-svc.loadbalancer.server.port=80"

# ...

변경 사항을 적용하세요:

docker stack deploy -c docker-compose.yml traefik

경로 기반 라우팅 테스트하기

서로 다른 경로가 서로 다른 서비스로 가는지 확인해 볼게요:

# Root path should go to the main whoami service
curl -H "Host: whoami.swarm.localhost" http://localhost/

# /api path should go to the whoami-api service
curl -H "Host: whoami.swarm.localhost" http://localhost/api

/api 요청에서는 환경 변수 부분에 "API Service"가 보이는데, 이 응답이 경로 기반 라우팅이 제대로 동작한다는 증거예요.

TLS 활성화하기

TLS를 추가해서 서비스를 HTTPS로 지켜볼게요. 먼저 로컬 개발용 자체 서명(self-signed) 인증서부터 시작합니다.

자체 서명 인증서 만들기

자체 서명 인증서와, 인증서가 어디 있는지 Traefik에 알려 주는 동적 구성 파일을 생성하세요:

mkdir -p certs

# key + cert (valid for one year)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout certs/local.key -out certs/local.crt \
  -subj "/CN=*.swarm.localhost"

# dynamic config that tells Traefik where the cert lives
cat > certs/tls.yml <<'EOF'
tls:
  certificates:
    - certFile: /certificates/local.crt
      keyFile:  /certificates/local.key
EOF

인증서 파일용 Docker config를 만드세요:

docker config create swarm-cert.crt certs/local.crt
docker config create swarm-cert.key certs/local.key
docker config create swarm-tls.yml certs/tls.yml

docker-compose.yml 파일을 다음 변경 사항들로 갱신하세요:

# Add to the Traefik command section:
command:
  # ... existing commands ...
  - "--entryPoints.websecure.address=:443"
  - "--entryPoints.websecure.http.tls=true"
  - "--providers.file.directory=/etc/traefik/dynamic"
# Add to the root of your docker-compose.yml file:
configs:
  swarm-cert.crt:
    file: ./certs/local.crt
  swarm-cert.key:
    file: ./certs/local.key
  swarm-tls.yml:
    file: ./certs/tls.yml

스택을 배포하세요:

docker stack deploy -c docker-compose.yml traefik

브라우저에서 https://whoami.swarm.localhost/ 로 서비스에 접속할 수 있어요. 자체 서명 인증서라 보안 경고를 수락해야 합니다.

다음 단계

이제 Docker Swarm에서 Traefik으로 서비스 노출의 기본기를 익혔으니, 미들웨어, Let's Encrypt 인증서, 스티키 세션, 다중 레이어 라우팅 같은 고급 기능을 살펴볼 준비가 됐어요.

고급 가이드로 이어서 다음을 배워 보세요:

  • 보안과 접근 제어를 위한 미들웨어 추가하기

  • Let's Encrypt로 인증서 생성하기

  • 상태 유지 애플리케이션을 위한 스티키 세션 구성하기

  • 인증 기반 라우팅을 위한 다중 레이어 라우팅 구성하기

더 알아보기 (Learn more)