티스토리 뷰

IT/Docker

도커에 고정 아이피 할당하기

트래이닝맨 2015. 4. 20. 11:21
728x90
반응형

지난 Docker 0.8 이전에 디폴트로 사용되던 lxc driver를 이용하지 않고, 도커 컨테이너에 원하는 IP를 할당하는 방법을 지금까지 생각을 해본적이 없다.(그냥 안된다고 생각하고 지나쳤었던 거 같다.) 


그런데, libcontainer를 이용하면서도 IP를 할당할 수 방법이 있다는 것을 알게 되었다. (하지만 도커에서 간단히 제공되는 옵션을 이용하는 것은 아니다.)


이 방법의 키는 바로 XML name space와 비슷한 개념인 Network Namespace 를 이용하는 것이다. 이 블로그에서는 어떻게 IP를 도커 컨테이너에 할당하는지에 대한 이야기를 할것이다. 그러나 이를 이해하기 위해서는 브릿지, 네임스페이스등의 네트워크와 관련된 용어를 알아야 한다. 이러한 기본적인 기술에 대해서는 훨씬 더 자세히 설명을 하고 있는 아티클을 공유할테니 이를 참조하기 바란다. 이 아티클들을 통해서 충분히 이해를 할수 있을거라 믿습니다. 왜냐면 나도 이해했으니깐요 ^^.


기본적 용어에 대한 이해

1. 네임 스페이스가 무엇인가?

   Linux namespaces are a cool feature that permit process groups to have a limited view of system resource. .... (http://www.evolware.org/?p=293)


2. 소프트웨어에서 브릿지란 무엇인가?

    It is supported by linux kernel and similar to physical bridge.(http://www.innervoice.in/blogs/2013/12/08/tap-interfaces-linux-bridge/)


준비사항

Bare metal :Fedora

Host OS : centos 7

Docker image : docker.io/centos (officially provided by docker hub)

머신에 설치된 패키지들:  libvirt, virt-manger

호스트에 설치된 패키들 : docker , devicemapper* , brctl-utills, net-tools


기본 네트워크 아키텍쳐 on bare metal(fedora) : http://jhouse0317.tistory.com/91


우리는 아래와 같은 아키텍쳐를 구성해 볼것이다.


OS Structure 


Network Architecture 


Network IP Information


그림으로 설명을 하는 것이 가장 쉬울 듯해서 위의 그림을 그려봤는데, 이해가 될런지 몰라서 추가 설명을 하겠다.


이 글의 타이틀을 보고 들어오신 분들은 간단히 docker 옵션을 통해 아이피를 할당 할거라 예상했을지 모르지만.... 그런 방법은 없다. 그래서 내가 찾은 방법은 호스트에 docker0 브릿지를 이용하지 않고 새로 브릿지 br4를 만들고 우리가 원하는 ip를 할당한 namespace를 만들어 이것을 container에 직접 붙이는 방법이다.


1.새로운 네트워크 네임스페이스 만들기 (on KVM - Guest)

   - # ip netns add centos-docker     

   - # ip link add tap1 type veth peer name br0tap1

   - # brctl addif br1 br1tap1

   - # ip link set tap1 netns centos-docker

   - # ifconfig br1tap1 up
   - # ip netns exec centos-docker ifconfig tap1 192.168.10.4 netmask 255.255.255.0 up

     (만약에 tap1이 다운상태이면 이 명령어를 실행시켜 up상태로 변경해야한다."ip netns exec centos-docker ifconfig tap1 up")


1.1. 테스트

On KVM-GUEST

  #brctl show


bridge name         bridge id        STP enabled     interfaces

br1         8000.5254002454bb no        br1tap1

                        ens3 

docker0 8000.56847afe9799 no 


  #ip netns 

  centos-docker     (새로 생긴 네트워크 네임스페이스 확인)


  # ip a

....

15: br1tap1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br1 state UP qlen 1000      link/ether d2:8f:ce:e8:4c:35 brd ff:ff:ff:ff:ff:ff

             inet6 fe80::d08f:ceff:fee8:4c35/64 scope link

             valid_lft forever preferred_lft forever 



2. 도커 컨테이너를 실행 후 네트워크 네임스페이스를 해당 컨테이너에 붙이기

  - # docker run -it --net=ns:/var/run/netns/centos-docker docker.io/centos /bin/bash


2.1. 테스트

On DOCKER

# ip a

16: tap1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000    

    link/ether 0e:f9:fe:8c:85:bf brd ff:ff:ff:ff:ff:ff

    inet 192.168.10.4/24 brd 192.168.10.255 scope global tap1

       valid_lft forever preferred_lft forever

    inet6 fe80::cf9:feff:fe8c:85bf/64 scope link

       valid_lft forever preferred_lft forever 

  보시면.. 도커 컨테이너의 할당된 아이피가 192.168.10.4로 잘 되어 있습니다.


3. Test 네트워크

   on Docker(192.168.10.4)

   자 이제 해당 아이피로 통신이 잘되는지 확인해 보시죠

   - docker to kvm-guest (192.168.10.2)

[root@b8aff89bb5cc /]# ping 192.168.10.2

PING 192.168.10.2 (192.168.10.2) 56(84) bytes of data.

64 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=0.118 ms

64 bytes from 192.168.10.2: icmp_seq=2 ttl=64 time=0.086 ms 


  - docker to kvm-host (192.168.10.1)

[root@b8aff89bb5cc /]# ping 192.168.10.1

PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.

64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.494 ms

64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.714 ms



반응형
댓글
250x250
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함