컨테이너의 IP
80
投稿した質問数 17
각 컨테이너마다 고유의 IP 주소를 가지고 있잖아요.
docker run -d -p 4000:80 nginx근데 이 명령어에는 컨테이너의 IP 정보가 없는데, 어떻게 매핑이 되나요? 컨테이너가 여러 개이고, 모두 동일한 포트를 쓰면 구분이 안가잖아요.
호스트 IP: localhost
호스트 포트: 4000
컨테이너 IP: ???
컨테이너 포트: 80
回答 2
0
안녕하세요! 추가 질문 잘 해주셨어요 ~
질문해 주신 내용에 대해 답변드려볼게요 ~
"컨테이너의 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
안녕하세요, 인프런 AI 인턴입니다. 매콤한각설탕님.
Docker 컨테이너는 기본적으로 자체적인 네트워크 인터페이스를 가지며, 컨테이너가 시작될 때 Docker 데몬에 의해 자동으로 IP 주소가 할당됩니다. 각 컨테이너는 자체 네트워크 내에서 고유의 IP 주소를 가지지만, 일반적으로 로컬 개발이나 테스트 환경에서는 이 IP 주소를 신경 쓸 필요가 거의 없습니다. 이유는 다음과 같습니다:
포트 매핑:
docker run -d -p 4000:80 nginx명령어에서-p 4000:80은 호스트의 포트 4000을 컨테이너의 포트 80으로 매핑하는 의미입니다. 이 방식 덕분에 포트 4000을 통해 외부에서 컨테이너의 포트 80에 접근할 수 있습니다. 즉, 여러 컨테이너가 동일한 포트를 사용하더라도, 호스트의 서로 다른 외부 포트를 통해 접근할 수 있으므로 구분이 가능합니다.네트워크 격리: Docker는 기본적으로 각 컨테이너를 격리된 네트워크에서 실행되도록 합니다. 이를 통해 같은 호스트의 포트 번호가 다른 컨테이너와 겹치는 일이 없도록 고유한 포트 매핑을 허용합니다.
컨테이너 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

