今天小編給大家分享一下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設備連接了兩個網絡設備 并實現了數據通信。
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.linuxidc.com #測試網絡 ping www.linuxidc.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 #打開規則文件查看你會發現你物理機的防火墻自動添加了很多條規則,這個是容器到網橋到本地網卡到公網的地址轉換通信規則
例子二:
首先,配置一個用于創建container interface的網橋,可以使用ovs,也可以使用linux bridge,以linux bridge為例:
br_name=docker brctl addbr $br_name ip addr add 192.168.33.2/24 dev $br_name ip addr del 192.168.33.2/24 dev em1 ip link set $br_name up brctl addif $br_name eth0
接著,可以啟動容器了,注意用--net=none方式啟動:
# start new container hostname='docker.test.com' cid=$(docker run -d -i -h $hostname --net=none -t centos) pid=$(docker inspect -f '{{.state.pid}}' $cid)
下面,為該容器配置網絡namespace,并設置固定ip:
# set up netns mkdir -p /var/run/netns ln -s /proc/$pid/ns/net /var/run/netns/$pid # set up bridge ip link add q$pid type veth peer name r$pid brctl addif $br_name q$pid ip link set q$pid up # set up docker interface fixed_ip='192.168.33.3/24' gateway='192.168.33.1' ip link set r$pid netns $pid ip netns exec $pid ip link set dev r$pid name eth0 ip netns exec $pid ip link set eth0 up ip netns exec $pid ip addr add $fixed_ip dev eth0 ip netns exec $pid ip route add default via 192.168.33.1
這樣,容器的網絡就配置好了,如果容器內部開啟了sshd服務,通過192.168.33.3就可以直接ssh連接到容器,非常方便。上面的步驟比較長,可以借助pipework來為容器設置固定ip(除了設置ip,還封裝了配置網關、macvlan、vlan、dhcp等功能):
pipework docker0 be8365e3b2834 10.88.88.8/24
那么,當容器需要刪除的時候,怎么清理網絡呢,其實也很簡單:
# stop and delete container docker stop $cid docker rm $cid # delete docker's net namespace (also delete veth pair) ip netns delete $pid
以上就是“Docker怎么配置固定IP及橋接”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。