도커 + 브리지 + DHCP


13

호스트와 동일한 LAN에서 주소 지정이 필요한 많은 도커 컨테이너가 있습니다. 지금까지 브리지 설정 및 수동으로 IP 할당 및 IP 관리를 통해이 목표를 달성했습니다 . 시작 예제는 다음과 같습니다.

docker run \
--net="none" \ \
--lxc-conf="lxc.network.type = veth" \
--lxc-conf="lxc.network.ipv4 = 192.168.1.3/24" \
--lxc-conf="lxc.network.ipv4.gateway = 192.168.1.254" \
--lxc-conf="lxc.network.link = br0" \
--lxc-conf="lxc.network.name = eth0" \
--lxc-conf="lxc.network.flags = up" \
-d [Docker Image ID]

호스트가 /etc/network/interfaces(우분투)에 정의 된 브릿지를 갖는 경우 :

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        address 192.168.1.2
        netmask 255.255.255.0
        gateway 192.168.1.254
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

내가 발견 한 이후 농노를 , 나는 DHCP는 IP를 추적 및 컨테이너로 나눠 수 있도록하는 것이, 컨테이너 내에서 자동 검색을 사용하는 동안 이동하는 것을 시도하고있다. 이후 시작 명령을 다음과 같이 변경했습니다.

docker run \
--net="none" \
--lxc-conf="lxc.network.type = veth" \
--lxc-conf="lxc.network.link = br0" \
--lxc-conf="lxc.network.flags = up" \
-d [Docker Image ID]
/bin/bash

그리고 다리는 :

auto br0
iface br0 inet dhcp
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

이로 인해 컨테이너가 시작되었지만 IP가 없었습니다. 그런 다음 Fedora로 전화를 걸어 온라인 게시물 에서 조언 을 얻었습니다 dhclient. 불행히도 이것은 우분투 기반 컨테이너 내에서 작동하지 않습니다.

다음은 다른 조건에서 발생하는 다음 오류 메시지입니다.

  • 컨테이너 시작 dhclient을 활성화하면 실행 됩니다 --privileged.

    dhclient: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
    
  • sudo dhclient eth0없을 때 실행--privileged

    RTNETLINK answers: Operation not permitted
    mv: cannot move '/etc/resolv.conf.dhclient-new.31' to '/etc/resolv.conf': Device or resource busy
    
  • 실행 sudo dhclient중이거나 dhclient(인터페이스가 지정되지 않았습니다).

    즉시 반환되며 여전히 IP 또는 네트워크 연결이 없습니다.

IP를 추적하지 않고 여러 호스트에 컨테이너를 배포 할 수 있도록 도커 컨테이너가 호스트와 동일한 서브넷에서 동적 IP를 가져 오도록하려면 어떻게해야합니까?

추가 정보

  • 실행 DOCKER_OPTS="-e lxc"/etc/default/docker
  • 호스트는 우분투 14.04입니다
  • Docker 컨테이너는 from ubuntu:14.04Dockerfile에서 사용 합니다.

답변:


3

문제는 공개 된 문제 이며 우분투 컨테이너 및 의류에만 해당됩니다.

bprodoehl에서 해결 방법이 게시되었습니다.

  • 권한으로 컨테이너를 시작하십시오. --privileged
  • dockerfile에 다음 줄을 추가하십시오. RUN mv /sbin/dhclient /usr/sbin/dhclient
  • 실행 dhclient eth0하면 여전히 다음과 같은 오류 메시지가 표시됩니다. mv: cannot move '/etc/resolv.conf.dhclient-new.29' to '/etc/resolv.conf': Device or resource busy그러나 이제 IP가 생성되어 네트워크를 사용할 수 있습니다.

그것은 내 경우에는 매력처럼 작동하지만 왜 mv가 필요한가요? 설명해 주시겠습니까?
Federico Bonelli

그것은 그 사람이 게시 한 솔루션에 있었으며 (내가 연결 한) 작동하는 것처럼 보입니다. 다른 사람이 설명 할 수 있습니다.
Programster

1
@Federico Bonelli : Apparmor는 관리하는 응용 프로그램에 보안 제한을 적용합니다. 정책 정의가있는 응용 프로그램 만 관리합니다. 이러한 정책은 경로에 따라 응용 프로그램을 일치시킵니다. 당신이 이동하는 경우 dhclient에서 /sbin/usr/sbinAppArmor의 정책 정의에 더 이상 일치하지 않습니다 및 AppArmor의이 "알 수없는"응용 프로그램에 보안 제한을 적용하지 않습니다.
파프리카

해결 방법으로 "sudo apparmor_parser -R /etc/apparmor.d/sbin.dhclient"에 의지해야했습니다. 이것은 우분투 14.04 컨테이너입니다. 그러나 위의 오류 메시지가 표시되고 IP 주소가 할당되었습니다.
Neil McGill

1

스크립트를 찾았습니다

https://github.com/jkrauska/tech-notes/blob/master/docker-dhclient.md

정확히 원하는 것을 수행합니다 (Programster가 언급 한 해결 방법).

mv 명령은 특권 모드에서 도커 컨테이너를 실행할 때도 커가 컨테이너에 대한 AppArmor 프로파일을 정의하지 않기 때문에 필요합니다. 따라서 시스템 기본 AppArmor 프로파일이 사용되며 기본 경로에서 dhclient를 실행할 수 없습니다.


1

우분투 도커 컨테이너에서 dhcp 주소를 얻으려면 다음을 수행하십시오.

  1. docker daemon 명령에서 dns 옵션 설정 ( --dns <my_dns_ip>)
  2. 단어 /etc/dhcp/dhclient.conf를 포함 request subnet-mask, broadcast-address...하고 제거하는 줄을 열고 편집하십시오domain-name, domain-name-servers
  3. 그런 다음 적용 service networking restart하면 오류 메시지없이 새로운 DHCP 주소가 표시됩니다

-2

다른 가능성은 "파이프 워크"를 사용하는 것입니다. 컨테이너 외부에서 실행해야합니다. https://github.com/jpetazzo/pipework


5
안녕하세요. 사이트에 오신 것을 환영합니다. 우리는 여기서 답변이 좀 더 포괄적 인 것을 좋아합니다. pipework찾을 수있는 곳, 설치 방법, 설치 방법 등을 편집하고 설명 할 수 있습니까? 그대로, 귀하의 답변은 답변이 아니라 의견입니다.
테르 돈
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.