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 개의 워커들 간의
로드 밸런싱 등을 더 편하게 설정이 가능하다.
추가로 찾아보니
아래 블로그에 해당 부분이 잘 나와있으니, 참고하면 좋을 듯 하다.
'docker' 카테고리의 다른 글
04. 반복 작업 속에서 docker build 시간이 오래 걸릴 때 (0) | 2020.10.21 |
---|---|
03. Docker 이미지 저장 경로 변경법 (0) | 2020.07.29 |
02. Docker-compose, Swarm (0) | 2020.07.29 |
01. Docker 기본 명령어 (0) | 2020.07.29 |