久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

docker 網(wǎng)絡(luò)之端口映射不完全探索 | LearnKu 終身編程者的知識社區(qū)

 shopnc 2019-11-21

這篇文章實在團隊內(nèi)部的分享,如下:

今天的分享不包含故事背景,、docker 的發(fā)展與應(yīng)用...

分享源于對問題 ' 我已經(jīng)在 Dockerfile 中通過 EXPOSE 指定了端口為何任然無法訪問,?' 深入探索。其實今天的分享也可以視為對上一期峰哥分享的一個補充,。

Docker 容器的端口映射

容器的服務(wù)端口綁定到宿主機的端口上,。效果就是:外部程序通過宿主機的 P 端口訪問,就像直接訪問 Docker 容器網(wǎng)絡(luò)內(nèi)部容器提供的服務(wù)一樣,。

今天的分享主要涉及到的 Docker run 命令,,參數(shù)如下:

  • -p/-P
  • --expose

expose

expose 參數(shù)有兩種使用形式:

  • docker run 命令時指定 --expose 參數(shù),如 --expose=8080
  • 在 Dockerfile 中,,通過 EXPOSE 關(guān)鍵字

作用

EXPOSE 指令是聲明運行時容器提供服務(wù)端口,。

注意

僅僅是申明。并不是說你聲明了這個端口,,在運行容器的時候就會自動的暴露這個端口,。使用時,還要依賴于容器的操作人員進一步指定網(wǎng)絡(luò)規(guī)則。

本質(zhì)上來說,, EXPOSE 或者 --expose 只是為其他命令提供所需信息的元數(shù)據(jù),,或者只是告訴容器操作人員有哪些已知選擇。

驗證: 通過 docker run nginx 啟動一個容器,,然后通過?。郿ocker inspect id` 查看

"HostConfig": {
    "PortBindings": {
        "443/tcp": null,
        "80/tcp": null
    },
}

可以看到端口被標示成已暴露,但是沒有定義任何與主機的端口映射,。

-p/-P

-p-P 參數(shù)的完整形式:

  -p, --publish list 
  -P, --publish-all 

這兩個參數(shù)都是發(fā)布端口到宿主主機,。但用法上存在一點區(qū)別。

-p 顯式將一個或者一組端口從容器里綁定到宿主機上,。
-P 自動的將 EXPOSE 指令相關(guān)的每個端口映射到宿主機的端口上,。

-p 參數(shù)常見的用法是: -p 宿主主機端口:容器端口?!∪绻褂谩。郿ocker run -p 8080:80 nginx` 命令啟動 nginx 容器,,那么容器中的 80 端口會綁定到主機的 8080 端口,。

這是,我們再通過 docker inspect id 來查看,,將會看到下面的綁定關(guān)系:

"HostConfig": {
    "PortBindings": {
        "443/tcp": null,
        "80/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "8080"
                    }
                ]

    },
}

因為沒有指定 443 端口的綁定,,所以能看到僅有 80 端口和宿主機存在端口映射關(guān)系。

另外,,在使用 - p 參數(shù)是,,我們可以忽略指定宿主主機端口。這是,,docker 會幫助我們自動的選擇一個合適端口和容器端口進行綁定,。這樣做的好處是在啟動多個容器時可以避免端口沖突。

例如上面的啟動命令可以改為 docker run -p 80 nginx, 這時如果我們本機的 80 端口被占用,,docker 就會自動的選擇一個其他端口,。我們可以通過 docker psdocker inspect 命令來查看端口的映射關(guān)系。

-P 參數(shù)用法: docker run -P nginx.
-P 參數(shù)須配合 Dockerfile 一起使用,, 能夠?qū)?Expose 聲明的端口映射到宿主主機,。

此時,使用 docker inspect 命令,,可以看到 dockerfile 中申明的端口都已經(jīng)綁定到了主機上,。

"HostConfig": {
    "PortBindings": {
        "443/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "443"
                    }
                ],
        "80/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "80"
                    }
                ]

    },
}

-expose 和 -p 功能對比

我們可以通過如下的實驗來更好的理解兩參數(shù)之間的區(qū)別。

  • 不在 DockerfileEXPOSE,,也不通過 -p 參數(shù)指定
  • DockerfileEXPOSE,,但不使用 -p 參數(shù)
  • DockerfileEXPOSE,也使用 -p 參數(shù)
  • DockerfileEXPOSE,也使用 -P 參數(shù)
  • 只使用 -p 參數(shù)

結(jié)果

  • 第一中情況:不能在外網(wǎng)訪問,,也不能被 link 的 container 訪問
  • 第二種情況:不能被外網(wǎng)訪問,,但是能被 link 的 container 訪問
  • 第三種情況:能被外網(wǎng)訪問,也能被 link 容器訪問 iw
  • 第四種情況:和第三種情況一樣
  • 第五種情況:和第三種情況一樣

Docker 端口映射原理

備注: 這一塊挺亂的,,我也沒弄得很清楚,,權(quán)當拋磚引玉了。

原本我理解端口映射是這樣的一個通信過程:

  • Docker 進程啟動的時候,,會在宿主主機創(chuàng)建路由,,同時創(chuàng)建 docker0 網(wǎng)橋
  • 容器啟動的時候創(chuàng)建 vethxx 的網(wǎng)卡,同時鏈接到網(wǎng)橋
  • 通過 -p 參數(shù)指定端口映射后,, 創(chuàng)建 iptables 規(guī)則
  • 當有流量通過宿主主機端口進來用,,通過 iptables 匹配到規(guī)則后,轉(zhuǎn)換為容器對應(yīng)的子網(wǎng) ip
  • 主機的路由指定了 172.xx 網(wǎng)段的 ip 由 docker0 處理
  • docker0 再將請求轉(zhuǎn)發(fā)到子網(wǎng)中容器

后面和朋友了解了,,發(fā)現(xiàn)還有 docker-proxy 的存在,,于是,上面的理解是其實就片面的,,不完善的,。


到現(xiàn)在,關(guān)于 Docker 端口映射的實現(xiàn)一共有 2 方案.

  • 1.7 版本之前 docker-proxy + iptables DNAT 的方式
    即,,內(nèi)網(wǎng)訪問通過 iptables
    外網(wǎng)訪問通過 proxy
  • 1.7 版本之后的 iptables DNAT
    完全由 iptables 實現(xiàn)

Docker 1.7 版本起,,Docker 提供了一個配置項: -userland-proxy,以讓 Docker 用戶決定是否啟用 docker-proxy,,默認為 true,,即啟用 docker-proxy。
現(xiàn)在的 Docker 環(huán)境默認的是: -userland-proxy=true,。iptables 和 docker-proxy 都會起作用,。

-userland-proxy=true 的情況下

在啟用 docker-proxy 的情況下。每設(shè)置一對端口映射就會啟動一個 docker-proxy 進程,。

可以通過 ps 命令查看 docker-proxy 進程信息

ps -ef | grep docker-proxy

root      5532 19713  0 2月20 ?       00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 443 -container-ip 172.19.0.8 -container-port 443
root      5546 19713  0 2月20 ?       00:00:01 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.19.0.8 -container-port 80

通過 sudo netstat -nltpu 查看本機的端口監(jiān)聽情況:

tcp6       0      0 :::80                   :::*                    LISTEN      5546/docker-proxy          
tcp6       0      0 :::443                  :::*                    LISTEN      5532/docker-proxy

通過上面的命令,,會發(fā)現(xiàn),我們映射到宿主機的端口被 docker-proxy 進程監(jiān)聽了,。

別急,,我們再看一下 iptables,發(fā)現(xiàn)其中增加了對應(yīng)的規(guī)則:

 sudo iptables-save -t nat                 
# Generated by iptables-save v1.6.1 on Fri Feb 22 15:06:17 2019
*nat
:PREROUTING ACCEPT [55751:14743102]
:INPUT ACCEPT [55615:14734886]
:OUTPUT ACCEPT [260072:22717364]
:POSTROUTING ACCEPT [260200:22725044]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.20.0.0/16 ! -o br-bf4c59b26d33 -j MASQUERADE
-A POSTROUTING -s 172.19.0.0/16 ! -o br-e2ab1d51063d -j MASQUERADE
-A POSTROUTING -s 172.18.0.0/16 ! -o br-c9af812dc067 -j MASQUERADE
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.19.0.2/32 -d 172.19.0.2/32 -p tcp -m tcp --dport 6379 -j MASQUERADE
-A POSTROUTING -s 172.19.0.3/32 -d 172.19.0.3/32 -p tcp -m tcp --dport 27017 -j MASQUERADE
-A POSTROUTING -s 172.19.0.5/32 -d 172.19.0.5/32 -p tcp -m tcp --dport 3306 -j MASQUERADE
-A POSTROUTING -s 172.19.0.6/32 -d 172.19.0.6/32 -p tcp -m tcp --dport 9501 -j MASQUERADE
-A POSTROUTING -s 172.19.0.6/32 -d 172.19.0.6/32 -p tcp sudo iptables -t filter -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-USER  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (4 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             172.19.0.2           tcp dpt:6379
ACCEPT     tcp  --  anywhere             172.19.0.3           tcp dpt:27017
ACCEPT     tcp  --  anywhere             172.19.0.5           tcp dpt:mysql
ACCEPT     tcp  --  anywhere             172.19.0.6           tcp dpt:9501
ACCEPT     tcp  --  anywhere             172.19.0.6           tcp dpt:ssh
ACCEPT     tcp  --  anywhere             172.19.0.8           tcp dpt:https
ACCEPT     tcp  --  anywhere             172.19.0.8           tcp dpt:http

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination         
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-ISOLATION-STAGE-2 (4 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-USER (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere -m tcp --dport 22 -j MASQUERADE
-A POSTROUTING -s 172.19.0.8/32 -d 172.19.0.8/32 -p tcp -m tcp --dport 443 -j MASQUERADE
-A POSTROUTING -s 172.19.0.8/32 -d 172.19.0.8/32 -p tcp -m tcp --dport 80 -j MASQUERADE
-A DOCKER -i br-bf4c59b26d33 -j RETURN
-A DOCKER -i br-e2ab1d51063d -j RETURN
-A DOCKER -i br-c9af812dc067 -j RETURN
-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i br-e2ab1d51063d -p tcp -m tcp --dport 6379 -j DNAT --to-destination 172.19.0.2:6379
-A DOCKER ! -i br-e2ab1d51063d -p tcp -m tcp --dport 27017 -j DNAT --to-destination 172.19.0.3:27017
-A DOCKER ! -i br-e2ab1d51063d -p tcp -m tcp --dport 3306 -j DNAT --to-destination 172.19.0.5:3306
-A DOCKER ! -i br-e2ab1d51063d -p tcp -m tcp --dport 9501 -j DNAT --to-destination 172.19.0.6:9501
-A DOCKER ! -i br-e2ab1d51063d -p tcp -m tcp --dport 2222 -j DNAT --to-destination 172.19.0.6:22
-A DOCKER ! -i br-e2ab1d51063d -p tcp -m tcp --dport 443 -j DNAT --to-destination 172.19.0.8:443
-A DOCKER ! -i br-e2ab1d51063d -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.19.0.8:80

這里的 DOCKER 對應(yīng)的是由 docker 自定義的一組過濾規(guī)則,,可以通過 sudo iptables -t filter -L 查看到:

sudo iptables -t filter -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-USER  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (4 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             172.19.0.2           tcp dpt:6379
ACCEPT     tcp  --  anywhere             172.19.0.3           tcp dpt:27017
ACCEPT     tcp  --  anywhere             172.19.0.5           tcp dpt:mysql
ACCEPT     tcp  --  anywhere             172.19.0.6           tcp dpt:9501
ACCEPT     tcp  --  anywhere             172.19.0.6           tcp dpt:ssh
ACCEPT     tcp  --  anywhere             172.19.0.8           tcp dpt:https
ACCEPT     tcp  --  anywhere             172.19.0.8           tcp dpt:http

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination         
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-ISOLATION-STAGE-2 (4 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-USER (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere 

-userland-proxy=false 的情況下

待研究~

性能

docker-proxy 在網(wǎng)絡(luò)上吐槽的比較多,,因為每一對端口映射都會對一個 docker-proxy 進程,如果端口較多,,可能就會帶來性能問題。且在單個 docker-proxy 的情況下,,性能比 iptables 略差,。

總結(jié)

- --link 能夠訪問 expose 聲明的端口

  • -expose 僅聲明端口,并不會自動映射到宿主主機
  • -p 指定端口映射關(guān)系
  • -P 將 expose 聲明的端口發(fā)布到宿主主機
  • 在處理端口映射是,,iptables 規(guī)則優(yōu)先,如果沒有匹配到 iptables 規(guī)則,,則由 docker-proxy 處理

待深入研究的問題:

  • container <-> container,、host <-> container,、 container <-> host 各自怎么選擇策略的
  • iptables 規(guī)則

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多