1. 程式人生 > >利用pipework為docker容器設定固定IP

利用pipework為docker容器設定固定IP

      今天介紹如何在redhat/centos7系列機器上使用pipework為docker啟動的容器指定一個固定ip,我們知道預設情況下,docker會使用bridge網路模式為每一個啟動的容器動態分配一個IP,以172.17.0.1為閘道器,172.17.0.2,172.17.0.3依次類推作為容器的ip,這樣也算是每個容器有了ip,當下次啟動多個容器的時候IP還是會按照這種方式分配,表面上還是一個固定IP的方式,但是這種方式對容器啟動順序有嚴格的要求。還有一種方式就是通過人為指定IP的方式,這種方式就是今天講的利用pipework為容器指定IP。

    啟動容器時可以通過--net=none指定容器網路模式。有四種網路模式可以選擇:host,container,none,bridge(預設),如果不設定這個引數,那麼預設就是bridge的模式,採用dhcp的方式分配IP。使用pipework為容器指定ip,對宿主機有要求,需要宿主機有網橋,對redhat7可以使用yum install bridge-utils來安裝網橋,安裝完成之後設定網橋的IP就可以了。

    下面一步一步來通過pipework為docker容器指定ip(前提是機器上已經安裝了docker服務,並且服務開啟,有映象可使用):

    第一步、安裝網橋裝置;

yum install -y bridge-utils

    安裝完畢即可在命令列下通過brctl 命令檢視網橋

    第二步、設定網路地址,我們假定宿主機是固定IP,並設定了閘道器;

    vi /etc/sysconfig/network-scripts/ifcfg-eno16777728

TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERROUTES=yes
PEERDNS=yes
NAME=eno16777728
UUID=00f2e830-ed07-4ace-9e54-56a325e3a690
ONBOOT=yes
#IPADDR0=192.168.61.150
#PREFIX0=24
#GATEWAY0=192.168.61.2
#DNS1=192.168.61.2
HWADDR=00:0C:29:F7:22:81
BRIDGE="br-ex"

     vi /etc/sysconfig/network-scripts/ifcfg-br-ex

TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.61.150
NETMASK=255.255.255.0
GATEWAY=192.168.61.2
PREFIX=24
DNS1=192.168.61.2
NAME=br-ex
ONBOOT=yes
DEVICE=br-ex

    以上修改即為設定IP,設定完畢可以通過命令service network restart重啟網路

[[email protected] ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br-ex           8000.000c29f72281       no              eno16777728
                                                                               veth1pl90365
docker0         8000.0242dda719e2       no

  第三步、啟動docker容器並指定網路模式為none

[[email protected] ~]# docker images
REPOSITORY            TAG                IMAGE ID               CREATED                        SIZE
docker.io/zookeeper   latest              19604ac4a163        Less than a second ago   143 MB
redis                           latest               07818b5b6de8        8 hours ago                      482.9 MB
[[email protected] ~]# docker run -it -d --net=none --name ip-test redis /bin/bash
[[email protected] ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4190f301a367        redis               "/bin/bash"         55 minutes ago      Up 55 minutes                           ip-test

    第四步、獲取pipework可執行程式

[[email protected] ~]# git clone https://github.com/jpetazzo/pipework.git
[[email protected] ~]# cd pipework/
[[email protected] pipework]# ls
docker-compose.yml  doctoc  LICENSE  pipework  pipework.spec  README.md
[[email protected] ~]# cd ..
[[email protected] ~]# cp -rp pipework/pipework /usr/local/bin

    第五步、設定docker容器IP

[[email protected] ~]# pipework br-ex ip-test 192.168.61.100/[email protected]

    第六步、驗證IP設定是否正確

[[email protected] ~]# ping 192.168.61.100
PING 192.168.61.100 (192.168.61.100) 56(84) bytes of data.
64 bytes from 192.168.61.100: icmp_seq=1 ttl=64 time=0.206 ms
64 bytes from 192.168.61.100: icmp_seq=2 ttl=64 time=0.081 ms
^C
--- 192.168.61.100 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.081/0.143/0.206/0.063 ms

補充:

  •   設定宿主機網橋IP地址的時候就是將原來網絡卡eno16777728的固定IP地址設定到br-ex網橋上,把網絡卡eno16777728IP和閘道器子網掩碼等都註釋掉。有的機器上網絡卡可能叫eno16777736,根據具體網絡卡來修改配置檔案。
  •   網橋br-ex的名字可以隨便叫,叫br0也可以,就是對應配置檔名稱就必須是ifcfg-br0,型別為Bridge。
  •   網橋設定的閘道器,我的機器是192.168.61.2,這個是安裝虛擬機器時vm預設設定的,有的機器閘道器為192.168.xx.1,最後對docker容器設定IP時需要指定192.168.xx.yy/[email protected],@後面就是指定宿主機的閘道器,這裡一定要注意,否則網路不通。