컨테이너 간 HTTP 송/수신을 수행할 때 IP와 Port를 어떻게 지정해야되니?
Docker Compose를 사용하면 컨테이너 간 통신을 하기 위해서 서비스 명을 도메인 이름으로 지정하여 네트워킹이 가능하다.
각 서비스를 기본적으로 브리지 네트워크에 연결하여, 네트워크 내에서 서비스 이름을 DNS를 통해 도메인 이름처럼 사용하여 통신할 수 있게한다.
여기서 의문점인 것은 브리지 네트워크는 무엇이며 컨테이너 간 도메인 이름을 어떻게 아는 것이지??
브리지 네트워크란?
브리지 네트워크는 기본적으로 하나의 물리적 네트워크 인터페이스를 여러 가상 네트워크 인터페이스로 분리하여, 각 컨테이너가 자신만의 네트워크 공간에서 동작하도록 합니다.
독립적인 네트워크 공간
- 브리지 네트워크는 컨테이너를 외부 네트워크로부터 격리
- 각 컨테이너는 동일한 브리지 네트워크 내의 다른 컨테이너와 통신할 수 있지만, 호스트나 외부 네트워크와는 통신하지 않음
IP 주소 할당
- 브리지 네트워크 내의 각 컨테이너는 도커에 의해 자동으로 IP 주소를 할당
- 이 IP 주소는 브리지 네트워크 내에서만 유효
서비스 간 통신
- 동일한 브리지 네트워크에 속한 컨테이너들은 서로의 IP 주소나 서비스 이름을 사용해 통신
도커의 DNS 서비스는 어떻게 동작하는거야?
서비스 이름 등록
- Docker Compose에서 서비스를 정의하고 컨테이너를 시작
- Docker는 자동으로 해당 서비스 이름을 DNS 서버에 등록
- 이때, 서비스 이름은 해당 컨테이너의 IP 주소로 매핑
DNS 요청 처리
- 동일한 네트워크 내의 다른 컨테이너가 서비스 이름을 사용해 접근
- 도커의 DNS 서버는 해당 서비스 이름을 IP주소로 변환하여 반환
서비스 디스커버리
- 도커의 DNS 서비스는 브리지 네트워크 내에서 자동으로 컨테이너의 IP 주소를 관리
- 컨테이너가 재시작되거나 IP 주소가 변경되더라도, 서비스 이름을 통해 항상 올바른 컨테이너에 접근 가능
docker-compose.yml 파일 예제를 통한 도커 DNS 서비스 동작
version: '3'
services:
web:
image: nginx
ports:
- "8080:80"
api:
build:
context: ./api-service
서비스 이름 등록
- web, api 2개의 서비스 정의
- 도커는 web, api 2개의 서비스를 DNS 서버에 등록
- 서비스 이름은 해당 컨테이너의 IP 주소로 매핑
DNS 요청 처리
- api 서비스에서 web에 접근하기 위해서 'http://web:8080' 으로 요청
결론
Docker Compose를 사용하면, 복잡한 네트워크 설정 없이도 서비스 간의 통신을 손쉽게 할 수 있다😃