개인 홈서버에서 Portainer 기반으로 도커 컨테이너들을 굴리고 있습니다.
보통 전통적인 서버환경에서 여러 웹서비스들을 다양한 도메인에 연결해 굴리게 되면 역방향 프록시를 써서 교통정리를 하게 되는데요, 역방향 프록시를 쓴다면 원래의 네트워크 포트는 외부에서 접근하지 못하도록 조치를 해줘야 합니다.
Portainer나 docker로 웹서비스를 운용해본지 얼마 되지 않아서 이걸 잊고 원래의 포트도 개방해두고 있었는데요, 생각해보니 뭔가 찝찝해지더라구요.
아무튼 도커->역방향 프록시(nginx)->외부 같은 구조일 경우엔 도커에서 개방하는 포트는 localhost (127.0.0.1) 대상으로만 열어두고, nginx에서 “localhost:포트”를 역방향 프록시로 전달하면 됩니다.
다만 Portainer 포트를 열면 기본적으로 “0.0.0.0:포트” 형태로 열리기 때문에 외부에서도 접근이 가능해지게 됩니다.
그 예로 아래와 같이 host:9000 → container:8000 으로 설정해두면,
아래와 같이 0.0.0.0:9000 (IPv4), :::9000 (IPv6)과 같이 설정되므로 외부에 노출되어버립니다.
하지만 아래와 같이 호스트의 포트 값 앞에 127.0.0.1: 을 붙여두게 되면…
아래와 같이 호스트 내부에서만 포트를 활용할 수 있게 됩니다.
.
.
English
Basically Portainer publishes the ports as public(0.0.0.0). If you want to publish the ports as localhost(127.0.0.1) in the Portainer UI (without setting docker-compose.yml or docker command), just append “127.0.0.1:” in front of the host port like “127.0.0.1:4533”.