Docker nginx proxy 구성

오늘 종강기념으로 기존의 서버 (windows server 아래 가상화로 ubuntu Server 18.04 LTS) 를 그냥 밀어버리고 했다. windows 에 가상운영체제를 돌리다 보니 아무래도 메모리가 계속해서 부족했기 때문에…

따라서 Ubuntu Server 20.04 LTS 를 서버에 설치하고 위에 Docker로 기존의 blog.oseonsik.com 과 oseonsik.com 을 운용하기 위해 두개의 컨테이너가 필요할 것이라고 생각하고 간단하게 구성하던 중 여러 포트를 개방하는 것에 대한 보안적인 측면에서의 걱정과 더불어 그냥 깔끔하지 못하다고 생각했다.

따라서 nginx-proxy 를 구성해야겠다고 생각했다. 하지만 직접 하기는 싫어서 이미 만들어진
nginx-proxy 컨테이너를 활용하기로 했다.
처음에 계속해서 서브도메인을 test.oseonsik.com으로 지정해서 시도했는데 계속해서 안되었고 이유를 찾느라 삽질을 하다 불현듯 생각이 들었는데 애초에 test.oseonsik.com이라는 도메인으로 dns 설정을 해뒀었다. 지우니까 진짜 쉽게 잘 됐다. (2~3시간 정도 삽질했는데 이 글을 읽는 사람은 나같은 실수를 하지 않기를…)

이어서 이번엔 인증서 발급에 문제가 생겼다. 프록시 컨테이너에 인증서를 발급해서 사용하려 했으나 이게 정상적인 방법인지에 대한 확신도 없을 뿐더러 이미 80번 포트가 사용 중이라며 80포트 바인딩을 하지 않는 상태에서 재시도를 해야했고 따라서 일단 도커가 아닌 메인 운영체제에서 인증서를 발급받아서 각 인증서를 발급받은 디렉토리를 각 컨테이너에서 공유하자! 라고 생각하고 인증서를 발급하려고 했으나 이번에는 정확하지는 않지만 certbot-auto가 Ubuntu 20.04 LTS 와 관련에서 이슈가 있는 것 같다. 따라서 방황을 하다 또 다른 방법을 찾았다.

컨테이너를 활용해 인증서를 발급하여 사용하는 것 같은데 정확히 어떤 방법으로 해결되는 건지 정확하게는 모르겠다. 나는 외부에서 내 서버 도메인으로 https 프로토콜을 통해 접속하게 되면
ACME(Automate Certificate Management Environment)라는 환경 즉 인증서가 발급되어
있는 컨테이너(letsencrypt-nginx-proxy-companion)에 접속하여 nginx-proxy 컨테이너로 포워딩되고 이후 reverse proxy 서버가 내부에서 데이터를 받은 후 클라이언트에게 전달해주는 구조라고 생각했으나 정작 컨테이너를 실행시키고 바로 https 로 접속하니 잠시 시간이 걸리고 인증서가 발급되는 시간이 proxy되는 각 서비스들마다 시간이 따로 걸려서 하나로 통합되어 관리되는 것은 아닌 것 같아 어떻게 되는지 더욱 더 모르겠다…

아무튼 결론적으로 위 사진과 같은 구조로 서버가 구축된 것 같다. 고수가 있다면 제발 댓글로 저를 도와주세요. 정확하게 이해하고 싶습니다… 흑.. 흑…

nginx-proxy container 실행

$ docker run -d -p 80:80 -p 443:443 --name 컨테이너 이름 --restart always -v nginx_certs:/etc/nginx/certs -v nginx_vhost:/etc/nginx/vhost.d -v nginx_html:/usr/share/nginx/html -v nginx_conf:/etc/nginx/conf.d -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy

letsencrypt-nginx-proxy-companion
container실행

$ docker run -d --name 컨테이너 이름 --volumes-from nginx-proxy --volume /var/run/docker.sock:/var/run/docker.sock:ro jrcs/letsencrypt-nginx-proxy-companion

nginx container 실행

$ docker run -d --name 컨테이너 이름 --restart always -e VIRTUAL_HOST=도메인 -e LETSENCRYPT_HOST=도메인 -e LETSENCRYPT_EMAIL=이메일 nginx

wordpress DB container 실행

$ docker run --detach --name 컨테이너 이름 --restart always -v /var/docker/wordpress_db:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=비밀번호 -e MYSQL_DATABASE=wordpress mysql

wordpress container 실행

$  docker run -d --name 컨테이너 이름 --restart always -e VIRTUAL_HOST=도메인 -e LETSENCRYPT_HOST=도메인 -e LETSENCRYPT_EMAIL=이메일 -e WORDPRESS_DB_PASSWORD=비밀번호 --link DB컨테이너 이름:mysql wordpress 

참고 사이트

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다