Published 2024. 3. 20. 22:05
컨테이너 내부에서 네트워크를 사용하여 다수의 컨테이너를 연결하고 실행 중인 애플리케이션을 로컬 호스트 머신에 연결해야합니다.
 

⁠Containers & Network Requests

컨테이너가 통신하는 대상은 여러 종류의 대상이 있을 수 있습니다.
 

컨테이너 내부에서 외부 인터넷으로 요청을 전송하는 경우

특별한 설정없이 바로 작동할 수 있습니다.
 

컨테이너와 로컬 호스트 머신 간 통신하는 경우

  • 위 도메인을 통해 도커 컨테이너 내부에서 알 수 있는 방식으로 호스트 머신의 IP주소로 변환됩니다.
  • 도메인을 작성하면 도커가 알아서 변환해줍니다.
  • host.docker.internal⁠을 URL, 즉 도메인으로 사용해야합니다.
 

컨테이너간 통신하는 경우

두 컨테이너는 일반적으로 통신할 수 없습니다.
 
아래 명령을 사용하면 도커 IPAddress를 찾을 수 있습니다.
docker container inspect <container-name>
 

 

이렇게 찾아낸 IP address를 등록할 수 있지만 mongodb://<your_ip_address>:27017/swfavorites mongodb 컨테이너를 업데이트하거나 ip 주소가 변경될 때마다 재빌드해야한다는 단점이 존재합니다. 따라서 이상적인 방식은 아닙니다.
 

Container Networks

다중 컨테이너가 있을 때 컨테이너간의 통신을 허용하는 것을 의미합니다.

docker run --network <network-name>를 통해 모든 컨테이너를 하나의 동일한 네트워크에 밀어넣을 수 있습니다.

 
모든 컨테이너간 통신을 허용하며 IP 조회 및 해결 작업을 자동으로 수행합니다. 고유한 임무와 작업을 가진 다수의 격리된 컨테이너를 가지게 만들 수 있습니다.
볼륨과 달리 네트워크는 도커에서 만들지않으므로 직접 만들어야합니다.
docker network create <network_name>
 
이렇게 동일한 네트워크로 연결하고 나면 도메인 url에 컨테이너 이름으로 지정할 수 있게 됩니다.
mongodb://<your_container_name>:27017/swfavorites
자동 생성된 이름이 있다면 해당 이름을 도메인으로 지정할 수 있습니다.

 

 
앞서 mongodb://host.docker.internal:27017/swfavorites⁠로 작성했던 것처럼 다른 도커 컨테이너 또한 같은 네트워크로 묶여있다면 컨테이너 이름이 도커에 의해 해당 컨테이너의 IP 주소로 변경됩니다.
 
이때 또 주목해야할 점은 mongoDB를 컨테이너로 실행시킬 때 -p 옵션을 통해 포트를 노출시키지 않았다는 점입니다. 로컬 호스트 머신이나 컨테이너 네트워크의 외부에서 접근할 수 없도록 폐쇄적이기 때문이고, 무언가를 연결시킬 경우에만 필요하기 때문입니다.
 
유일하게 연결되는 부분이 같은 네트워크의 공개된 포트를 가지고 있는 컨테이너이고, 해당 컨테이너와 내부적으로 연결은 되어 공개된 컨테이너를 통해 내부 컨테이너와 통신할 수 있게 됩니다.
 

Docker Network IP Resolving

실제로 컨테이너 이름을 도메인 혹은 주소로 사용하게 되면, 도커가 IP 주소를 자동으로 해결해줍니다.
소스 코드를 내부적으로 교체하는 것이 아닌 컨테이너의 이름을 보고 컨테이너 실행을 관리하며 플러그인된 컨테이너의 IP 주소를 연결하는 방식입니다.
 
단순히 도커가 애플리케이션이 실행되는 환경을 가지고 인식하여 조절하는 방식입니다.
따라서 컨테이너에 요청이 전달될 때만 IP 변환이 발생하며 요청이 다른 곳에서 생성됐다면 아무런 작업도 수행하지 않습니다.
 
 
Docker Networks는 실제로 네트워크 동작에 영향을 미치는 다양한 종류의 '드라이버'를 지원합니다.
 
디폴트 드라이버는 'bridge' 드라이버입니다. 이 드라이버는 모듈에 나타난 동작을 제공합니다 (즉, 컨테이너가 동일한 네트워크에 있는 경우, 이름으로 서로를 찾을 수 있음).
 
드라이버는 네트워크 생성 시 '--driver' 옵션을 추가하여 간단히 설정할 수 있습니다.
docker network create --driver bridge my-net
물론 'bridge' 드라이버를 사용하고자 하는 경우, 'bridge'가 디폴트이므로, 전체 옵션을 생략하면 됩니다.
Docker는 아래의 대체 드라이버도 지원하지만 대부분의 경우 'bridge' 드라이버를 사용합니다.
  • host: 스탠드얼론 컨테이너의 경우, 컨테이너와 호스트 시스템 간의 격리가 제거됩니다 (즉, localhost를 네트워크로 공유함).
  • overlay: 여러 Docker 데몬 (즉, 서로 다른 머신에서 실행되는 Docker)이 서로 연결될 수 있습니다. 여러 컨테이너를 연결하는 구식의 / 거의 사용되지 않는 방법인 'Swarm' 모드에서만 작동합니다.
  • macvlan: 컨테이너에 커스텀 MAC 주소를 설정할 수 있습니다. 그러면 이 주소를 해당 컨테이너와 통신하는데 사용할 수 있습니다.
  • none: 모든 네트워킹이 비활성화됩니다.
  • 써드파티 플러그인: 모든 종류의 동작과 기능을 추가할 수 있는 타사 플러그인을 설치할 수 있습니다.
 
'bridge' 드라이버는 대부분의 시나리오에 가장 적합합니다.
복사했습니다!