Docker 配置固定IP及桥接的实现方法(转载)
?
這篇文章主要介紹了Docker 配置固定IP和橋接的實(shí)現(xiàn)方法的相關(guān)資料,這里詳細(xì)介紹了Docker 的四種網(wǎng)絡(luò)模式及如何實(shí)現(xiàn)橋接的案例,需要的朋友可以參考下docker默認(rèn)使用bridge模式,通過網(wǎng)橋連接到宿主機(jī),而容器內(nèi)部的ip則從網(wǎng)橋所在的ip段取未用的ip。這樣做一個(gè)不方便的地方在于容器內(nèi)部的ip不是固定的,想要連接容器時(shí)只能通過映射到宿主機(jī)的端口,因而有很多項(xiàng)目使用overlay來為docker提供網(wǎng)絡(luò)的配置,比如Pipework、Flannel、Kubernetes、Weave、opencontrail等。
想要使用overlay來為docker配置網(wǎng)絡(luò),需要首先了解下docker的網(wǎng)絡(luò)模式:
一、Docker的四種網(wǎng)絡(luò)模式
Docker在創(chuàng)建容器時(shí)有四種網(wǎng)絡(luò)模式,bridge為默認(rèn)不需要用--net去指定,其他三種模式需要在創(chuàng)建容器時(shí)使用--net去指定。
bridge模式:docker網(wǎng)絡(luò)隔離基于網(wǎng)絡(luò)命名空間<Network Namespace>,在物理機(jī)上創(chuàng)建docker容器時(shí)會(huì)為每一個(gè)docker容器分配網(wǎng)絡(luò)命名空間,并且把容器IP橋接到物理機(jī)的虛擬網(wǎng)橋上。
none模式:此模式下創(chuàng)建容器是不會(huì)為容器配置任何網(wǎng)絡(luò)參數(shù)的,如:容器網(wǎng)卡、IP、通信路由等,全部需要自己去配置。
host模式:此模式創(chuàng)建的容器沒有自己獨(dú)立的網(wǎng)絡(luò)命名空間,是和物理機(jī)共享一個(gè)Network Namespace,并且共享物理機(jī)的所有端口與IP,并且這個(gè)模式認(rèn)為是不安全的。
container模式:此模式和host模式很類似,只是此模式創(chuàng)建容器共享的是其他容器的IP和端口而不是物理機(jī),此模式容器自身是不會(huì)配置網(wǎng)絡(luò)和端口,創(chuàng)建此模式容器進(jìn)去后,你會(huì)發(fā)現(xiàn)里邊的IP是你所指定的那個(gè)容器IP并且端口也是共享的,而且其它還是互相隔離的,如進(jìn)程等。
二、Docker配置自己的網(wǎng)橋
例子一、
1)、自定義新網(wǎng)橋
?| 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | 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???? #正在運(yùn)行 root?? 6834? 1 0 16:28 ???? 00:00:00 /usr/bin/docker -d root@Docker:~# service docker stop???? #停止 root@Docker:~# ifconfig | grep docker0?? #docker默認(rèn)網(wǎng)橋 docker0 Link encap:以太網(wǎng) 硬件地址 56:84:7a:fe:97:99 root@Docker:~# ifconfig docker0 down??? #停止docker默認(rèn)網(wǎng)橋 root@Docker:~# brctl show????????? #查看物理機(jī)上有哪些網(wǎng)橋 root@Docker:~# brctl delbr docker0???? #刪除docker默認(rèn)網(wǎng)橋 root@Docker:~# brctl addbr docker_new0?? #自定義網(wǎng)橋 root@Docker:~# ifconfig docker_new0 192.168.6.1 netmask 255.255.255.0? #給自定義網(wǎng)橋指定IP和子網(wǎng) root@Docker:~# ifconfig | grep docker_new0 #查看發(fā)現(xiàn)自定義網(wǎng)橋已經(jīng)啟動(dòng) docker_new0 Link encap:以太網(wǎng) 硬件地址 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 #指定網(wǎng)橋?qū)懭雂ocker配置文件 root@Docker:~# service docker start???? #啟動(dòng)docker root@Docker:~# ps -ef | grep docker???? #成功啟動(dòng),并且成功加載了docker_new0 root? 21345? 1 0 18:44 ???? 00:00:00 /usr/bin/docker -d -b=docker_new0 root@Docker:~# brctl show????????? #查看當(dāng)前網(wǎng)橋下是否有容器連接 bridge name?????? bridge id?????? STP enabled? interfaces docker_new0????? 8000.fa3ce276c3b9????? no????? root@Docker:~# docker run -itd CentOS:centos6 /bin/bash???????? #創(chuàng)建容器測(cè)試 root@Docker:~# docker attach 7f8ff622237f??????????????? #進(jìn)入容器 [root@7f8ff622237f /]# ifconfig eth0 | grep addr???????????? #容器IP已經(jīng)和自定義網(wǎng)橋一個(gè)網(wǎng)段,該容器IP為DHCP自動(dòng)分配,不屬于指定固定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????????? #該網(wǎng)橋上已經(jīng)連接著一個(gè)網(wǎng)絡(luò)設(shè)備了 bridge name??????? bridge id?????? STP enabled? interfaces docker_new0????? 8000.fa3ce276c3b9????? no???? veth17f560a |
注:veth設(shè)備是成雙成對(duì)出現(xiàn)的,一端是容器內(nèi)部命名eth0,一端是加入到網(wǎng)橋并命名的veth17f560a(通常命名為veth*),他們組成了一個(gè)數(shù)據(jù)傳輸通道,一端進(jìn)一端出,veth設(shè)備連接了兩個(gè)網(wǎng)絡(luò)設(shè)備??? 并實(shí)現(xiàn)了數(shù)據(jù)通信。
?| 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | 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? #賦予該命令執(zhí)行權(quán)限 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 #創(chuàng)建容器,并指定固定IP 格式:pipework 網(wǎng)橋名 -i 指定在那塊網(wǎng)卡上配置 <容器名or容器ID> 指定容器內(nèi)IP/子網(wǎng)@網(wǎng)關(guān) 注:容器內(nèi)網(wǎng)關(guān)就是物理機(jī)網(wǎng)橋的IP?????? ?? root@Docker:~# docker attach 2966430e2dbe? #進(jìn)入新容器 ?? [root@2966430e2dbe /]# ifconfig?????? #容器內(nèi)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網(wǎng)橋創(chuàng)建容器時(shí)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,網(wǎng)橋還是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? #測(cè)試網(wǎng)絡(luò) 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?????????????? #容器內(nèi)80端口已經(jīng)開啟 tcp??? 0?? 0 :::80?????????? :::*??????????? LISTEN?? - root@Docker:~# telnet 192.168.6.27 80??? #物理機(jī)上測(cè)試指定的IP是否和映射的端口等通信正常 Trying 192.168.6.27... Connected to 192.168.6.27. Escape character is '^]'. root@Docker:~# iptables-save > iptables-rules #拷貝防火墻規(guī)則到本地文件 root@Docker:~# vi iptables-rules?????? #打開規(guī)則文件查看你會(huì)發(fā)現(xiàn)你物理機(jī)的防火墻自動(dòng)添加了很多條規(guī)則,這個(gè)是容器到網(wǎng)橋到本地網(wǎng)卡到公網(wǎng)的地址轉(zhuǎn)換通信規(guī)則<br> |
例子二:
首先,配置一個(gè)用于創(chuàng)建container interface的網(wǎng)橋,可以使用ovs,也可以使用Linux bridge,以Linux bridge為例:
?| 1 2 3 4 5 6 | 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 |
接著,可以啟動(dòng)容器了,注意用--net=none方式啟動(dòng):
?| 1 2 3 4 | # 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) |
下面,為該容器配置網(wǎng)絡(luò)namespace,并設(shè)置固定ip:
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 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 |
這樣,容器的網(wǎng)絡(luò)就配置好了,如果容器內(nèi)部開啟了sshd服務(wù),通過192.168.33.3就可以直接ssh連接到容器,非常方便。上面的步驟比較長(zhǎng),可以借助pipework來為容器設(shè)置固定ip(除了設(shè)置IP,還封裝了配置網(wǎng)關(guān)、macvlan、vlan、dhcp等功能):
pipework docker0 be8365e3b2834 10.88.88.8/24
那么,當(dāng)容器需要?jiǎng)h除的時(shí)候,怎么清理網(wǎng)絡(luò)呢,其實(shí)也很簡(jiǎn)單:
?| 1 2 3 4 5 | # stop and delete container docker stop $cid docker rm $cid # delete docker's net namespace (also delete veth pair) ip netns delete $pid |
更多docker網(wǎng)絡(luò)的配置,可以參考官方手冊(cè)。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
轉(zhuǎn)載于:https://www.cnblogs.com/it-tsz/p/docker.html
總結(jié)
以上是生活随笔為你收集整理的Docker 配置固定IP及桥接的实现方法(转载)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 又见斐波那契~矩阵快速幂入门题
- 下一篇: Python内置数据结构--列表