[docker] Docker 를 사용한 가상 호스트 (Virtual Host) 구축 및 서브 도메인 연결

Docker 를 사용한 가상 호스트 (Virtual Host) 구축 및 서브 도메인 연결

도메인을 처음으로 구매하여 운영하려다 보니 생소한 점이 많다. 나의 경우 하나의 서버에서 서브 도메인을 활용하여 여러 서비스를 구동하고 싶었다. 예를 들면 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 업데이트가 되지 않는 문제 참고).

참고한 사이트

0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기
captcha
자동등록방지 숫자입력

기타

번호 제목 글쓴이 날짜 조회수
53 [Linux] local-hos-names 파일 - Configuration local-host-names 최고관리자 08-18 1,044
52 [Ubuntu] Mysql 외부접속이 안될 때 최고관리자 08-17 1,091
51 [Ubuntu] PHP PHP 7.4.22를 깔았는데 소스가 보이는 경우 최고관리자 08-17 2,065
50 [nginX] Nginx 413 Request Entity Too Large 에러 해결하기 최고관리자 07-21 1,143
49 [MySql] 성능최적화 최고관리자 07-06 1,033
48 [PHP] CentOS PHP Composer 설치 최고관리자 06-23 1,191
47 [Linux] Disk 및 폴더 용량 정보 확인 최고관리자 06-12 1,183
46 [Linux] find 명령어로 오래된 파일 삭제하기 최고관리자 06-12 2,771
45 [Git Server] [rejected] master -> master (fetch first) 에러해결 최고관리자 06-09 1,131
44 [Git Server] Interactive git shell is not enabled. 문제 해결 최고관리자 06-09 1,998
43 [IntelliJ] 많이 쓰이는 단축키 최고관리자 05-26 1,060
42 [IntelliJ] 단축키 최고관리자 05-24 1,226
41 [Flutter] 유용한 블로그 최고관리자 05-12 1,101
40 [구글맵] 다중마커 표시 최고관리자 05-05 1,461
39 [Firmware] STM8 STVD gdi-error 40201 문제 해결 최고관리자 04-03 1,802
38 [Git] Local PC에서 소스폴더에서 Git Hub에 업로드 하는 방법 최고관리자 03-13 1,176
37 [Linux] netstat - 네트워크 통계정보 최고관리자 01-18 1,328
36 [Docker] Nginx 를 사용한 SubDomain(서브도메인) 분기 최고관리자 01-17 3,177
35 [docker] 도커 컴포즈란? 예제 및 기본 사용법 (docker-compose) 최고관리자 01-15 1,331
34 [docker] docker-compse를 활용하여 완벽한 개발 환경 구성하기 최고관리자 01-15 1,261