Docker 컨테이너를 호스트 및 내부 브리지 네트워크 모두에 연결


14

개인 ( --internal) Docker 네트워크와 사전 정의 된 host네트워크 사이의 라우터로 Docker 컨테이너를 실행하려고 합니다. 즉, 컨테이너에는 두 개의 네트워크 인터페이스가 있어야합니다. 모든 호스트 IP 주소에 액세스 할 수있는 하나의 "외부"인터페이스와 내부 Docker 네트워크의 컨테이너에 대한 게이트웨이 역할을하는 "내부"인터페이스

그러면 라우터 컨테이너 자체가 컨테이너 간 NAT 네트워크 트래픽을 처리합니다.

Docker가 두 인터페이스로 컨테이너를 실행하도록 구성하는 방법을 찾지 못했습니다. 내가 얻을 수있는 가장 가까운 것은 두 개의 bridge인터페이스를 할당하는 것입니다. 정확히 필요한 것은 아닙니다.

수동으로 연결하려고하면 오류가 발생합니다.

# docker network connect host root_router_1
Error response from daemon: Container cannot be disconnected from host network or connected to host network

누구든지 Docker Compose를 사용하여이를 달성하는 방법을 보여 줄 수 있습니까?


@PunMum 불행히도 아닙니다. 결국 모든 컨테이너를 호스트 네트워크에 직접 연결하고 컨테이너 내부의 IP를 구성했습니다.
Hexaholic

답변:


2

github 의이 Q & A에 따르면 :

호스트 네트워크는 특별합니다. 서비스에서 network_mode : host를 사용해야합니다


network_mode당신이 내부 네트워크와 호스트 네트워크에 연결 무언가를 필요로하는 경우 작동하지 않습니다. 이 문제에 대한 명확한 해결책을 찾을 수 없다는 것은 미친 듯이 보입니다.
jv-dev

2

Docker는 컨테이너를 호스트 네트워크 및 다른 Docker 브리지 네트워크에 동시에 연결할 수 없습니다. 나는 그 이유를 예를 들어 설명하려고 노력할 것이다.

  • 컨테이너 C1을 생각해 봅시다. 가설 적으로 C1은 호스트 네트워크 (--net = host)와 Docker 브리지 네트워크 Br1 (-net = Br1)에 연결됩니다.
  • C2라고하는 두 번째 컨테이너는 Br1에 연결되어 있습니다.

위의 설정을 사용하면 C2에서 호스트 네트워크를 볼 수 있으며 이것이 Docker가 호스트 네트워크를 호스트가 지정하지 않은 컨테이너에 실수로 노출시키지 못하게하는 이유라고 생각합니다.

즉, 컨테이너 세트가 있고 호스트 네트워크에 액세스 할 수있는 단일 컨테이너만으로 모든 컨테이너가 상호 연결되기를 원한다면 내 접근 방식은 다음과 같습니다.

  • [C2, ..., CN]은 사용자 정의 Docker 브리지 Br1에 연결됩니다 (--net = Br1)
  • C1이 호스트 네트워크에 연결되어 있습니다 (--net = host)
  • C1은 나머지 컨테이너에서 액세스 할 수 있도록 포트를 노출합니다.

편집 : 우리는 여전히 나머지 컨테이너에서 C1에 도달 할 수있는 방식으로 iptables 정책을 조정해야합니다 ( https://docs.docker.com/network/iptables/ 참조 )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.