inflearn logo
강의

講義

知識共有

非専門家でも理解できるDocker入門/実践

コンテナ(Container)の作成 / 実行 - 2

컨테이너의 IP

80

k454656922662

投稿した質問数 17

0

각 컨테이너마다 고유의 IP 주소를 가지고 있잖아요.

docker run -d -p 4000:80 nginx

근데 이 명령어에는 컨테이너의 IP 정보가 없는데, 어떻게 매핑이 되나요? 컨테이너가 여러 개이고, 모두 동일한 포트를 쓰면 구분이 안가잖아요.


호스트 IP: localhost

호스트 포트: 4000

컨테이너 IP: ???

컨테이너 포트: 80

 

 

docker docker-compose docker-volume docker-image container ecr

回答 2

0

jscode

안녕하세요! 추가 질문 잘 해주셨어요 ~

질문해 주신 내용에 대해 답변드려볼게요 ~

 

"컨테이너의 IP 정보가 없는데, 어떻게 매핑이 되나요? 컨테이너가 여러 개이고, 모두 동일한 포트를 쓰면 구분이 안가잖아요."

-> 결론부터 말씀드리면, -p 옵션을 사용한 포트 매핑에서는 컨테이너 IP를 신경 쓸 필요가 없어요 !

그 이유는 Docker가 내부적으로 알아서 처리해주기 때문인데요, docker run 명령어로 컨테이너를 생성하면 Docker가 자동으로 해당 컨테이너에 내부 IP(예: 172.17.0.2)를 할당해줘요 !

그리고 -p 4000:80 옵션을 주면 Docker가 "호스트의 4000번 포트로 들어오는 요청을 이 컨테이너의 80번 포트로 보내줘"라는 규칙을 자동으로 만들어주는 거예요 !

이 과정에서 Docker는 해당 컨테이너의 내부 IP를 이미 알고 있기 때문에 우리가 직접 IP를 지정하지 않아도 알아서 매핑이 돼요 !

 

"컨테이너가 여러 개이고, 모두 동일한 포트를 쓰면 구분이 안가잖아요."

-> 이 부분도 걱정하지 않으셔도 돼요 !

nginx 컨테이너를 3개 띄운다고 하면 아래처럼 호스트 포트를 다르게 지정해주면 돼요 !

각 컨테이너는 독립적인 네트워크 네임스페이스를 가지고 있어서 구분이 돼요 !

docker run -d -p 4000:80 nginx # 컨테이너1: IP 172.17.0.2

docker run -d -p 5000:80 nginx # 컨테이너2: IP 172.17.0.3

docker run -d -p 6000:80 nginx # 컨테이너3: IP 172.17.0.4

이렇게 실행하면 세 개의 컨테이너가 모두 내부적으로는 80번 포트를 사용하지만, 각각 다른 IP 주소를 받아요 ~

그리고 호스트의 4000, 5000, 6000번 포트가 각 컨테이너의 80번 포트로 매핑되는 거죠 !

Docker는 "호스트 4000번으로 들어온 요청은 172.17.0.2:80으로 보내고, 5000번으로 들어온 요청은 172.17.0.3:80으로 보내자"라고 내부적으로 라우팅 규칙을 만들어줘요 !

즉, 컨테이너끼리는 내부 IP가 다르기 때문에 Docker 입장에서는 구분이 가능하고, 외부에서 접근할 때는 호스트 포트 번호로 구분하는 구조인 거죠!

정리하면, 컨테이너의 IP는 Docker가 자동으로 관리해주는 영역이라 우리가 직접 지정하거나 신경 쓸 필요 없이, 호스트 포트만 다르게 설정해주면 여러 컨테이너도 문제없이 사용할 수 있어요 :)

 

추가로 궁금하신 점 있으시면 언제든 편하게 추가 질문 남겨주세요~~

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 매콤한각설탕님.

Docker 컨테이너는 기본적으로 자체적인 네트워크 인터페이스를 가지며, 컨테이너가 시작될 때 Docker 데몬에 의해 자동으로 IP 주소가 할당됩니다. 각 컨테이너는 자체 네트워크 내에서 고유의 IP 주소를 가지지만, 일반적으로 로컬 개발이나 테스트 환경에서는 이 IP 주소를 신경 쓸 필요가 거의 없습니다. 이유는 다음과 같습니다:

  1. 포트 매핑: docker run -d -p 4000:80 nginx 명령어에서 -p 4000:80호스트의 포트 4000을 컨테이너의 포트 80으로 매핑하는 의미입니다. 이 방식 덕분에 포트 4000을 통해 외부에서 컨테이너의 포트 80에 접근할 수 있습니다. 즉, 여러 컨테이너가 동일한 포트를 사용하더라도, 호스트의 서로 다른 외부 포트를 통해 접근할 수 있으므로 구분이 가능합니다.

  2. 네트워크 격리: Docker는 기본적으로 각 컨테이너를 격리된 네트워크에서 실행되도록 합니다. 이를 통해 같은 호스트의 포트 번호가 다른 컨테이너와 겹치는 일이 없도록 고유한 포트 매핑을 허용합니다.

  3. 컨테이너 IP 주소의 자동 할당: 컨테이너가 시작되면, Docker는 브리지 네트워크를 통해 자동으로 IP 주소를 할당합니다. 이는 내부 네트워크에서의 통신을 지원하지만 외부에서의 접근은 포트 매핑을 통해서만 가능합니다.

관련하여 더 자세한 네트워크 및 포트 매핑 동작 원리에 대한 질문이 있다면, 아래 링크를 참고해 보세요:
- Docker에서 포트 매핑과 컨테이너 네트워크 이해하기

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

EC2 터미널에서 docker pull

0

64

2

AWS ECR

0

58

2

FROM openjdk:17-jdk 현재 기준 dockerhub에 없습니다

1

100

2

Redis 볼륨 설정?

0

117

2

도커 이미지를 만들 때 application.yml

0

105

2

compose.yml 관리

0

88

2

ECR 리포지토리에 이미지가 3개가 보입니다.

0

77

2

액세스 키 등록하는 시점 관련 질문이 있습니다.

0

83

1

depends_on에 따른 컨테이너 실행 순서

0

77

2

실제 웹 서비스 배포 시 질문

0

80

2

도커 volume 질문

0

67

3

HTTPS로도 받고 싶으면 docker compose에 443도 쓰면 될까요?

0

74

2

sql 볼륨 폴더 지우면 데이터베이스 데이터 날라가는거 아닌가요?

0

74

2

39강 도커파일 빌드 경로 질문이 있습니다.

0

71

2

도커파일 copy

0

70

2

실무에서 docker compose up --build를 할 때

0

190

2

mysql_data 폴더 내부에 다른 파일이 있는데도 잘 되는 경우

0

87

2

도커 허브에서 postgres 버전 확인하는 법

0

128

2

보충 자료와도 관련된 추가 내용

1

83

1

현업에서 MySQL은 RDS와 도커 볼륨 중 어떤 걸 사용하나요?

0

110

2

노션 자료에 안 보이는 이미지가 있습니다

0

101

1

도커 허브에서의 latest가 가장 최신인 게 맞나요?

0

121

2

docker image ls 실행 시 나오는 내용이 다릅니다

0

87

2

윈도우 볼륨 생성이 안됩니다.

0

78

2