Docker에서 노출과 포트 간 차이

Isaac Tony 2023년1월30일
  1. Docker의 EXPOSE DockerFile 명령
  2. Docker Compose 포트
Docker에서 노출과 포트 간 차이

Docker에서 docker create 또는 docker run을 사용하여 컨테이너를 만든 후 컨테이너가 외부 서비스 또는 기타 외부 컨테이너와 상호 작용하기를 원할 수 있습니다. 이를 달성하기 위해 외부 세계에서 포트를 사용할 수 있도록 해야 합니다.

이 기사에서는 Docker에서 포트를 노출하는 데 사용할 수 있는 두 가지 중요한 방법을 소개합니다. 또한 컨테이너 포트를 호스트 포트에 매핑하는 방법과 방법의 차이점에 대해서도 설명합니다.

Docker의 EXPOSE DockerFile 명령

도커 파일은 docker build 명령을 사용하여 이미지를 조합하기 위한 지침을 지정하는 단순히 텍스트 파일입니다. 그 중에는 EXPOSE 명령어가 있습니다.

EXPOSE 명령어는 우리가 빌드 중인 컨테이너가 런타임에 특정 네트워크 포트에서 수신 대기해야 함을 Docker에 알리는 데 사용됩니다. 그러나 이 명령은 참조점일 뿐이며 컨테이너 포트를 호스트 포트에 매핑하지 않습니다.

통사론:

EXPOSE <port>/<protocol>

Docker는 기본 TCP 프로토콜을 사용할 수 있으므로 프로토콜을 지정할 필요가 없습니다. 그러나 UDP 프로토콜과 같은 다른 프로토콜을 제공할 수 있습니다.

Nginx 공식 docker 파일에 프로토콜이 지정되어 있지 않기 때문에 Docker는 기본 TCP 프로토콜을 사용합니다.

COPY docker-entrypoint.sh /
COPY 10-listen-on-ipv6-by-default.sh /docker-entrypoint.d
COPY 20-envsubst-on-templates.sh /docker-entrypoint.d
COPY 30-tune-worker-processes.sh /docker-entrypoint.d
ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 80
STOPSIGNAL SIGQUIT
CMD ["nginx", "-g", "daemon off;"]

Docker 레지스트리에서 공식 Nginx 이미지를 가져와서 컨테이너를 만들고 컨테이너를 실행한다고 가정합니다. 이 경우 포트 번호 및 사용된 프로토콜과 같은 유용한 정보를 컨테이너에서 신속하게 결정할 수 있습니다.

~/isaac$ docker ps -a

출력:

CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
99edfdea0443   nginx     "/docker-entrypoint.…"   3 minutes ago   Up 2 minutes   80/tcp    nice_volhard

위의 출력은 Nginx 컨테이너가 Dockerfile 및 TCP 프로토콜에 명시된 대로 포트 80에서 실행됨을 보여줍니다.

또는 아래와 같이 컨테이너를 생성할 때 --expose 태그를 사용하여 런타임에 포트를 노출할 수도 있습니다.

docker run --expose 80 nginx

이제 이 포트를 호스트 포트 번호에 바인딩합니다. 대문자 -P 태그 또는 소문자 -p 태그를 사용해야 합니다.

둘 중 하나를 사용하여 결과를 얻을 수 있지만 이러한 태그에는 상당한 차이가 있습니다.

대문자 -P 태그를 런타임에 사용하면 노출된 모든 태그를 호스트의 임의 포트에 바인딩할 수 있습니다. 이를 통해 포트에서 충돌을 피할 수 있습니다.

$ docker run -d -P nginx
006b88a06e51eac45895f13b33a89221676029e8fa654aaaccc79b81f74efb4d

암호:

isaac$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS                   NAMES
006b88a06e51   nginx     "/docker-entrypoint.…"   27 seconds ago   Up 6 seconds   0.0.0.0:49153->80/tcp   angry_babbage

소문자 -p 태그를 사용하여 호스트의 특정 포트에 컨테이너를 게시할 수도 있습니다.

Docker Compose 포트

Docker-compose는 Docker에서 다중 컨테이너 애플리케이션을 실행할 수 있게 해주는 유틸리티 도구입니다.

docker-compose.yml 파일에서 서비스, 파일 버전, 사용된 볼륨 및 서비스를 연결하는 네트워크와 같은 다른 파일 간에 컨테이너를 구성하는 방법을 지정할 수 있습니다.

Dockerfile에서 포트 번호를 지정한 것처럼 docker-compose.yml 파일에서도 포트 번호를 지정해야 합니다. expose 또는 ports 명령어를 사용하여 이를 수행할 수 있습니다.

rabbitmq:
   image: rabbitmq
   expose: 
        - 3000
        - 5000

expose 명령어를 사용하면 포트를 게시하거나 호스트 포트에 바인딩하지 않고 포트를 노출할 수 있습니다. 즉, 포트는 호스트 시스템에 노출되지 않고 다른 서비스에만 노출됩니다.

반면에 ports 명령어를 사용하면 호스트 및 컨테이너 포트 번호를 모두 지정할 수 있습니다. 게다가 이러한 포트는 다른 서비스 간에 공유되고 호스트 시스템에 임의의 또는 지정된 포트에 노출됩니다.

rabbitmq:
   image: rabbitmq
   ports: 
        - "8000:80"
        - "5000: 70"
작가: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn