Docker의 자동 IP 주소 할당을 비활성화하려면 어떻게 해야 합니까?

Docker의 자동 IP 주소 할당을 비활성화하려면 어떻게 해야 합니까?

내 네트워크에 고정 IP 주소를 할당하여 Docker 컨테이너가 실제 시스템처럼 보이고 느껴지도록 구성하고 싶습니다.

현재 호스트에 네트워크 브리지 설정(br0)이 있습니다. 파일 DOCKER_OPTS="-b=br0"에 구성 했습니다 /etc/default/docker. 파일을 통해 각 컨테이너에 정적 주소를 할당할 수 있습니다 /etc/network/interface.

문제는 Docker가 계속해서 자체적으로 IP 주소를 할당한다는 것입니다. (이것을 어떻게 중지합니까?) 더욱 문제가 되는 점은 이제 브리지된 네트워크의 IP 체계를 사용한다는 것입니다. 네트워크에서 이미 사용 중인 주소를 할당할 수 있으므로 네트워킹 문제가 발생합니다.

문제:
네트워크 중단/일시 중지
컨테이너를 ping하는 동안 응답 주소가 변경될 수 있습니다.

Error messages such as this are seen in the logs of the host:
kernel: [31912.876161] br0: port 3(vethb228701) entered disabled state
kernel: [31913.441517] device veth122d9f8 left promiscuous mode
kernel: [22491.609856] audit: type=1400 audit(1434148604.621:124): apparmor="DENIED" operation="getattr" info="Failed name lookup - disconnected path" error=-13 profile="/usr/sbin/ntpd" name="var/lib/docker/aufs/diff/eb00895db3d297979df741cd560ccbea2ab4d572264bd703fc6cbc7ea2acb5c4/usr/lib" pid=30955 comm="ntpd" requested_mask="r" denied_mask="r" fsuid=0 ouid=0

Docker는 또한 내 네트워크와 동일한 서브넷에 있는 주소를 컨테이너에 할당합니다. 처음에는 단순히 /etc/hosts컨테이너 파일 에 한 줄을 추가하는 것뿐이었습니다 . 그렇긴 하지만 제거한 후에도 문제가 여전히 나타납니다.

예:

root@myhostname:/# cat /etc/hosts  
X.X.192.3   myhostname.mydomain.com myhostname
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
root@myhostname:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:09:1a:c0:03  
          inet addr:X.X.X.X  Bcast:X.X.X.X  Mask:255.255.252.0
          inet6 addr: fe80::42:9ff:fe1a:c003/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:231 errors:0 dropped:26 overruns:0 frame:0
          TX packets:46 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:23719 (23.7 KB)  TX bytes:3960 (3.9 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

컨테이너를 시작하기 위해 명령줄(-h)을 통해 호스트 이름이 할당되지 않은 경우 무작위로 할당된 호스트 이름을 사용합니다.

환경:

Host:  
OS: Ubuntu 14.04.2 
Arch: PPC64LE
Kernel: 3.16.0-30
docker version
:
Client version: 1.4.1-dev
Client API version: 1.17
Go version (client): gccgo (GCC) 5.0.0 20150118 (experimental)
Git commit (client): 7294f26
OS/Arch (client): linux/ppc64le
Server version: 1.4.1-dev
Server API version: 1.17
Go version (server): gccgo (GCC) 5.0.0 20150118 (experimental)
Git commit (server): 7294f26

하드웨어:

IBM Power 8, 8247-22L
CPUs: 192
Memory: 512GB

컨테이너:

OS: Ubuntu 14.04.2 
Arch: PPC64LE
Kernel: 3.16.0-30

회로망:

brctl show 
bridge name bridge id       STP enabled interfaces
br0     8000.6cae8b6aaf64   no      eth0

br0       Link encap:Ethernet  HWaddr 6c:ae:8b:6a:af:64  
          inet addr:X.X.X.X  Bcast: X.X.X.X Mask:255.255.252.0
          inet6 addr: fe80::6eae:8bff:fe6a:af64/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6750867 errors:0 dropped:80 overruns:0 frame:0
          TX packets:1586308 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1049658934 (1.0 GB)  TX bytes:6936734104 (6.9 GB)

eth0      Link encap:Ethernet  HWaddr 6c:ae:8b:6a:af:64  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7155242 errors:0 dropped:7598 overruns:0 frame:0
          TX packets:6347549 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1212526214 (1.2 GB)  TX bytes:7339350703 (7.3 GB)
          Interrupt:249 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:238 errors:0 dropped:0 overruns:0 frame:0
          TX packets:238 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:22564 (22.5 KB)  TX bytes:22564 (22.5 KB)

답변1

나도 얼마 전에 이 문제를 해결하려고 노력했다. 전체 네트워킹 기능을 비활성화하지 않고 IP 할당과 관련된 Docker의 동작을 변경하는 방법을 찾을 수 없습니다( --net=none). 그래서 지금까지 사용하지 않은 서브넷을 docker 브리지 인터페이스에 할당하고 docker가 할당을 수행하도록 했습니다. 또한 특정 도커 API 이벤트를 수신한 다음 DNS 서버에 동적 업데이트를 푸시하는 데몬을 작성했습니다. 따라서 IP에 신경 쓸 필요가 없고 이름으로 컨테이너의 주소를 지정할 수 있습니다.

다음은 DNS 데몬에 대한 github 저장소입니다. https://github.com/cschritt/docker-dns-daemon 곧 최신 변경 사항과 일부 리팩토링을 추진할 예정입니다.

답변2

안타깝게도 Docker가 브리지 모드에서 컨테이너에 IP 주소를 할당하는 것을 방지할 수 있는 방법은 없는 것 같습니다. 해결 방법으로 Docker의 IP 주소를 다음과 같이 해제하기 위해 pre-up ip addr flush dev eth0추가 합니다./etc/network/interface여기에 설명되어 있습니다. 다음은 이를 수행하는 방법의 예입니다.

auto eth0
iface eth0 inet static
  pre-up ip addr flush dev eth0
  address 192.168.0.249
  netmask 255.255.255.0
  gateway 192.168.0.1

이 접근 방식의 주의 사항은 Docker가 자체적으로 올바르지 않거나 재정의된 IP 주소를 컨테이너 /etc/hosts파일에 삽입할 때 여러 컨테이너에 있다는 것입니다. 이 문제를 해결하기 위해 제가 찾은 유일한 방법은 Docker가 패키지를 변경하자마자 inotify-tools패키지를 설치하고 다음 스크립트를 실행하여 사전 정의된 상태로 되돌리는 것입니다 ./etc/hosts

#!/bin/sh

while /usr/bin/inotifywait -e close /etc/hosts; do
  cp -v /etc/hosts.orig /etc/hosts
done

위 스크립트를 사용하려면 유효한 /etc/hosts.orig파일을 컨테이너에 추가해야 합니다.

답변3

도커 1.10부터 시작, 앞으로 며칠 내에 출시될 예정이므로 컨테이너를 시작할 때 --ip=--ip6=옵션을 사용하여 고정 IP 주소를 명시적으로 지정하여 각각 IPv4 및 IPv6 주소를 지정할 수 있습니다. 이는 컨테이너가 존재하는 한 docker run및와 함께 사용할 수 있으며 지속될 수 있습니다.docker network connect

관련 정보