도커 + 브리지 + DHCP

호스트와 동일한 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에서 사용 합니다.


답변

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

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가 생성되어 네트워크를 사용할 수 있습니다.

답변

스크립트를 찾았습니다

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

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

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


답변

우분투 도커 컨테이너에서 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 주소가 표시됩니다

답변

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


답변