Search
🌍

bc6_1_2.1. title: 컨테이너간 통신을 위해 host.docker.internal 을 사용하는 것은 모범사례가 아니다. 대신 리눅스 환경에서는 호스트 네트워크를 공유하라.

생성
🚀 prev note
🚀 next note
♻️ next note
14 more properties
컨테이너간 통신
host.docker.internal & 포트 매핑
network-mode: ‘host’
네트워크 만들기
MacOS
Linux
하나의 컴퓨터에 두 개의 도커 컨테이너가 실행되고 있다고 생각해 보자. 첫 번째 컨테이너에서는 0.0.0.0:1000 에 서비스가 실행 중이고, 두 번째 컨테이너에서는 0.0.0.0:2000 에 서비스가 실행 중이다. 기본적으로 이 두 개 의 컨테이너 사이의 소통은 불가능하다.
도커 컨테이너가 호스트 머신의 네트워크 리소스에 접근할 필요가 있을 때, host.docker.internal 주소는 컨테이너 내부에서 호스트 머신을 참조하는 데 사용된다. 이 주소는 주로 컨테이너가 호스트 시스템 상의 서비스나 애플리케이션에 접근해야 할 때 유용하다. 예를 들어, 개발 중인 애플리케이션이 로컬 데이터베이스 서버에 접근해야 하는 경우가 이에 해당한다.
이 접속 원리를 응용하여 둘 사이의 통신을 만들고 싶을 때 특수한 주소 host.docker.internal를 사용할 수 있다. 이 주소는 호스트 머신의 네트워크에 접속하는 주소이기 때문에, 서비스가 호스트의 포트에 매핑되어 이어야 한다. 컨테이너 A에서 실행되는 서비스가 1000번 포트에서 수신 대기 중이므로 이 서비스를 컨테이너 B에서 접근하려면 호스트의 1000 포트를 컨테이너 A의 서비스 포트에 매핑해야 한다.
이 과정을 모두 마친 뒤, host.docker.internal 를 이용해서 첫 번째 컨테이너에서 두 번째 컨테이너의 실행 중인 서비스에 host.docker.internal:2000 이라는 주소를 사용하여 접속할 수 있다. 두 번째 컨테이너에서는 host.docker.internal:1000 주소를 이용해 첫 번째 컨테이너에 실행 중인 서비스에 접속할 수 있다.
services: service-a: image: ... container_name: ... # NOTE: 명시적으로 호스트 네트워크와 포트를 매핑하고, `host.docker.internal` 을 사용합니다. ports: - '${SERVICE_A_PORT}:${SERVICE_A_PORT}' volumes: - ... environment: - CONTAINER_B_SERVICE_URL=host.docker.internal:2000 service-b: image: ... container_name: ... ports: - '${SERVICE_B_PORT}:${SERVICE_B_PORT}' volumes: - ... environment: - CONTAINER_A_SERVICE_URL=host.docker.internal:1000
YAML
복사
그러나, 이 주소를 사용하여 컨테이너 간 통신을 직접 설정하는 것은 통상적인 사용 사례가 아니다. host.docker.internal 주소는 컨테이너가 호스트 시스템의 서비스에 접근할 필요가 있을 때 사용하기 위한 목적으로 만들어졌기 때문이다. 따라서 도커 내부 네트워크를 통한 컨테이너 간 직접 통신에는 다른 방법이 권장된다. 예를 들어, 사용자 정의 네트워크를 설정하여 컨테이너들이 서로의 이름에 기반하여 서로의 서비스를 찾고 통신할 수 있게 하는 것이 바람직하다.
하지만 간단한 개발을 위해 이들을 연결해 줄 또다른 방법도 있다. 네트워크 환경을 격리시키지 않고 컴퓨터와 동일한 네트워크를 사용하게 만드는 방법이다. 심오한 네트워크 개념을 차치하고 표면적으로만 볼 때, network-mode: ‘host’ 는 앞서 언급한 두 컨테이너 사이의 통신이 필요할 때 0.0.0.0:1000 주소와 0.0.0.0:2000 주소를 사용할 수 있다.
services: service-a: image: ... container_name: ... # NOTE: 직접 포트를 매핑하는 대신 호스트 네트워크를 같이 사용합니다. network_mode: "host" volumes: - ... environment: - CONTAINER_B_SERVICE_URL=0.0.0.0:2000 service-b: image: ... container_name: ... network_mode: "host" volumes: - ... environment: - CONTAINER_A_SERVICE_URL=0.0.0.0:1000
YAML
복사
문제는 network-mode: ’host’ 옵션이 리눅스에서만 돌아간다는 것이다. MacOS에서는 network-mode: ‘host’ 옵션을 통한 통신이 온전히 이루어지지 않는다는 점에 유의하라. MacOS에서는 반드시 host.docker.internal 을 사용하라.
parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료을 보관해 두는 영역입니다.
1.
None
from : 과거의 어떤 원자적 생각이 이 생각을 만들었는지 연결하고 설명합니다.
2.
evaluable 프로젝트 중 단일 머신에서 다중 컨테이너 간 통신을 위해 필요했던 내용이다.
supplementary : 어떤 새로운 생각이 이 문서에 작성된 생각을 뒷받침하는지 연결합니다.
1.
None
opposite : 어떤 새로운 생각이 이 문서에 작성된 생각과 대조되는지 연결합니다.
1.
None
to : 이 문서에 작성된 생각이 어떤 생각으로 발전되거나 이어지는지를 작성하는 영역입니다.
1.
None
ref : 생각에 참고한 자료입니다.