ㅍㅍㅋㄷ

docker0 IP 및 CIDR 변경하기 본문

IT/Docker

docker0 IP 및 CIDR 변경하기

클쏭 2015. 7. 14. 00:03




  docker를 설치하면, docker0 라는 가상 bridge 가 생성되며, 이 interface는 container가 통신하기 위한 기본적인 bridge interface 이다. 이 interface의 CIDR 설정은 172.17.42.1/16 으로 자동 설정 된다. 


root@~~# ifconfig

docker0   Link encap:Ethernet  HWaddr fe:67:04:29:0e:bd  

          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0

          inet6 addr: fe80::fc67:4ff:fe29:ebd/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:16 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0 

          RX bytes:0 (0.0 B)  TX bytes:1296 (1.2 KB)


 docker0 의 CIDR 설정이 중요한 이유 중 하나는, 해당 host에 올라가는 모든 container의 IP 영역을 결정 짓기 때문이다. 

만약 docker0의 CIDR 설정을 바꾸고 싶다면 어떻게 해야할까. 


아래는 docker0의 CIDR을 172.17.42.1/16 --> 192.168.1.1/24 로 수정하는 방법이다.



1. docker 서비스 stop 


먼저 docker host에 실행되고 있는 서비스를 중지 시키자. 

( 해당 command는 ubuntu 기준 )


root@~~# service docker stop

docker stop/waiting




2. docker0 virtual bridge down


docker 서비스를 중지 시켰다고 해서 docker0 interface가 없어지는 건 아니다. 

root@~~# service docker status

docker stop/waiting

root@~~# ifconfig

docker0   Link encap:Ethernet  HWaddr fe:67:04:29:0e:bd  

          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0

          inet6 addr: fe80::fc67:4ff:fe29:ebd/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:16 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0 

          RX bytes:0 (0.0 B)  TX bytes:1296 (1.2 KB)


docker0 interface 를 강제로 down 시켜야 한다. 

현재 docker0 interface 의 상태 정보를 보고 싶다면 아래와 같이 ip link라는 명령을 이용해 확인해 본다.


root@~~# ip link

.....

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default 

    link/ether fe:67:04:29:0e:bd brd ff:ff:ff:ff:ff:ff


docker0 interface가 현재는 UNKNOWN 상태임을 알 수 있다. 강제로 down 시키도록 한다.


 root@~~# ip link set dev docker0 down

 root@~~# ip link

.......

3: docker0: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 

    link/ether fe:67:04:29:0e:bd brd ff:ff:ff:ff:ff:ff


이제 ifconfig 해도 보이지 않을 것이다. 



3. docker0 interface IP 설정 변경 


이제 docker0 interface 에 설정된 IP 정보를 변경해야 한다. 먼저 ip addr 명령을 통해 현재 설정된 정보를 확인한다. 


root@~~# ip addr

......

3: docker0: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN group default 

    link/ether fe:67:04:29:0e:bd brd ff:ff:ff:ff:ff:ff

    inet 172.17.42.1/16 scope global docker0

       valid_lft forever preferred_lft forever


inet 설정에 172.17.42.1/16 으로 되어 있는걸 볼 수 있다. 일단 이걸 삭제 한다. 


root@~~# ip addr del 172.17.42.1/16 dev docker0

root@~~# ip addr

3: docker0: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN group default 

    link/ether fe:67:04:29:0e:bd brd ff:ff:ff:ff:ff:ff


삭제 후, 192.168.1.1/24 로 재 설정한다. 


root@~~# ip addr add 192.168.1.1/24 dev docker0

root@~~# ip addr

....

3: docker0: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN group default 

    link/ether fe:67:04:29:0e:bd brd ff:ff:ff:ff:ff:ff

    inet 192.168.1.1/24 scope global docker0

       valid_lft forever preferred_lft forever 




4. docker0 virtual bridge up


이제 docker0 virtual bridge 를 올린다.


 root@~~# ip link set dev docker0 up

 root@~~# ip link

.......

3: docker0: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default 

    link/ether fe:67:04:29:0e:bd brd ff:ff:ff:ff:ff:ff




5. iptables 에서 POSTROUTING chain 삭제


docker 서비스를 다시 기동시키기 전에 먼저 정리해야할 것이 있다. iptables 에 기존 172.17.0.0/16  에 대한 chain 정보가 남아 있는데, 한번 정리해준다. 물론 정리 안한다고 해서 제대로 동작 안하는건 아니지만, 그래도 깔끔하게 삭제해 주자.


아래에 보면 POSTROUTING chain에 172.17.0.0/16 에 대한 정보가 아직 남아 있다. 


root@~~# iptables -t nat -L -n

Chain PREROUTING (policy ACCEPT)

target     prot opt source               destination         

DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL


Chain INPUT (policy ACCEPT)

target     prot opt source               destination         


Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination         

DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL


Chain POSTROUTING (policy ACCEPT)

target     prot opt source               destination         

MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0           


Chain DOCKER (2 references)

target     prot opt source               destination   


삭제한다.


root@~~# iptables -t nat -F POSTROUTING




6. docker config 설정 


바로 docker 서비스를 올려도 무방하지만, 만약 docker host가 reboot 될 경우 열심히 설정해 놓은 것들이 다시 reset 된다. 이것을 방지 하기 위해 docker config 에도 CIDR 설정을 넣어주면 host 가 reboot 후에도 내가 설정한 CIDR로 서비스가 올라온다. 


 docker config 는 /etc/default/docker 파일에 설정한다. 

root@~~# echo 'DOCKER_OPTS="--bip 192.168.1.1/24"' >> /etc/default/docker




7. docker 서비스 시작


이제 docker 를 시작해 보자


root@~~# service docker start

docker start/running, process 2239



container를 올리고 container에 할당된 IP를 확인해 보면 우리가 원하는대로 192.168.1.X/24 대역으로 설정됨을 볼 수 있다.


root@~~# docker exec tesst-container ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:c0:a8:01:02  

          inet addr:192.168.1.2  Bcast:0.0.0.0  Mask:255.255.255.0

          inet6 addr: fe80::42:c0ff:fea8:102/64 Scope:Link

          UP BROADCAST RUNNING  MTU:9001  Metric:1

          RX packets:7 errors:0 dropped:0 overruns:0 frame:0

          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0 

          RX bytes:578 (578.0 B)  TX bytes:668 (668.0 B)



Comments