내 네트워크에 고정 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