https://docs.docker.com/get-started/docker-concepts/running-containers/publishing-ports/#publishing-to-ephemeral-ports


https://youtu.be/9JnqOmJ96ds

Explanation

지금까지 가이드들을 따라 학습했다면, 컨테이너는 application의 각 component들을 위한 격리된 프로세스들을 제공한다는 것을 앎. 각 component(React Frontend, Python API, Postgres DB)는 host 머신에서 다른 것들과 완전히 격리된 채로 자신의 고유 sandbox 환경에서 실행됨. 이러한 격리는 의존성 관리 및 보안성에는 좋으나 그것들을 직접적으로는 access할 수 없음을 의미함(EX. 브라우저에서 웹앱에 접근 X)

여기서 port publishing이 등장함

Publishing Ports

publishing port는 전달 규칙(forwarding rule)을 설정하여 약간의 네트워크 격리를 돌라할 수 있는 능력을 제공. 예를 들면, host의 포트 8080으로의 요청을 컨테이너 포트 80으로 전달하게끔 명시 가능. publishing port는 docker run 명령어와 함께 -p(: —publish) flag를 사용해 컨테이너를 생성하는 동안 발생함

docker run -d -p HOST_PORT:CONTAINER_PORT nginx

예를 들면, 컨테이너 포트 80을 호스트 포트 8080에 publish하려면 :

docker run -d -p 8080:80 nginx

이제, 호스트 머신에 대한 8080 포트에 전송되는 트래픽들은 컨테이너의 80 포트로 전달됨

<aside> 🥕

포트가 publish될 때, 기본값으로 모든 네트워크 인터페이스에 publish됨. 이는 우리의 머신에 도달한 트래픽들이 publish된 애플리케이션에 액세스할 수 있음을 의미. 데이터베이스나 민감 정보들을 publish할 때는 주의 필요. Learn more about published ports here.

</aside>

Publishing to ephemeral(일시적) ports

때로, 우리는 host 포트를 몇 번을 사용하는 지 생각하지 않으면서 간단히 포트를 publish하기를 바랄 수 있음. 이런 경우엔, Docker가 포트를 선택하도록 할 수 있음. 그러기 위해선, 간단히 HOST_PORT 설정을 생략하면 됨

예를 들면, 다음 명령어는 컨테이너의 포트 80를 host의 일시적 포트에 publish 할 수 있음 :

docker run -p 80 nginx

컨테이너가 실행되면, docker ps 명령을 사용해 선택된 포트를 보여줄 수 있음 :

docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS          PORTS                    NAMES
a527355c9c53   nginx         "/docker-entrypoint.…"   4 seconds ago    Up 3 seconds    0.0.0.0:54772->80/tcp    romantic_williamson

Publishing all ports