docker 포트 변경 및 포트대역 매핑하는 방법

docker

docker에서 컨테이너를 복사해서 여러개로 사용하다보면 포트를 변경해야할때가 있는데요. 도커에서 포트를 변경할수는 없습니다. 이럴때 우회해서 포트를 바꾸는방법과, 단일 포트가 아닌 4000~5000과 같이 포트범위을 매핑(포트 포워딩)하는 방법에 대해 알아봅니다.

도커 매핑 포트 변경하는 방법

Docker 컨테이너의 포트를 변경하려면 기존 컨테이너를 삭제(rm)하고 다시 생성하는 방식이 일반적입니다. 그런데 docker rm 명령어로 컨테이너를 삭제하면 데이터나 설정이 사라지기 때문에, 지금까지 저장한 정보를 저장한 현재 상태 그대로 유지하면서 포트만 변경하는 방법은 아래와 같은 순서로 진행하면 됩니다.

  1. docker commit으로 현재 상태를 새로운 이미지로 저장.
  2. 기존 컨테이너를 중지 및 삭제.
  3. 저장된 이미지를 기반으로 새로운 포트로 컨테이너 재생성.
  4. (선택) 데이터 볼륨을 사용하여 데이터의 영속성을 유지.

1. 컨테이너의 상태를 이미지로 저장 (commit)

현재 실행 중인 컨테이너의 상탤ㄹ 새로운 이미지를 만들면서 저장할 수 있습니다. 이를 통해 컨테이너를 삭제하고 다시 만들더라도 상태를 유지할 수 있습니다.

docker commit <컨테이너_이름_또는_ID> my-new-image

이 명령은 기존 컨테미너의 상태를 새로운 이미지 my-new-image로 저장합니다.

2. 기존 컨테이너 삭제

이제 기존 컨테이너를 삭제해도 데이터가 사라지지 않습니다. 컨테이너를 중지하고 삭제합니다:

docker stop <컨테이너_이름_또는_ID>
docker rm <컨테이너_이름_또는_ID>

3. 새로운 포트 매핑으로 컨테이너 재생성

앞에서 만든 이미지를 사용하여 새로운 포트로 컨테이너를 재생성합니다:

docker run -p <새로운_포트_매핑> --name <새_컨테이너_이름> my-new-image

예를 들어, 포트를 8080으로 변경하고 싶다면:

docker run -p 8080:80 --name my-new-container my-new-image

이렇게 하면 기존 컨테이너의 상태를 유지한 채 새로운 포트로 실행됩니다.

4. 데이터 볼륨을 사용하는 방법

또 다른 방법으로는 데이터 볼륨을 사용하여 데이터를 외부에 저장하는 것입니다. 이렇게 하면 컨테이너를 삭제하고 다시생성해도 데이터가유지됩니다. 예를 들어, 다음과 같이 볼륨을 사용합니다:

docker run -v /my/data:/data -p <새로운_포트_매핑> --name <새_컨테이너_이름> my-new-image

이렇게 하면 컨테이너가 삭제되더라도 /my/data 경로에 데이터가 남아 있어, 동일한 데이터로 새로운 컨테이너를 시작할 수 있습니다.

도커에서 포트범위로 매핑하기

Docker에서 호스트 시스템의 포트를 컨테이너 포트의 대역으로 포트 포워딩하는 방법은 -p 옵션을 사용하여 호스트와 컨테이너의 포트를 특정 범위로 매핑하는 방식으로이루어집니다. 이 방법은 호스트 시수템에서 여러 포트를 컨테이너 내부의 포트 범위에 일괄작으로 연결할 수 있습니다.

예를 들어, 호스트의 포트 범위 5000-5003을 컨테이너의 포트 범위 8080-8083으로 매핑하고자 할 때, 다음과 같은 명령어를 사용할 수 있습니다.

docker run -p 5000-5003:8080-8083 my-container

이 명령은 호스트의 포트 5000이 컨테이너의 8080 포트로, 호스트의 포트 5001이 컨테이너의 8081 포트로, 이런 식으로 순서대로 매핑됩니다.

주요 옵션:

  • -p: 호스트와 컨테이너 간의 포트 매핑을 설정하는 옵션입니다. 이 옵션 뒤에 호스트_포트:컨테이너_포트 형식으로 매핑을 지정합니다.
  • 대역으로 매핑할 때는 호스트와 컨테이너 포트 범위를 각각 포트_시작-포트_끝 형태로 지정합니다.

매핑된 포트들은 컨테이너 외부에서 접근 가능하게 되어, 호스트 시스템을 통해 해당 포트로 외부 요청을 받을 수 있게 됩니다.

각격 다수의 포트 매핑는 방법

Docker에서 호스트의 특정 포트(예: 80, 22, 443)를 각각 컨테이너의 포트와 매핑하려면, -p 옵션을 여러 번 사용하여 간단하게 각 포트를 개별적으로 매핑할 수 있습니다.

다음은 호스트의 포트 80, 22, 443을 컨테이너의 동일한 포트(80, 22, 443)로 매핑하는 예입니다:

docker run -p 80:80 -p 22:22 -p 443:443 my-container

이 명령어는 다음과 같이 동작합니다:

  • 호스트의 포트 80이 컨테이너의 포트 80으로 매핑됩니다.
  • 호스트의 포트 22가 컨테이너의 포트 22로 매핑됩니다.
  • 호스트의 포트 443이 컨테이너의 포트 443으로 매핑됩니다.

만약 컨테이너의 포트를 다르게 설정하고 싶다면, 다음과 같이 각각 다른 포트를 지정할 수도 있습니다:

docker run -p 80:8080 -p 22:2222 -p 443:8443 my-container

이 경우:

  • 호스트의 포트 80은 컨테이너의 포트 8080으로 매핑됩니다.
  • 호스트의 포트 22는 컨테이너의 포트 2222로 매핑됩니다.
  • 호스트의 포트 443은 컨테이너의 포트 8443으로 매핑됩니다.

이런 식으로 원하는 포트를 자유롭게 매핑할 수 있습니다.

단일포트와 포트범위를 혼용해 매핑하는 방법

Docker에서 호스트의 특정 포트(예: 80번)와 포트범위(예: 4000번부터 5000번까지)를 섞어서 매핑하는 방법은 개별 포트와 포트 범위를 함께 지정하면 됩니다.

예를 들어, 호스트의 포트 80번을 컨테미너의 80번으로 매핑하고, 호스트의 4000번부터 5000번까지의 포트 범위를 컨테이너의 4000번부터 5000번까지 매핑하려면 다음과 같이 작성할 수 있습니다:

docker run -p 80:80 -p 4000-5000:4000-5000 my-container

이 명령어는 다음과 같은 매핑을 수행합니다:

  • 호스트의 포트 80이 컨테이너의 포트 80으로 매핑됩니다.
  • 호스트의 포트 4000에서 5000까지가 컨테이너의 포트 4000에서 5000까지 매핑됩니다.

즉, 특정 포트와 포트 범위를 혼합해서 사용할수 있으며, 이 경우에도 -p 옵션을 사용하여 각각의 매핑을 설정하면 됩니다.