Search

Publishing and exposing ports

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
Shell
복사
- HOST_PORT : 트래픽을 받기 위한 host머신에 대한 port number - CONTAINER_PORT : 연결을 수신하는 컨테이너 내의 port number
예를 들면, 컨테이너 포트 80을 호스트 포트 8080에 publish하려면 :
docker run -d -p 8080:80 nginx
Shell
복사
이제, 호스트 머신에 대한 8080 포트에 전송되는 트래픽들은 컨테이너의 80 포트로 전달됨
포트가 publish될 때, 기본값으로 모든 네트워크 인터페이스에 publish됨. 이는 우리의 머신에 도달한 트래픽들이 publish된 애플리케이션에 액세스할 수 있음을 의미. 데이터베이스나 민감 정보들을 publish할 때는 주의 필요. Learn more about published ports here.

Publishing to ephemeral(일시적) ports

때로, 우리는 host 포트를 몇 번을 사용하는 지 생각하지 않으면서 간단히 포트를 publish하기를 바랄 수 있음. 이런 경우엔, Docker가 포트를 선택하도록 할 수 있음. 그러기 위해선, 간단히 HOST_PORT 설정을 생략하면 됨
예를 들면, 다음 명령어는 컨테이너의 포트 80를 host의 일시적 포트에 publish 할 수 있음 :
docker run -p 80 nginx
Shell
복사
컨테이너가 실행되면, 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
Shell
복사
여기서는, 앱이 54772 포트에서 host에게 노출됨(exposed)

Publishing all ports

컨테이너 이미지를 생성할 때, EXPOSE 지침(instruction)은 패키지된 애플리케이션이 명시된 포트를 사용하게끔 명시하게 위해 사용됨. 이러한 포트들은 기본적으로 publish되지 않음
-P 또는 —publish-all 플래그를 사용하면, 자동적으로 모든 노출된 port들을 일시적 포트에 publish할 수 있음. 이는 우리가 개발 및 테스트 환경에서 포트 충돌을 피하려고 할 때 유용함
예를 들면, 다음 명령은 이미지에 의해 구성된 모든 노출된 포트들을 publish함 :
docker run -P nginx
Shell
복사

Try it out

이번 가이드에서, 웹 애플리케이션을 배포하기 위해 CLI랑 Docker Compose를 사용해 컨테이너 포트들을 publish하는 법을 배울 예정

Use the Docker CLI

이번 step에서, Docker CLI를 사용해 컨테이너를 실행하고 포트를 publish할 예정
1.
도커 Desktop Download and install
2.
터미널에서, 새 컨테이너를 시작하기 위해 다음 명령어를 실행 :
docker run -d -p 8080:80 docker/welcome-to-docker
Shell
복사
8080은 호스트 포트를 나타냄. 컨테이너 내에서 실행되는 애플리케이션을 접근(access)하기 위해 사용될 local machine의 포트임. 80은 컨테이너 포트를 나타냄. 컨테이너 내 애플리케이션이 들어오는 연결들에 대해 수신하는 포트임. 따라서, 해당 명령은 호스트의 포트 8080을 컨테이너 시스템의 포트 80에 바인딩함
3.
Docker Desktop Dashboard의 Containers로 이동해 publish된 포트를 확인 가능
가장 아래 컨테이너가 정상적으로 실행중임을 확인 가능
4.
http://localhost:8080에 접속해 웹사이트를 열기

Use Docker compose

해당 예제는 동일 애플리케이션을 Docker Compose를 이용해 출시할 예정
1.
새 폴더를 만들고 해당 폴더에서, compose.yml 파일을 다음 내용들로 생성함 :
services: app: image: docker/welcome-to-docker ports: - 8080:80
YAML
복사
ports 구성은 포트 정의를 위해 문법의 다른 형태들을 받아들임. 이번 경우엔, docker run 명령에서 사용되는 동일한 HOST_PORT:CONTAINER_PORT 를 사용중
2.
터미널을 열고 이전 step에서 생성한 폴더로 이동
3.
docker compose up 명령을 통해 애플리케이션을 실행

Next steps

이제 포트를 게시하고 노출시키는 방법을 알았으므로, docker run 명령을 사용해 컨테이너 기본값을 재정의하는 방법을 배울 수 있음