最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Docker容器通過獨(dú)立IP暴露給局域網(wǎng)的方法

 更新時(shí)間:2017年04月11日 10:54:16   作者:lvshaorong  
這篇文章主要介紹了Docker容器通過獨(dú)立IP暴露給局域網(wǎng)的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

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

1、Docker進(jìn)程通過監(jiān)聽宿主機(jī)的某個(gè)端口,將該端口的數(shù)據(jù)包發(fā)送給Docker容器

2、宿主機(jī)可以打開防火墻讓局域網(wǎng)其他設(shè)備通過訪問宿主機(jī)的端口進(jìn)而訪問docker的端口

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

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

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 

這里假設(shè)我們的宿主機(jī)IP是192.168.12.107

如果現(xiàn)在出現(xiàn)另外一臺(tái)局域網(wǎng)計(jì)算機(jī),IP地址為192.168.12.113,它想把宿主機(jī)當(dāng)成DNS服務(wù)器,那么我們就需要在192.168.12.113這臺(tái)計(jì)算機(jī)上訪問192.168.12.107:5053來查詢DNS,dig命令如下

dig www.facebook.com @192.168.12.107 -p 5053 

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

首先通過觀察發(fā)現(xiàn),Docker的默認(rèn)啟動(dòng)方式中,會(huì)產(chǎn)生一塊虛擬網(wǎng)卡,在這里我們可以理解這塊網(wǎng)卡連接著一個(gè)虛擬交換機(jī),然后每個(gè)Docker容器又會(huì)擁有自己單獨(dú)的網(wǎng)卡和IP,而且所有Docker容器也連接在這個(gè)虛擬交換機(jī)的下面。我們可以在宿主機(jī)上通過ifconfig命令看到這個(gè)虛擬網(wǎng)卡。

alex@alex-Lenovo-U310:~$ ifconfig 
docker0 Link encap:以太網(wǎng) 硬件地址 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 躍點(diǎn)數(shù):1 
   接收數(shù)據(jù)包:2892 錯(cuò)誤:0 丟棄:0 過載:0 幀數(shù):0 
   發(fā)送數(shù)據(jù)包:3517 錯(cuò)誤:0 丟棄:0 過載:0 載波:0 
   碰撞:0 發(fā)送隊(duì)列長度:0 
   接收字節(jié):187022 (187.0 KB) 發(fā)送字節(jié):4771886 (4.7 MB) 
lo  Link encap:本地環(huán)回 
   inet 地址:127.0.0.1 掩碼:255.0.0.0 
   inet6 地址: ::1/128 Scope:Host 
   UP LOOPBACK RUNNING MTU:65536 躍點(diǎn)數(shù):1 
   接收數(shù)據(jù)包:9993 錯(cuò)誤:0 丟棄:0 過載:0 幀數(shù):0 
   發(fā)送數(shù)據(jù)包:9993 錯(cuò)誤:0 丟棄:0 過載:0 載波:0 
   碰撞:0 發(fā)送隊(duì)列長度:1 
   接收字節(jié):934304 (934.3 KB) 發(fā)送字節(jié):934304 (934.3 KB) 
wlp3s0 Link encap:以太網(wǎng) 硬件地址 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 躍點(diǎn)數(shù):1 
   接收數(shù)據(jù)包:69760 錯(cuò)誤:0 丟棄:0 過載:0 幀數(shù):0 
   發(fā)送數(shù)據(jù)包:64718 錯(cuò)誤:0 丟棄:0 過載:0 載波:0 
   碰撞:0 發(fā)送隊(duì)列長度:1000 
   接收字節(jié):41517057 (41.5 MB) 發(fā)送字節(jié):9971762 (9.9 MB) 

上面的docker0這塊網(wǎng)卡就是虛擬網(wǎng)卡,它的IP地址是172.17.0.1,它和其他的docker容器都連接在一個(gè)虛擬交換機(jī)上,網(wǎng)段為172.17.0.0/16,下面我們登錄到Docker容器里面,查看一下容器的網(wǎng)卡和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) 

可以看到這個(gè)容器的IP地址為172.17.0.2,現(xiàn)在我們到宿主機(jī)里看看ping 172.17.0.2能不能ping通。

答案當(dāng)然是能ping通,能ping通的原因就是我們的宿主機(jī)里知道目標(biāo)地址為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這個(gè)網(wǎng)段的數(shù)據(jù)包可以通過docker0這塊網(wǎng)卡發(fā)送出去。也就是說,目前宿主機(jī)有兩個(gè)IP,一個(gè)是192.168.12.107,用于連接實(shí)體的局域網(wǎng),一個(gè)是172.17.0.1,用來和Docker容器通信,從這可以看出宿主機(jī)和路由器的作用是一致的。而Docker容器只有一個(gè)IP就是172.17.0.2。如果docker容器想要訪問外網(wǎng),那么它就會(huì)把數(shù)據(jù)包發(fā)送到網(wǎng)關(guān)172.17.0.1,然后由宿主機(jī)做NAT發(fā)送到192.168.12.1/24這個(gè)網(wǎng)段的網(wǎng)關(guān)上。

不光宿主機(jī)可以ping通容器,而且由于在docker容器中默認(rèn)路由(網(wǎng)關(guān))是172.17.0.1,所以docker容器不光可以ping主機(jī)的172.17.0.1,還能ping通主機(jī)的另一個(gè)IP:192.168.12.107

此時(shí)我們的網(wǎng)絡(luò)拓?fù)淦鋵?shí)就變成了192.168.12.0/24這個(gè)網(wǎng)段里有個(gè)宿主機(jī),為了方便理解,我們把這個(gè)宿主機(jī)看成一個(gè)路由器,路由器下面是172.17.0.1/16這個(gè)網(wǎng)段。我們把Docker容器看成實(shí)實(shí)在在的機(jī)器設(shè)備,連接在宿主機(jī)這個(gè)路由器的下面。這樣Docker的拓?fù)浣Y(jié)構(gòu)就非常清晰了。我們可以發(fā)現(xiàn)這個(gè)拓?fù)浣Y(jié)構(gòu)其實(shí)非常的簡單。就像家里上網(wǎng)的路由器一樣。打個(gè)比方:我家里有兩個(gè)路由器,一個(gè)路由器通過PPPOE撥號(hào)連接公網(wǎng),內(nèi)網(wǎng)地址為192.168.12.1,另一個(gè)路由器連接在第一個(gè)路由器上面,WAN口IP是192.168.12.107,LAN口地址是172.17.0.1,我們的Docker容器看成一個(gè)個(gè)的電腦接在第二個(gè)路由器LAN上面,所以Docker容器的IP為172.17.0.2。

第二個(gè)路由器(宿主機(jī))通過NAT讓我們的電腦們(Docker容器)可以訪問互聯(lián)網(wǎng)。電腦們(Docker容器們)可以互相ping通,也能ping通全部兩個(gè)路由器。第二個(gè)路由器可以ping通電腦們,但是第一個(gè)路由器ping不同電腦們。如果還是不理解拓?fù)浣Y(jié)構(gòu),可以自己在家里買兩個(gè)路由器一前一后放上試試。

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

原因很簡單,這臺(tái)新計(jì)算機(jī)只能ping通同網(wǎng)段的設(shè)備,比如路由器2,因?yàn)樗麄兺瑢儆?92.168.12.1/24這個(gè)網(wǎng)段。而172.17.0.2/16這個(gè)網(wǎng)段它并不知道怎么路由過去,只能把目標(biāo)地址為172.17.0.1/16的數(shù)據(jù)包發(fā)給路由器一,可惜就連第一個(gè)路由器也不知道怎么個(gè)路由法。所以我們就ping不通了。

所以現(xiàn)在問題就很好解決了,我們只需要告訴這臺(tái)新電腦或者第一個(gè)路由器到172.17.0.2/16這個(gè)網(wǎng)段的路徑就可以了。

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

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 

普通路由器可以像這樣設(shè)置

現(xiàn)在新電腦訪問172.17.0.2的數(shù)據(jù)包就會(huì)先被發(fā)送到宿主機(jī)(第二個(gè)路由器)上,然后宿主機(jī)再轉(zhuǎn)發(fā)到Docker容器上,我們就把Docker容器暴露到局域網(wǎng)里了。

但此時(shí)你會(huì)發(fā)現(xiàn)你在新計(jì)算機(jī)上還是ping不通,這是為什么呢。因?yàn)槁酚善鞫ㄋ拗鳈C(jī))對(duì)它的內(nèi)網(wǎng)機(jī)器也就是Docker容器們?nèi)块_啟了NAT,源IP為172.17.0.2/16的數(shù)據(jù)包不會(huì)出現(xiàn)在宿主機(jī)以外的網(wǎng)絡(luò)中,因?yàn)樗麄儽籒AT了。這個(gè)NAT是Docker進(jìn)程默認(rèn)自動(dòng)幫我們實(shí)現(xiàn)的,我們先看一下

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會(huì)導(dǎo)致所有172.17.0.0/16的數(shù)據(jù)包都不能到達(dá)docker以外的網(wǎng)絡(luò),所以我們要關(guān)掉這個(gè)NAT,關(guān)掉很容易,我們只需刪掉這一條iptables規(guī)則就可以了。然后源IP為172.17.0.2的數(shù)據(jù)包就可以出現(xiàn)在192.168.12.1/24的網(wǎng)絡(luò)中了。

sudo iptables -t nat -D POSTROUTING 3 

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

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

上面的iptables規(guī)則通過對(duì)內(nèi)外網(wǎng)流量的分離實(shí)現(xiàn)區(qū)別的NAT對(duì)待,就可以既保證Docker容器正常上網(wǎng),也可以被內(nèi)網(wǎng)其他主機(jī)訪問了。

可能會(huì)有這么一種情況,上面所說的第一臺(tái)路由器不是什么智能路由器,或者你沒有權(quán)限在那個(gè)路由器上配置路由條目,讓目標(biāo)為172.17.0.0/16的數(shù)據(jù)包通過路由器進(jìn)行路由。同時(shí)你的局域網(wǎng)其他電腦是XP系統(tǒng)的,也沒法手動(dòng)配置路由規(guī)則,這該怎么辦呢?

現(xiàn)在以要訪問Docker容器的局域網(wǎng)主機(jī)為Windows XP系統(tǒng)為例,雖然WinXP不能手動(dòng)配置路由規(guī)則,但是我們可以配置網(wǎng)關(guān),只要我們把網(wǎng)關(guān)設(shè)置為192.168.0.107也就是我們的宿主機(jī),目標(biāo)地址為172.17.0.0/16的IP包就會(huì)發(fā)送到宿主機(jī)上,而宿主機(jī)不同于第一個(gè)路由器,它是知道如何路由這些IP包的。于是我們就可以在WinXP上ping通Docker容器了

以上所述是小編給大家介紹的Docker容器通過獨(dú)立IP暴露給局域網(wǎng)的方法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 非docker方式部署openwebui的完整過程記錄

    非docker方式部署openwebui的完整過程記錄

    這篇文章主要介紹了從使用Docker部署OpenWebUI到直接部署的切換過程,包括停止并刪除未使用的Docker鏡像以釋放硬盤空間,并記錄了直接部署的具體步驟,需要的朋友可以參考下
    2025-02-02
  • docker搭建jenkins+maven代碼構(gòu)建部署平臺(tái)

    docker搭建jenkins+maven代碼構(gòu)建部署平臺(tái)

    本文主要介紹了docker搭建jenkins+maven代碼構(gòu)建部署平臺(tái),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • docker安裝RocketMQ的實(shí)現(xiàn)步驟

    docker安裝RocketMQ的實(shí)現(xiàn)步驟

    本文主要介紹了docker安裝RocketMQ的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • docker容器掛載宿主主機(jī)目錄的操作方法

    docker容器掛載宿主主機(jī)目錄的操作方法

    這篇文章主要介紹了docker容器掛載宿主主機(jī)目錄的操作方法,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2018-01-01
  • docker安裝clickhouse過程詳解

    docker安裝clickhouse過程詳解

    這篇文章主要為大家介紹了docker安裝clickhouse過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Docker超詳細(xì)講解鏡像操作

    Docker超詳細(xì)講解鏡像操作

    鏡像也是?docker?的核心組件之一,鏡像時(shí)容器運(yùn)行的基礎(chǔ),容器是鏡像運(yùn)行后的形態(tài)。本文主要介紹Docker鏡像的基本操作,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • docker-compose---安裝掛載本地文件啟動(dòng)mariadb問題

    docker-compose---安裝掛載本地文件啟動(dòng)mariadb問題

    這篇文章主要介紹了docker-compose---安裝掛載本地文件啟動(dòng)mariadb問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 將strapi打包成docker鏡像的步驟詳解

    將strapi打包成docker鏡像的步驟詳解

    在這個(gè)指南中,我們將學(xué)習(xí)如何將 Strapi 應(yīng)用程序打包成 Docker 鏡像,解決多環(huán)境部署問題,文末也會(huì)提供打包好的鏡像地址,讓同學(xué)們能夠直接使用,需要的朋友可以參考下
    2024-01-01
  • docker-compose實(shí)現(xiàn)wireshark對(duì)linux主機(jī)進(jìn)行抓包

    docker-compose實(shí)現(xiàn)wireshark對(duì)linux主機(jī)進(jìn)行抓包

    這篇文章主要為大家介紹了docker-compose實(shí)現(xiàn)wireshark對(duì)linux主機(jī)進(jìn)行抓包腳本示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Docker容器數(shù)據(jù)卷的使用教程

    Docker容器數(shù)據(jù)卷的使用教程

    數(shù)據(jù)卷容器是一個(gè)專門用來掛載數(shù)據(jù)卷的容器,該容器主要是供其他容器引用和使用,下面這篇文章主要給大家介紹了關(guān)于Docker容器數(shù)據(jù)卷使用的相關(guān)資料,需要的朋友可以參考下
    2022-10-10

最新評(píng)論

东乌珠穆沁旗| 叙永县| 南陵县| 海门市| 图木舒克市| 汝城县| 鹤山市| 台山市| 定西市| 永嘉县| 广南县| 兴宁市| 安徽省| 定日县| 阳西县| 阿荣旗| 新干县| 宁强县| 安丘市| 海南省| 泽库县| 开封市| 平南县| 四子王旗| 佛学| 泰顺县| 襄樊市| 丹东市| 孝义市| 阿鲁科尔沁旗| 淄博市| 陵水| 瑞丽市| 珲春市| 呼和浩特市| 新竹县| 临江市| 张家口市| 汪清县| 青铜峡市| 瑞安市|