도커 + 브리지 + DHCP

도커 + 브리지 + DHCP

호스트와 동일한 LAN에서 처리해야 하는 Docker 컨테이너가 많이 있습니다. 지금까지 나는 이것을 사용하여 이것을 달성해 왔습니다.브리지를 설정하고 수동으로 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를 추적할 필요 없이 여러 호스트에 걸쳐 컨테이너를 배포할 수 있도록 Docker 컨테이너가 호스트와 동일한 서브넷에서 동적 IP를 가져오도록 하려면 어떻게 해야 합니까?

추가 정보

  • DOCKER_OPTS="-e lxc"달리다/etc/default/docker
  • 호스트는 Ubuntu 14.04입니다.
  • Docker 컨테이너는 from ubuntu:14.04Dockerfile을 사용하여 구축됩니다.

답변1

것 같다이것은 공개 질문입니다이는 Ubuntu 컨테이너 및 Apparmor에만 해당됩니다.

bprodoehl은 다음과 같은 해결 방법을 게시했습니다.

  • 권한으로 컨테이너 시작--privileged
  • dockerfile에 다음 줄을 추가합니다.RUN mv /sbin/dhclient /usr/sbin/dhclient
  • Run을 실행하면 dhclient eth0오류 메시지가 계속 표시되지만 mv: cannot move '/etc/resolv.conf.dhclient-new.29' to '/etc/resolv.conf': Device or resource busy이제 IP를 갖게 되며 네트워크를 사용할 수 있습니다.

답변2

스크립트를 찾았어요

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

이것이 바로 당신이 원하는 것입니다(프로그래머가 언급한 해결 방법).

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

답변3

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

  1. --dns <my_dns_ip>docker 데몬 명령( ) 에서 dns 옵션을 설정합니다.
  2. 해당 단어가 포함된 줄을 열고 /etc/dhcp/dhclient.conf편집하고 request subnet-mask, broadcast-address...삭제하세요.domain-name, domain-name-servers
  3. 그런 다음 적용한 후에 service networking restart는 새 DHCP 주소를 얻게 되며 오류 메시지가 나타나지 않습니다.

답변4

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

관련 정보