본문 바로가기

IT 인프라/도커

Docker Compose와 Networking (feat. DNS)

컨테이너 간 HTTP 송/수신을 수행할 때 IP와 Port를 어떻게 지정해야되니?

Docker Compose를 사용하면 컨테이너 간 통신을 하기 위해서 서비스 명을 도메인 이름으로 지정하여 네트워킹이 가능하다.

 

각 서비스를 기본적으로 브리지 네트워크에 연결하여, 네트워크 내에서 서비스 이름을 DNS를 통해 도메인 이름처럼 사용하여 통신할 수 있게한다.

 

여기서 의문점인 것은 브리지 네트워크는 무엇이며 컨테이너 간 도메인 이름을 어떻게 아는 것이지??

 

브리지 네트워크란?

브리지 네트워크는 기본적으로 하나의 물리적 네트워크 인터페이스를 여러 가상 네트워크 인터페이스로 분리하여, 각 컨테이너가 자신만의 네트워크 공간에서 동작하도록 합니다.

독립적인 네트워크 공간

  • 브리지 네트워크는 컨테이너를 외부 네트워크로부터 격리
  • 각 컨테이너는 동일한 브리지 네트워크 내의 다른 컨테이너와 통신할 수 있지만, 호스트나 외부 네트워크와는 통신하지 않음

IP 주소 할당

  • 브리지 네트워크 내의 각 컨테이너는 도커에 의해 자동으로 IP 주소를 할당
  • 이 IP 주소는 브리지 네트워크 내에서만 유효

서비스 간 통신

  • 동일한 브리지 네트워크에 속한 컨테이너들은 서로의 IP 주소나 서비스 이름을 사용해 통신

도커의 DNS 서비스는 어떻게 동작하는거야?

서비스 이름 등록

  1. Docker Compose에서 서비스를 정의하고 컨테이너를 시작
  2. Docker는 자동으로 해당 서비스 이름을 DNS 서버에 등록
  3. 이때, 서비스 이름은 해당 컨테이너의 IP 주소로 매핑

DNS 요청 처리

  1. 동일한 네트워크 내의 다른 컨테이너가 서비스 이름을 사용해 접근
  2. 도커의 DNS 서버는 해당 서비스 이름을 IP주소로 변환하여 반환

서비스 디스커버리

  1. 도커의 DNS 서비스는 브리지 네트워크 내에서 자동으로 컨테이너의 IP 주소를 관리
  2. 컨테이너가 재시작되거나 IP 주소가 변경되더라도, 서비스 이름을 통해 항상 올바른 컨테이너에 접근 가능

docker-compose.yml 파일 예제를 통한 도커 DNS 서비스 동작

version: '3'
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  api:
    build:
      context: ./api-service

서비스 이름 등록

  1. web, api 2개의 서비스 정의
  2. 도커는 web, api 2개의 서비스를 DNS 서버에 등록
  3. 서비스 이름은 해당 컨테이너의 IP 주소로 매핑

DNS 요청 처리

  1. api 서비스에서 web에 접근하기 위해서 'http://web:8080' 으로 요청

결론

Docker Compose를 사용하면, 복잡한 네트워크 설정 없이도 서비스 간의 통신을 손쉽게 할 수 있다😃