도커로 도메인 서비스 여러개 제공하기

오늘은 기존의 너의 하루는 프로젝트가 무르익은 것 같아, 배포를 위한 발판을 마련하고자 했다. 배포는 연구실에 있는 서버용 컴퓨터를 사용하기로 했다. 해당 서버는 도커가 깔려있어, 하나의 컴퓨터에서 여러개의 프로젝트를 배포운영할 수 있을 것 같았다.

아래 에서 아파치 서버를 이용하여 하나의 컴퓨터로 여러 프로젝트를 운영하는 것을 알려주었고, 도커를 이용한 방법 또한 언급을 했다. 참고한 블로그들은 아래와 같다.

Docker Reverse Proxy

https://hub.docker.com/r/jwilder/nginx-proxy

위 도커 이미지를 이용해서 진행을 하였다. 도커의 공식 이미지는 아니라, 이미지 관련 보안 문제에서 자유로울 수는 없지만, 프로젝트 규모가 작고, 리스크가 크지 않고, 직접 이미지르 만들어서 하는 것 보다는 리소스가 적게 들 것 같아서 그냥 사용하기로 했다.

그리고, docker-compose 에서 공식 사용 법을 아래와 같이 제공해주었다.

version: '2'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro

  whoami:
    image: jwilder/whoami
    environment:
      - VIRTUAL_HOST=whoami.local

위 컴포즈 파일을 분석하자면, container network를 따로 설정해주지 않았지만, default network로 묶여 있기 때문에, 두 가지 서비스 컨테이너 간의 연결이 구성된다. nginx-proxy 서비스 컨테이너는 proxy를 위한 컨테이너이고, 이 곳으로 80번 포트로 들어온 요청이 모두 들어간다. whoami 서비스 컨테이너는 실험용 컨테이너이고, whoami.local라는 도메인으로 들어온 요청을 받겠다는 설정이다.

하지만 나는 조금 다르게 사용하고자 했다. 위와 같이 구성하면, 서비스를 추가하고자할 때마다, 새로이 docker-compose 파일을 수정해주어야 하는 번거로움이 있다. 그래서 아래와 같이 바꾸어서 사용해보았다.

Docker-compose file

version: '3'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    restart: always
    networks: 
      - proxy                                             

networks:
  proxy:
    driver: bridge

nginx-proxy 컨테이너로, proxy를 위한 컨테이너만을 실행시키도록 하고, network를 proxt라는 이름으로 구성했다. 컨테이너를 하나만 실행하기에 command만으로 실행할 수도 있지만, 문서로 관리하는 것이 나중을 위해 나을 것 같기도 해서 굳이 그대로 compose로 사용한다.

그리고 서비스를 추가할 때는 아래와 같이 사용한다.

Run Project Container

docker run -dit --name nginx-test -e VIRTUAL_HOST=yourday.kro.kr --network reverseproxy_proxy nginx:alpine

이 두 옵션을 사용해서 yourday.kro.kr 도메인을 nginx-test라는 이름의 컨테이너로 요청을 보내게 할 수 있다.

VIRTUAL_HOST=yourday.kro.kr

—network reverseproxy_proxy

도커의 network들을 확인하고자 하면 아래와 같이 입력하면 된다.

docker network ls

위와 같이 command 로 입력해서 실행할 수 있지만, 아래와 같이 compose file로도 실행할 수 있을 것으로 기대한다. 하지만 되지 않을 지도 모르겠다

version: '2'

services:
  frondEnd:
    image: jwilder/whoami

  backEnd:
    image: jwilder/whoami
    environment:
      - VIRTUAL_HOST=yourday.kro.kr
		networks:
			- reverseproxy_proxy

아래와 같이 잘 실행되고 있음을 알 수 있다.

글을 마무리하며 종합적으로, 이렇게 구성하면, 굳이 서비스마다 서버의 http 포트를 열어주지 않아도 될 것 같아, 보안적으로도 괜찮지 않을까 하는 생각이 든다.

좋은 웹페이지 즐겨찾기