ubuntu下docker固定IP配置及橋接

ubuntu下docker固定IP配置及橋接


一、Docker的四種網絡模式

Docker在創建容器時有四種網絡模式,bridge爲默認不需要用--net去指定,其他三種模式需要在創建容器時使用--net去指定。


bridge模式,使用--net=bridge指定,默認設置。

none模式,使用--net=none指定。

host模式,使用--net=host指定。

container模式,使用--net=container:容器名稱或ID指定。(如:--net=container:30b668ccb630)


bridge模式:docker網絡隔離基於網絡命名空間<Network Namespace>,在物理機上創建docker容器時會爲每一個docker容器分配網絡命名空間,並且把容器IP橋接到物理機的虛擬網橋上。


none模式:此模式下創建容器是不會爲容器配置任何網絡參數的,如:容器網卡、IP、通信路由等,全部需要自己去配置。


host模式:此模式創建的容器沒有自己獨立的網絡命名空間,是和物理機共享一個Network Namespace,並且共享物理機的所有端口與IP,並且這個模式認爲是不安全的。


container模式:此模式和host模式很類似,只是此模式創建容器共享的是其他容器的IP和端口而不是物理機,此模式容器自身是不會配置網絡和端口,創建此模式容器進去後,你會發現裏邊的IP是你所指定的那個容器IP並且端口也是共享的,而且其它還是互相隔離的,如進程等。


二、Docker配置自己的網橋

1)、自定義新網橋

root@Docker:~# dpkg -l | grep bridge*        #查看是否有安裝brctl命令包

ii  bridge-utils   1.5-6ubuntu2     amd64        Utilities for configuring the Linux Ethernet bridge


root@Docker:~# apt-get install bridge-utils  #安裝brctl命令包


root@Docker:~# docker -v                     #docker版本

Docker version 1.5.0, build a8a31ef


root@Docker:~# ps -ef | grep docker          #正在運行  

root      6834     1  0 16:28 ?        00:00:00 /usr/bin/docker -d


root@Docker:~# service docker stop           #停止


root@Docker:~# ifconfig | grep docker0       #docker默認網橋

docker0   Link encap:以太網  硬件地址 56:84:7a:fe:97:99 


root@Docker:~# ifconfig docker0 down         #停止docker默認網橋


root@Docker:~# brctl show                    #查看物理機上有哪些網橋


root@Docker:~# brctl delbr docker0           #刪除docker默認網橋


root@Docker:~# brctl addbr docker_new0       #自定義網橋


root@Docker:~# ifconfig docker_new0 192.168.6.1 netmask 255.255.255.0     #給自定義網橋指定IP和子網


root@Docker:~# ifconfig | grep docker_new0   #查看發現自定義網橋已經啓動

docker_new0 Link encap:以太網  硬件地址 0a:5b:26:48:dc:04  

          inet 地址:192.168.6.1  廣播:192.168.6.255  掩碼:255.255.255.0


root@Docker:~# echo 'DOCKER_OPTS="-b=docker_new0"' >> /etc/default/docker #指定網橋寫入docker配置文件


root@Docker:~# service docker start          #啓動docker


root@Docker:~# ps -ef | grep docker          #成功啓動,並且成功加載了docker_new0

root     21345     1  0 18:44 ?        00:00:00 /usr/bin/docker -d  -b=docker_new0


root@Docker:~# brctl show                    #查看當前網橋下是否有容器連接

bridge name               bridge id               STP enabled     interfaces

docker_new0             8000.fa3ce276c3b9            no             


root@Docker:~# docker run -itd centos:centos6 /bin/bash                   #創建容器測試


root@Docker:~# docker attach 7f8ff622237f                                 #進入容器


[root@7f8ff622237f /]# ifconfig eth0 | grep addr                          #容器IP已經和自定義網橋一個網段,該容器IP爲DHCP自動分配,不屬於指定固定IP

eth0      Link encap:Ethernet  HWaddr 02:42:C0:A8:06:02  

          inet addr:192.168.6.2  Bcast:0.0.0.0  Mask:255.255.255.0

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


root@Docker:~# brctl show                    #該網橋上已經連接着一個網絡設備了

bridge name                bridge id               STP enabled     interfaces

docker_new0             8000.fa3ce276c3b9             no           veth17f560a


注:veth設備是成雙成對出現的,一端是容器內部命名eth0,一端是加入到網橋並命名的veth17f560a(通常命名爲veth*)他們組成了一個數據傳輸通道,一端進一端出,veth設備連接了兩個網絡設備     並實現了數據通信。



2)、Pipework 配置Docker固定IP

我們在自定義網橋的基礎上去做固定IP配置

Pipework有個缺點就是給容器指定完固定IP,如果容器重啓,那麼固定IP會消失,還需要重新指定,容器量大時可寫個腳本來完成


root@Docker:~#  wget https://github.com/jpetazzo/pipework/archive/master.zip #下載 pipework


root@Docker:~#  unzip master.zip             #解壓


root@Docker:~# cp pipework-master/pipework  /usr/bin/                      #拷貝pipework到 /usr/bin/下


root@Docker:~# chmod +x /usr/bin/pipework    #賦予該命令執行權限


root@Docker:~# pipework docker_new0 -i eth1 $(docker run -itd -p 9197:80 centos:centos6 /bin/bash) 192.168.6.27/[email protected] #創建容器,並指定固定IP

格式:pipework  網橋名 -i 指定在那塊網卡上配置  <容器名or容器ID>  指定容器內IP/子網@網關   容器內網關就是物理機網橋的IP              


root@Docker:~# docker attach 2966430e2dbe     #進入新容器

 

[root@2966430e2dbe /]# ifconfig               #容器內IP爲指定的IP 192.168.6.27

eth0      Link encap:Ethernet  HWaddr 02:42:C0:A8:06:05                    

          inet addr:192.168.6.7  Bcast:0.0.0.0  Mask:255.255.255.0         #docker_new0網橋創建容器時DHCP分配的IP


eth1      Link encap:Ethernet  HWaddr 82:DB:F7:A3:33:92  

          inet addr:192.168.6.27  Bcast:0.0.0.0  Mask:255.255.255.0        #pipework指定的固定IP,網橋還是docker_new0


[root@2966430e2dbe /]# route -n               #查看路由路徑

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

0.0.0.0         192.168.6.1     0.0.0.0         UG    0      0        0 eth0

192.168.6.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

192.168.6.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1


[root@2966430e2dbe /]# ping www.baidu.com     #測試網絡

PING www.a.shifen.com (119.75.218.70) 56(84) bytes of data.

64 bytes from 119.75.218.70: icmp_seq=1 ttl=127 time=3.98 ms

64 bytes from 119.75.218.70: icmp_seq=2 ttl=127 time=2.98 ms


[root@2966430e2dbe /]# netstat -anptu | grep 80                              #容器內80端口已經開啓

tcp        0      0 :::80                       :::*                        LISTEN      - 


root@Docker:~# telnet 192.168.6.27 80         #物理機上測試指定的IP是否和映射的端口等通信正常

Trying 192.168.6.27...

Connected to 192.168.6.27.

Escape character is '^]'.


root@Docker:~# iptables-save > iptables-rules #拷貝防火牆規則到本地文件


root@Docker:~# vi iptables-rules              #打開規則文件查看

你會發現你物理機的防火牆自動添加了很多條規則,這個是容器到網橋到本地網卡到公網的地址轉換通信規則


wKioL1Thk97Avv7eAATaEAPqUcg495.jpg


Pipework更多命令用法請參照 :

https://github.com/jpetazzo/pipework 







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章