도커를 외부와 연결하는 방법 (윈도우 인바운드 규칙 및 프로그램 규칙)
도커에서 포트를 열고자 할 때는 인바운드 규칙 프로그램 규칙 두 가지를 다 열어야한다.
인바운드로 포트와 아이피를 열어주는 것뿐만이 아닌 Docker Desktop Backend.exe (프로그램)의 포트 또한 오픈해야한다.
방법은 다음과 같다.
1. 도커에서 어떤 서버든 어떤 포트튼 상관없이 본인이 원하는 포트명으로 ${호스트 포트}:${컨테이너 포트}로 매핑한다.
이는 도커 내에서의 포트 포워딩 개념이므로 맨 처음에 한 번만 잘 설정해두면 건들 일이 없고 ${호스트 포트}만 기억하면 된다.
2. 공유기에서 포트 포워딩을 설정한다.
포트 포워딩은 공유기 벤더마다 약간씩 다르지만 기본적으로 크게 다르지않다.
그리고 개념적으로 헷갈리기 쉬우므로 확실하게 분리해서 생각해야 한다.
서비스 이름 : 본인이 구별하기 좋은 어떤 이름으로 사용해도 좋다.(arbitrary)
외부 포트 : 외부 포트 또한 arbitrary로 어떤 포트를 사용해도 상관이 없지만 well known port는 지양하는 것이 좋다.
여기서 포트는 내 로컬 IP가 아닌 외부 IP에 붙는 포트를 의미한다.
예를 들어 외부 포트에서 23323은 ${나의 외부 IP}:23323을 의미한다.
내부 포트 & 내부 IP 주소 : 내부 포트는 바로 옆의 내부 IP 주소와 쌍을 이루는 주소로, 내부 IP 주소는 공유기 내에서 관리하는 머신들 각각의 Virtual IP이다.
본인의 외부 IP 즉 유일하게 외부로 노출되는 IP를 확인하는 방법은 https://www.whatsmyip.org/
로 들어가도 되고 네이버나 구글 등의 "내 아이피 확인" 등으로 검색하면 바로 나오는 그 IP이다.
나의 Virtual IP를 확인하는 방법은 cmd에서 ipconfig 타이핑 후 나오는 IPv4 Address가 본인 머신의 특정 IP이다.
즉 대부분의 경우 내부 IP 주소는 본인 PC의 로컬 IP를 의미할 것이고 이때의 내부 포트는 docker에서 설정한 ${호스트 포트}를 의미한다.
즉 아래 설정을 한 줄로 요약하면 ${나의 외부 IP}:${외부 포트}를 ${내부 IP 주소}:${docker에서 설정한 호스트 포트}로 포트 포워딩한 것이다.
3. Docker Desktop Backend를 윈도우 방화벽 인바운드 규칙 설정하기
본인에게 가장 난관이었던 부분이었다. 구글링을 아무리 해봐도 전부 인바운드 아웃바운드 방화벽 얘기만 하는데 아무리 설정해도 열리질 않아 매우 답답했다.
해결의 실마리는 윈도우 방화벽을 해제하면 포트가 열린다는 것이었다.
이는 포트 포워딩과 도커의 설정에는 문제가 없고 윈도우 방화벽에서 문제가 생겼다는 의미였고
좀 더 구글링과 질문을 한 결과 문제의 원인이 포트 인바운드 규칙이 아니라 프로그램 인바운드 규칙에 있다는 것을 알아냈다.
방화벽 -> 고급 설정 -> 인바운드 규칙에 들어가면 다음과 같은 설정들이 보일 것이다.
Docker Desktop Backend가 여러개 보일 것인데 전부 똑같은 프로그램에 대한 인바운드 규칙을 다루는 것이고 프로토콜이나 포트의 차이에 대해서만 차이가 있다.
이때 반드시 주의해야 할 점은 프로그램 자체의 포트를 열어두는 것은 절대 현명하지 못 하므로 특정 프로그램의 특정 포트만 열어두는 것이다.
프로토콜 및 포트에서 ${docker에서 설정한 호스트 포트} (본인의 경우 8080번)를 로컬 포트에 세팅하는 것이다.
이때 로컬 포트는 말그대로 나의 포트, 원격 포트는 나에게 접속하고자 하는 상대방의 포트를 의미한다.
로컬 포트를 최소한으로 열어야 하므로 꼭 포트를 설정해서 열도록한다.(범위를 통해서 열 수도 있다.)
처음에는 외부 IP의 포트인 23323를 설정하려고 했었다..
내 컴퓨터는 언제나 본인의 가상 IP만 알고 있다고 생각하자.
그리고 마지막으로 고급탭에서 '공용'을 체크해야한다. 공용이 외부에서 접근할 수 있는 최소한의 범위이다.
접속 테스트 해보기
도커의 포트와 PC의 포트 연결, 공유기에서의 포트 포워딩, 윈도우 방화벽에서의 프로그램 인바운드 규칙 설정 등을 완료해주고 나면
http://${본인 외부 IP}:${공유기 포트 포워딩의 외부 포트}로 접속을 하면 성공적으로 접속이 되는 것을 확인 할 수 있다!!
결론
요즘 대세는 AWS와 같은 클라우드이지만 네트워크에 대한 기본 없이 클라우드를 사용하는건 언어도단으로 생각되어 기본 중 기본인 홈서버를 먼저 구축해보고자 했고
결론적으로 네트워크를 이해함에 있어 매우 큰 도움이 되는 것같다. 제대로 된 배포 시스템을 구축하기에는 아직 많은 길이 남았지만 내-외부 연결을 성공한 것에 대해 자축하며 자료로 남긴다.