亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

Docker容器通過獨立IP暴露給局域網的方法

2024-09-01 13:51:24
字體:
來源:轉載
供稿:網友

Docker容器非常輕量,系統開銷非常少,比VMware或者VirtualBox用起來方便,部署起來也非常容易。官方推薦我們通過端口映射的方式把Docker容器的服務提供給宿主機或者局域網其他容器使用。一般過程是:

1、Docker進程通過監聽宿主機的某個端口,將該端口的數據包發送給Docker容器

2、宿主機可以打開防火墻讓局域網其他設備通過訪問宿主機的端口進而訪問docker的端口

這里以CDNS為例,CDNS是一個用于避免DNS污染的程序,通過CDNS可以把你的計算機變成一個抗污染的DNS服務器提供給局域網使用。Docker鏡像下載地址:https://hub.docker.com/r/alexzhuo/cdns/

原理是在Docker容器中啟動CDNS,監聽53端口,Docker容器的IP地址為172.12.0.2,宿主機把5053端口映射到Docker容器上,訪問宿主機的127.0.0.1:5053就相當于訪問Docker的53端口,所以Docker的啟動方法是:

sudo docker run -itd -p 0.0.0.0:5053:53/udp --name=CureDNS alexzhuo/cdns cdns -c /etc/cdns.config.json 

這樣我們使用dig工具通過5053端口查詢DNS就是無污染的DNS了,過程如下:

alex@alex-Lenovo-U310:~$ dig www.facebook.com @127.0.0.1 -p 5053 ; <<>> DiG 9.10.3-P4-Ubuntu <<>> www.facebook.com @127.0.0.1 -p 5053 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9522 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 5 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.facebook.com.  IN A ;; ANSWER SECTION: www.facebook.com. 1550 IN CNAME star-mini.c10r.facebook.com. star-mini.c10r.facebook.com. 30 IN A 31.13.95.36 ;; AUTHORITY SECTION: c10r.facebook.com. 2010 IN NS a.ns.c10r.facebook.com. c10r.facebook.com. 2010 IN NS b.ns.c10r.facebook.com. ;; ADDITIONAL SECTION: a.ns.c10r.facebook.com. 2439 IN A 69.171.239.11 a.ns.c10r.facebook.com. 2439 IN AAAA 2a03:2880:fffe:b:face:b00c:0:99 b.ns.c10r.facebook.com. 3351 IN A 69.171.255.11 b.ns.c10r.facebook.com. 1253 IN AAAA 2a03:2880:ffff:b:face:b00c:0:99 ;; Query time: 47 msec ;; SERVER: 127.0.0.1#5053(127.0.0.1) ;; WHEN: Mon Apr 10 16:21:46 CST 2017 ;; MSG SIZE rcvd: 213 

這里假設我們的宿主機IP是192.168.12.107

如果現在出現另外一臺局域網計算機,IP地址為192.168.12.113,它想把宿主機當成DNS服務器,那么我們就需要在192.168.12.113這臺計算機上訪問192.168.12.107:5053來查詢DNS,dig命令如下

dig www.facebook.com @192.168.12.107 -p 5053 

這樣做顯然是很不方便的,我們現在希望不經過宿主機這一套NAT和代理,想要直接在局域網內的任意一臺計算機上直接通過IP訪問Docker容器,讓Docker容器完整的暴露在局域網里而不是僅單單暴露一個53端口。那么應該如何做呢?

首先通過觀察發現,Docker的默認啟動方式中,會產生一塊虛擬網卡,在這里我們可以理解這塊網卡連接著一個虛擬交換機,然后每個Docker容器又會擁有自己單獨的網卡和IP,而且所有Docker容器也連接在這個虛擬交換機的下面。我們可以在宿主機上通過ifconfig命令看到這個虛擬網卡。

alex@alex-Lenovo-U310:~$ ifconfig docker0 Link encap:以太網 硬件地址 02:42:cd:21:5c:81    inet 地址:172.17.0.1 廣播:0.0.0.0 掩碼:255.255.0.0    inet6 地址: fe80::42:cdff:fe21:5c81/64 Scope:Link    UP BROADCAST RUNNING MULTICAST MTU:1500 躍點數:1    接收數據包:2892 錯誤:0 丟棄:0 過載:0 幀數:0    發送數據包:3517 錯誤:0 丟棄:0 過載:0 載波:0    碰撞:0 發送隊列長度:0    接收字節:187022 (187.0 KB) 發送字節:4771886 (4.7 MB) lo  Link encap:本地環回    inet 地址:127.0.0.1 掩碼:255.0.0.0    inet6 地址: ::1/128 Scope:Host    UP LOOPBACK RUNNING MTU:65536 躍點數:1    接收數據包:9993 錯誤:0 丟棄:0 過載:0 幀數:0    發送數據包:9993 錯誤:0 丟棄:0 過載:0 載波:0    碰撞:0 發送隊列長度:1    接收字節:934304 (934.3 KB) 發送字節:934304 (934.3 KB) wlp3s0 Link encap:以太網 硬件地址 74:e5:43:b0:dd:b0    inet 地址:192.168.12.107 廣播:192.168.12.255 掩碼:255.255.255.0    inet6 地址: fe80::8adf:28f7:5ec:3a5d/64 Scope:Link    UP BROADCAST RUNNING MULTICAST MTU:1500 躍點數:1    接收數據包:69760 錯誤:0 丟棄:0 過載:0 幀數:0    發送數據包:64718 錯誤:0 丟棄:0 過載:0 載波:0    碰撞:0 發送隊列長度:1000    接收字節:41517057 (41.5 MB) 發送字節:9971762 (9.9 MB) 

上面的docker0這塊網卡就是虛擬網卡,它的IP地址是172.17.0.1,它和其他的docker容器都連接在一個虛擬交換機上,網段為172.17.0.0/16,下面我們登錄到Docker容器里面,查看一下容器的網卡和IP

# ifconfig eth0  Link encap:Ethernet HWaddr 02:42:ac:11:00:02    inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0    inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1    RX packets:3449 errors:0 dropped:0 overruns:0 frame:0    TX packets:2811 errors:0 dropped:0 overruns:0 carrier:0    collisions:0 txqueuelen:0    RX bytes:4763490 (4.7 MB) TX bytes:219998 (219.9 KB) lo  Link encap:Local Loopback    inet addr:127.0.0.1 Mask:255.0.0.0    inet6 addr: ::1/128 Scope:Host    UP LOOPBACK RUNNING MTU:65536 Metric:1    RX packets:0 errors:0 dropped:0 overruns:0 frame:0    TX packets:0 errors:0 dropped:0 overruns:0 carrier:0    collisions:0 txqueuelen:1    RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) 

可以看到這個容器的IP地址為172.17.0.2,現在我們到宿主機里看看ping 172.17.0.2能不能ping通。

答案當然是能ping通,能ping通的原因就是我們的宿主機里知道目標地址為172.17.0.1/16的路由信息,不信我們可以查看一下

alex@alex-Lenovo-U310:~$ ip route default via 192.168.12.1 dev wlp3s0 proto static metric 600 169.254.0.0/16 dev docker0 scope link metric 1000 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 192.168.12.0/24 dev wlp3s0 proto kernel scope link src 192.168.12.107 metric 600 

從上面可以看出來,172.17.0.0/16這個網段的數據包可以通過docker0這塊網卡發送出去。也就是說,目前宿主機有兩個IP,一個是192.168.12.107,用于連接實體的局域網,一個是172.17.0.1,用來和Docker容器通信,從這可以看出宿主機和路由器的作用是一致的。而Docker容器只有一個IP就是172.17.0.2。如果docker容器想要訪問外網,那么它就會把數據包發送到網關172.17.0.1,然后由宿主機做NAT發送到192.168.12.1/24這個網段的網關上。

不光宿主機可以ping通容器,而且由于在docker容器中默認路由(網關)是172.17.0.1,所以docker容器不光可以ping主機的172.17.0.1,還能ping通主機的另一個IP:192.168.12.107

此時我們的網絡拓撲其實就變成了192.168.12.0/24這個網段里有個宿主機,為了方便理解,我們把這個宿主機看成一個路由器,路由器下面是172.17.0.1/16這個網段。我們把Docker容器看成實實在在的機器設備,連接在宿主機這個路由器的下面。這樣Docker的拓撲結構就非常清晰了。我們可以發現這個拓撲結構其實非常的簡單。就像家里上網的路由器一樣。打個比方:我家里有兩個路由器,一個路由器通過PPPOE撥號連接公網,內網地址為192.168.12.1,另一個路由器連接在第一個路由器上面,WAN口IP是192.168.12.107,LAN口地址是172.17.0.1,我們的Docker容器看成一個個的電腦接在第二個路由器LAN上面,所以Docker容器的IP為172.17.0.2。

第二個路由器(宿主機)通過NAT讓我們的電腦們(Docker容器)可以訪問互聯網。電腦們(Docker容器們)可以互相ping通,也能ping通全部兩個路由器。第二個路由器可以ping通電腦們,但是第一個路由器ping不同電腦們。如果還是不理解拓撲結構,可以自己在家里買兩個路由器一前一后放上試試。

現在問題來了,如果有一個電腦連接在第一個路由器的下面,和第二個路由器(宿主機)平級,其IP為192.168.12.113,現在它想ping通172.17.0.2這個Docker容器,發現是ping不通的。同樣第一臺路由器自己也是ping不通Docker容器的

原因很簡單,這臺新計算機只能ping通同網段的設備,比如路由器2,因為他們同屬于192.168.12.1/24這個網段。而172.17.0.2/16這個網段它并不知道怎么路由過去,只能把目標地址為172.17.0.1/16的數據包發給路由器一,可惜就連第一個路由器也不知道怎么個路由法。所以我們就ping不通了。

所以現在問題就很好解決了,我們只需要告訴這臺新電腦或者第一個路由器到172.17.0.2/16這個網段的路徑就可以了。

于是我們可以在新電腦或者路由器一中這樣寫

route add -net 172.17.0.1/16 gw 192.168.12.107 

或者是

ip route add 172.17.0.1/16 via 192.168.12.107 

普通路由器可以像這樣設置

docker容器獨立ip,docker,容器,局域網

現在新電腦訪問172.17.0.2的數據包就會先被發送到宿主機(第二個路由器)上,然后宿主機再轉發到Docker容器上,我們就把Docker容器暴露到局域網里了。

但此時你會發現你在新計算機上還是ping不通,這是為什么呢。因為路由器二(宿主機)對它的內網機器也就是Docker容器們全部開啟了NAT,源IP為172.17.0.2/16的數據包不會出現在宿主機以外的網絡中,因為他們被NAT了。這個NAT是Docker進程默認自動幫我們實現的,我們先看一下

alex@alex-Lenovo-U310:~$ sudo iptables -t nat -L -n Chain PREROUTING (policy ACCEPT) target  prot opt source    destination   DOCKER  all -- 0.0.0.0/0   0.0.0.0/0   ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT) target  prot opt source    destination   Chain OUTPUT (policy ACCEPT) target  prot opt source    destination   DOCKER  all -- 0.0.0.0/0   !127.0.0.0/8   ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT) target  prot opt source    destination   MASQUERADE all -- 172.17.0.0/16  0.0.0.0/0    MASQUERADE tcp -- 172.17.0.2   172.17.0.2   tcp dpt:53 MASQUERADE udp -- 172.17.0.2   172.17.0.2   udp dpt:53 Chain DOCKER (2 references) target  prot opt source    destination   RETURN  all -- 0.0.0.0/0   0.0.0.0/0    DNAT  tcp -- 0.0.0.0/0   127.0.0.1   tcp dpt:5053 to:172.17.0.2:53 DNAT  udp -- 0.0.0.0/0   127.0.0.1   udp dpt:5053 to:172.17.0.2:53 

注意那句MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0會導致所有172.17.0.0/16的數據包都不能到達docker以外的網絡,所以我們要關掉這個NAT,關掉很容易,我們只需刪掉這一條iptables規則就可以了。然后源IP為172.17.0.2的數據包就可以出現在192.168.12.1/24的網絡中了。

sudo iptables -t nat -D POSTROUTING 3 

但是把NAT關掉了以后,雖然內網可以互ping了,但是Docker容器可能上不去網呀。第一個路由器如果自動NAT 了172.17.0.2還好,但要是沒有人給Docker容器做NAT,Docker容器就不能上網了,那我們的CDNS也就沒法用了。那么如何既保證Docker容器訪問外網的數據包被NAT,又保證內網通信不被NAT呢?只要稍微修改一下iptables規則就好了,如下

sudo iptables -t nat -A POSTROUTING -s 172.17.0.2 ! -d 192.168.12.1/24 -j MASQUERADE 

上面的iptables規則通過對內外網流量的分離實現區別的NAT對待,就可以既保證Docker容器正常上網,也可以被內網其他主機訪問了。

可能會有這么一種情況,上面所說的第一臺路由器不是什么智能路由器,或者你沒有權限在那個路由器上配置路由條目,讓目標為172.17.0.0/16的數據包通過路由器進行路由。同時你的局域網其他電腦是XP系統的,也沒法手動配置路由規則,這該怎么辦呢?

現在以要訪問Docker容器的局域網主機為Windows XP系統為例,雖然WinXP不能手動配置路由規則,但是我們可以配置網關,只要我們把網關設置為192.168.0.107也就是我們的宿主機,目標地址為172.17.0.0/16的IP包就會發送到宿主機上,而宿主機不同于第一個路由器,它是知道如何路由這些IP包的。于是我們就可以在WinXP上ping通Docker容器了

docker容器獨立ip,docker,容器,局域網

docker容器獨立ip,docker,容器,局域網

以上所述是小編給大家介紹的Docker容器通過獨立IP暴露給局域網的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕日韩av综合精品| 九九久久精品一区| 国产亚洲欧洲在线| 欧美亚洲视频在线看网址| 97av在线视频| 成人在线国产精品| 国语对白做受69| 久久久免费电影| 国产精品三级网站| 日韩欧美视频一区二区三区| 亚洲免费成人av电影| 国产91成人在在线播放| 国产不卡一区二区在线播放| 欧美日韩美女在线| 中文字幕亚洲一区二区三区五十路| 日韩av网站在线| 亚洲国产精品电影| 91精品国产自产在线观看永久| 岛国视频午夜一区免费在线观看| 欧美肥婆姓交大片| 国产视频综合在线| 日本精品va在线观看| 日韩欧美精品在线观看| 午夜精品一区二区三区av| 清纯唯美亚洲激情| 疯狂做受xxxx欧美肥白少妇| 成人免费在线网址| 2018日韩中文字幕| 国产精品美乳在线观看| 久久久精品网站| 黑人精品xxx一区一二区| 国产成人亚洲综合| 久久五月天综合| 国产精品96久久久久久| 一区二区三区四区精品| 亚洲性生活视频| 国产精品久久久久久久久久ktv| 亚洲色在线视频| 国产日韩欧美在线看| 粉嫩老牛aⅴ一区二区三区| 精品久久久久久久大神国产| 日本成人在线视频网址| 欧美亚洲视频在线看网址| 久久91亚洲精品中文字幕奶水| 亚洲大胆人体av| 中文字幕欧美精品在线| 国产亚洲免费的视频看| 欧美超级乱淫片喷水| 精品无码久久久久久国产| 国产日韩欧美电影在线观看| 亚洲男人av电影| 欧美日韩成人在线观看| 国产成人精品免费久久久久| 亚洲美女精品成人在线视频| 欧美精品videosex极品1| 国产精品高潮在线| 欧美夫妻性生活视频| 精品久久久精品| 岛国av一区二区在线在线观看| 亚洲视频日韩精品| 国产福利成人在线| 欧美性猛交xxxx乱大交3| 亚洲一区二区三区在线免费观看| 在线观看日韩视频| 九九精品在线观看| 亚洲精品久久久久中文字幕二区| 欧美精品午夜视频| 精品久久久久久久久久久| 日韩免费不卡av| 国内精品久久久久久影视8| 95av在线视频| 一区二区欧美日韩视频| 国产精品福利在线观看| www.99久久热国产日韩欧美.com| 亚洲福利在线视频| 中文字幕精品国产| 国产精品青草久久久久福利99| 亚洲丝袜在线视频| 久久99精品久久久久久琪琪| 蜜臀久久99精品久久久久久宅男| 国产成人在线精品| 不卡av在线网站| 国产香蕉97碰碰久久人人| 亚洲国产成人一区| 欧美亚洲成人xxx| 亚洲欧美一区二区三区四区| 亚洲人精选亚洲人成在线| 久久久亚洲成人| 国产视频综合在线| 欧美激情视频三区| 国外成人性视频| 美日韩精品免费视频| 国产日韩欧美在线播放| 麻豆国产精品va在线观看不卡| 亚洲精品97久久| 国产精品自拍偷拍| 九九热精品视频在线播放| 中文字幕一精品亚洲无线一区| 亚洲日韩欧美视频| 欧美在线免费观看| 日韩欧美成人免费视频| 久久精品中文字幕免费mv| 成人免费淫片视频软件| 国产精品高潮呻吟久久av无限| 欧美www视频在线观看| 欧美风情在线观看| 久久亚洲成人精品| 亚洲激情在线观看| 亚洲天堂色网站| 91精品国产自产在线观看永久| 亚洲人成亚洲人成在线观看| 欧美激情在线播放| 午夜精品久久久久久99热| 一区二区三区精品99久久| 欧美在线视频观看免费网站| 欧美日韩福利视频| 国产成人免费91av在线| www.久久久久久.com| 中文字幕亚洲一区二区三区五十路| 国产精品永久免费在线| 国产一区二区三区在线观看网站| 国产suv精品一区二区| 久久成人一区二区| 精品久久久久人成| 亚洲国产成人精品久久久国产成人一区| 日韩视频在线观看免费| 中文字幕亚洲无线码在线一区| 午夜精品美女自拍福到在线| 欧美xxxx18国产| 欧美二区乱c黑人| 欧美自拍大量在线观看| 亚洲国产精品久久久久秋霞不卡| 久久天天躁狠狠躁夜夜av| 色樱桃影院亚洲精品影院| 国产成人综合av| 久久视频在线看| 日韩精品免费在线| 免费成人高清视频| 国产剧情久久久久久| 91久久久在线| 欧美日韩一区二区三区在线免费观看| 成人在线小视频| 成人97在线观看视频| www国产精品com| 欧美亚洲成人精品| 亚洲天堂一区二区三区| 2019中文字幕免费视频| 成人黄色大片在线免费观看| 欧美日韩另类字幕中文| 精品国内自产拍在线观看| 亚洲午夜色婷婷在线| 亚洲成人黄色在线观看| 欧美综合第一页| 欧美激情区在线播放| 国产午夜精品全部视频播放| 国产亚洲美女精品久久久| 欧美极品美女视频网站在线观看免费| 在线视频欧美日韩精品| 久久久视频精品| 欧美另类极品videosbestfree| 日韩电影在线观看免费| 国产va免费精品高清在线观看| 日韩欧美在线观看视频| 成人久久18免费网站图片|