docker

05. docker-compose 환경에서 임시 nginx proxy 구성하기

식피두 2020. 10. 21. 14:59

docker-compose로 서버 애플리케이션을 작성할 때,

테스트 목적 혹은 임시로 nginx를 띄워 proxy시켜야할 경우가 있다.

 

host os에 직접 nginx를 설치시켜 세팅해도 되지만,

nginx가 설치 되어있지 않는 경우엔 굳이 임시 용도로 설치 및 세팅해야하는 번거로움이 있다.

 

nginx 를 docker 이미지로 가져와 conf 파일을 이용하면

간편하게 구성이 가능하다.

 

직접 docker로 실행할 수도 있지만, docker-compose로 실행하는 것이 더 간편하니까...

 

아래와 같은 예시를 공유해 본다.

 

루트 폴더명이 example/ 일 때를 가정

 

중요한 것은 proxy 부분..

(nginx의 80번을 통해 worker 서비스의 22222번으로 우회시켜 주고 싶은 상황)

 

example/docker-compose.yml

version: "3.0"

services:
  worker:
    build:
      context: ./worker-app/
      dockerfile: Dockerfile
    image: worker-app:1.0.0
    restart: always 
    ports:
      - '22222:22222'
    deploy:
      mode: replicated
      replicas: 1
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "10"
    volumes:
    - /etc/localtime:/etc/localtime:ro
    - /data/example-log/logs:/root/example/logs

  proxy: 
    build:
      context: ./nginx/
      dockerfile: Dockerfile
    image: proxy:w1
    restart: always 
    ports:
      - '80:80'
    depends_on:
      - worker
    volumes:
      - /data/example-log/proxy:/var/log/nginx 

 

그 이후에,

example/nginx 디렉터리를 만들고

아래와 같은 파일 두 개를 위치 시킨다.

 

example/nginx/Dockerfile

FROM nginx

COPY nginx_proxy.conf /etc/nginx/conf.d/default.conf

WORKDIR /etc/nginx

VOLUME ["/var/log/nginx/"]

EXPOSE 80
EXPOSE 443

 

 

example/nginx/nginx_proxy.conf

upstream example {
        server example_worker_1:22222;
}

server {
        listen 80;
        server_name localhost; 

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        location / {
                proxy_pass http://example;
        }
}

upstream 서버 이름엔 현재 example_worker_1로 적어뒀는데

docker-compose up 을 통해 실행한 이후

docker ps에 서비스 이름이 어떤식으로 정의되는지 확인해 보면 된다.

 

보통은 루트폴더명_서비스명_숫자로 정의된다.

replicas를 3개 로 정의했다면 _1, _2, _3 으로!

(서비스명 = docker-compose.yml에 정의해놓은 서비스 이름 ex ; worker, proxy )

 

물론!

위와 같은 하드 코딩에 가까운 방식 (워커 개수 변경됨에 따라 conf도 바꿔야함) 말고도

더 나은 방식이 있다.

 

예를 들어, docker swarm을 이용하면 굳이 proxy를 두지 않더라도

80번 포트와 n 개의 워커들 간의

로드 밸런싱 등을 더 편하게 설정이 가능하다. 

 

추가로 찾아보니

아래 블로그에 해당 부분이 잘 나와있으니, 참고하면 좋을 듯 하다.

 

[번역]Haproxy와 Docker를 이용한 로드밸런싱

본 번역은 원글을 대상으로 저자의 허락을 받았습니다. 저와 같은 문제에 직면한 분들에게 도움이 되었으면 좋겠습니다. 본 글에서 사용하는 이미지인 dockercl

mrchypark.github.io