ubuntu下docker固定IP配置及橋接git
1、Docker的四種網絡模式github
Docker在建立容器時有四種網絡模式,bridge爲默認不須要用--net去指定,其餘三種模式須要在建立容器時使用--net去指定。docker
bridge模式,使用--net=bridge指定,默認設置。ubuntu
none模式,使用--net=none指定。centos
host模式,使用--net=host指定。安全
container模式,使用--net=container:容器名稱或ID指定。(如:--net=container:30b668ccb630)bash
bridge模式:docker網絡隔離基於網絡命名空間<Network Namespace>,在物理機上建立docker容器時會爲每個docker容器分配網絡命名空間,而且把容器IP橋接到物理機的虛擬網橋上。網絡
none模式:此模式下建立容器是不會爲容器配置任何網絡參數的,如:容器網卡、IP、通訊路由等,所有須要本身去配置。tcp
host模式:此模式建立的容器沒有本身獨立的網絡命名空間,是和物理機共享一個Network Namespace,而且共享物理機的全部端口與IP,而且這個模式認爲是不安全的。
ide
container模式:此模式和host模式很相似,只是此模式建立容器共享的是其餘容器的IP和端口而不是物理機,此模式容器自身是不會配置網絡和端口,建立此模式容器進去後,你會發現裏邊的IP是你所指定的那個容器IP而且端口也是共享的,並且其它仍是互相隔離的,如進程等。
2、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/24@192.168.6.1 #建立容器,並指定固定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 #打開規則文件查看
你會發現你物理機的防火牆自動添加了不少條規則,這個是容器到網橋到本地網卡到公網的地址轉換通訊規則
Pipework更多命令用法請參照 :