도메인을 처음으로 구매하여 운영하려다 보니 생소한 점이 많다. 나의 경우 하나의 서버에서 서브 도메인을 활용하여 여러 서비스를 구동하고 싶었다. 예를 들면 blog.youngbin.kim 에는 워드프레스를 설치하고, dev.youngbin.kim 에는 소스 코드 관리를 위해 Gogs 를 구동하는 식이다. 이 글에서는 docker 와 함께 서브 도메인을 사용하기 위하여 네임 서버를 설정하고 docker 환경을 설정하는 방법을 다루었다.

네임 서버(Name server) 설정

먼저 도메인을 관리하는 사이트에 가서 서브 도메인을 등록해 주어야 한다. 사용하는 도메인 업체의 웹페이지 등에서 DNS 관리 페이지를 찾을 수 있는데, 여기서 A 레코드를 추가해 준다. A 레코드는 Address record 로써, 도메인과 실제 ip 주소를 연결해 주는 역할을 한다. 따라서 A 레코드에는 도메인 이름과 IP 주소를 입력하도록 되어 있다. 우리는 서브 도메인을 기존의 서버에서 처리하고 싶은 것이므로, 서브 도메인의 이름을 입력하고 IP 주소는 서버의 IP 주소와 동일하게 입력한다. 입력 후 해당 서브 도메인으로 접속했을 때 루트 도메인으로 접속한 것과 같은 페이지가 나오면 된다.

Reverse Proxy 설정

이제 서브 도메인으로 들어오는 요청이 우리의 서버에 도착하도록 만들었으니, 다음으로는 요청된 주소에 따라 다른 페이지를 서비스하도록 설정해야 한다. 이렇게 하나의 서버에서 여러 개의 도메인을 호스트할 수 있도록 하는 것을 가상 호스트(Virtual host) 라고 부른다. 특히 나는 각각의 서비스를 docker 를 이용하여 실행할 것이므로 웹페이지 요청을 주소에 따라 다른 docker container 로 넘겨주는 기능이 필요하다. 고맙게도 이를 미리 구현해 둔 docker image 가 존재한다(nginx-proxy). 간단하게 살펴보니 nginx 는 프록시 웹 서버의 역할을 하며, docker-gen 으로 새로운 docker container 가 실행되거나 중지될때마다 프록시 서버의 정보를 업데이트해 준다. 다음과 같이 nginx-proxy 를 설치하여 구동할 수 있다.

docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy

위와 같이 nginx-proxy 를 실행하고 나서 브라우저에서 루트 도메인에 접속했을 때 503 Service Temporarily Unavailable 메시지가 나오면 정상적으로 설치된 것이다.

Docker Container 설정

마지막으로 어떤 주소를 어떤 container 로 전달할 것인지를 설정해야 한다. 이는 docker run 을 수행할 때 VIRTUAL_HOST 값을 설정해 줌으로써 가능하다. 앞서 설치했던 nginx-proxy 의 docker-gen 이 새로운 container 가 실행 될 때마다 해당 container 의 환경 변수에서 VIRTUAL_HOST 값을 읽은 후 이를 nginx 서버에 반영하는 것이다. 환경 변수는 -e 옵션을 통해서 전달한다. 예를 들어 내가 워드프레스를 blog.youngbin.kim 에 연결하였을 때는 다음과 같은 명령을 사용하였다.

docker run -d -e VIRTUAL_HOST=blog.youngbin.kim wordpress:latest

기타 옵션들 (다른 환경 변수 값이나 데이터베이스와 연결하는 옵션) 은 생략하였다. 위와 같이 수행한 후 서브 도메인 주소에 접속했을 때 올바른 페이지가 나오면 성공!

기타

  • docker 버전의 문제인지는 모르겠지만, 나의 경우 docker-compose 명령을 사용했을 때 VIRTUAL_HOST 가 반영되지 않는 문제가 있었다. docker logs <container> 를 이용하면 docker-gen 이 새로운 환경 변수를 성공적으로 읽어들이는지 확인할 수 있다 (업데이트: Docker-compose 시 virtual host 업데이트가 되지 않는 문제 참고).

참고한 사이트

카테고리:

업데이트: