Docker 中的網(wǎng)絡(luò)功能介紹
創(chuàng)新互聯(lián)建站是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來公司不斷探索創(chuàng)新,始終堅(jiān)持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過去的十載時(shí)間我們累計(jì)服務(wù)了上千家以及全國(guó)政企客戶,如成都塑料袋等企業(yè)單位,完善的項(xiàng)目管理流程,嚴(yán)格把控項(xiàng)目進(jìn)度與質(zhì)量監(jiān)控加上過硬的技術(shù)實(shí)力獲得客戶的一致稱譽(yù)。
默認(rèn)情況下,容器可以建立到外部網(wǎng)絡(luò)的連接,但是外部網(wǎng)絡(luò)無法連接到容器。
Docker 允許通過外部訪問容器或容器互聯(lián)的方式來提供網(wǎng)絡(luò)服務(wù)
外部訪問容器:
容器中可以運(yùn)行一些網(wǎng)絡(luò)應(yīng)用,要讓外部也可以訪問這些應(yīng)用,可以通過 -P 或 -p 參數(shù)來指定端口映射。
實(shí)驗(yàn)環(huán)境:
Centos7運(yùn)行一個(gè)容器,提供web服務(wù)和ssh服務(wù)
宿主機(jī)啟用路由轉(zhuǎn)發(fā)(net.ipv4.ip_forward=1)
實(shí)驗(yàn)步驟:
之前已經(jīng)創(chuàng)建好鏡像啦
執(zhí)行docker p_w_picpaths查看新生成的鏡像
當(dāng)使用–P(大寫)標(biāo)記時(shí),Docker 會(huì)隨機(jī)映射一個(gè)隨機(jī)的端口到內(nèi)部容器開放的網(wǎng)絡(luò)端口。
注:-P使用時(shí)需要指定--expose選項(xiàng)或dockerfile中用expose指令容器要暴露的端口,指定需要對(duì)外提供服務(wù)的端口
使用 docker ps 可以看到,本地主機(jī)的32770被映射到了容器的22端口,本地主機(jī)的32769被映射到了容器的80端口,本地主機(jī)的32768被映射到了容器的443 端口
此時(shí)訪問本機(jī)的 32770端口即可訪問容器內(nèi) ssh 應(yīng)用
查看容器運(yùn)行的httpd進(jìn)程
注:192.168.190.128是宿主機(jī)目錄
此時(shí)訪問本機(jī)的 32769端口即可訪問容器內(nèi) web 應(yīng)用
-p(小寫)則可以指定要映射的端口,并且,在一個(gè)指定端口上只可以綁定一個(gè)容器
注意:
容器有自己的內(nèi)部網(wǎng)絡(luò)和 ip 地址(使用 docker inspect 可以獲取所有的變量。)
-p 標(biāo)記可以多次使用來綁定多個(gè)端口
映射所有接口地址:
使用 hostPort:containerPort 格式,將本地的10111端口映射到容器的 22 端口,本地的801端口映射到容器的80端口可以執(zhí)行
測(cè)試訪問:
1)ssh測(cè)試:
使用xshell工具:
測(cè)試web訪問
映射到指定地址的指定端口
可以使用 ip:hostPort:containerPort 格式,指定映射使用一個(gè)特定地址
映射到指定地址的任意端口
使用 ip::containerPort 綁定192.168.190.128的任意端口到容器的80端口,本地主機(jī)會(huì)自動(dòng)分配一個(gè)口。--name為啟動(dòng)的容器指定一個(gè)容器名
使用 docker port 來查看當(dāng)前映射的端口配置,也可以查看到綁定的地址
Docker NAT iptables實(shí)現(xiàn)
默認(rèn)情況下,容器可以主動(dòng)訪問到外部網(wǎng)絡(luò)的連接,但是外部網(wǎng)絡(luò)無法訪問到容器
容器訪問外部實(shí)現(xiàn)
容器所有到外部網(wǎng)絡(luò)的連接,源地址都會(huì)被 NAT 成本地系統(tǒng)的 IP 地址(即docker0地址)。這是使用 iptables 的源地址偽裝操作實(shí)現(xiàn)的
查看主機(jī)的 NAT 規(guī)則
外部訪問容器實(shí)現(xiàn)
容器允許外部訪問,可以在 docker run 時(shí)候通過 -p 或 -P 參數(shù)來啟用,不管用那種辦法,其實(shí)也是在本地的 iptable 的 nat 表中添加相應(yīng)的規(guī)則
使用 -P 時(shí)
iptables -t nat –nvL
使用 -p 80:80 時(shí)
iptables -t nat –nvL
docker0 網(wǎng)橋
Docker服務(wù)默認(rèn)會(huì)創(chuàng)建一個(gè) docker0 網(wǎng)橋(其上有一個(gè) docker0 內(nèi)部接口),它在內(nèi)核層連通了其他的物理或虛擬網(wǎng)卡,這就將所有容器和本地主機(jī)都放到同一個(gè)物理網(wǎng)絡(luò)。
Docker默認(rèn)指定了 docker0 接口的 IP 地址和子網(wǎng)掩碼,讓主機(jī)和容器之間可以通過網(wǎng)橋相互通信
由于目前 Docker 網(wǎng)橋是 Linux 網(wǎng)橋,用戶可以使用 brctl show 來查看網(wǎng)橋和端口連接信息
注:brctl 命令在centos中可以使用yum install bridge-utils 來安裝
每次創(chuàng)建一個(gè)新容器的時(shí)候,Docker 從可用的地址段中選擇一個(gè)空閑的 IP 地址分配給容器的 eth0端口。使用本地主機(jī)上 docker0 接口的 IP 作為所有容器的默認(rèn)網(wǎng)關(guān)
Docker網(wǎng)絡(luò)配置
Docker四種網(wǎng)絡(luò)模式
docker run 創(chuàng)建 Docker 容器時(shí),可以用 --net 選項(xiàng)指定容器的網(wǎng)絡(luò)模式,Docker 有以下 4 種網(wǎng)絡(luò)模式:
host模式,使用 --net=host 指定。
container模式,使用 --net=container:NAMEorID 指定。
none模式,使用 --net=none 指定。
bridge模式,使用 --net=bridge 指定,默認(rèn)設(shè)置
host模式
如果啟動(dòng)容器的時(shí)候使用 host 模式,那么這個(gè)容器將不會(huì)獲得一個(gè)獨(dú)立的 Network Namespace,而是和宿主機(jī)共用一個(gè) NetworkNamespace。容器將不會(huì)虛擬出自己的網(wǎng)卡,配置自己的 IP 等,而是使用宿主機(jī)的 IP 和端口。
例如,我們?cè)?92.168.190.128/24 的機(jī)器上用 host 模式啟動(dòng)一個(gè)含有 web 應(yīng)用的 Docker 容器,監(jiān)聽 tcp 80 端口。當(dāng)我們?cè)谌萜髦袌?zhí)行任何類似 ifconfig 命令查看網(wǎng)絡(luò)環(huán)境時(shí),看到的都是宿主機(jī)上的信息。而外界訪問容器中的應(yīng)用,則直接使用192.168.190.128:80 即可,不用任何 NAT 轉(zhuǎn)換,就如直接跑在宿主機(jī)中一樣。但是,容器的其他方面,如文件系統(tǒng)、進(jìn)程列表等還是和宿主機(jī)隔離的。
啟動(dòng)容器前,執(zhí)行pgrep http查看宿主機(jī)httpd進(jìn)程
上面顯示結(jié)果說明宿主機(jī)沒有httpd進(jìn)程運(yùn)行
用 host 模式啟動(dòng)一個(gè)含有 web 應(yīng)用的 Docker 容器
用瀏覽器訪問宿主機(jī)地址的80端口
注意防火墻
這個(gè)模式指定新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè) Network Namespace,而不是和宿主機(jī)共享。新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的 IP,而是和一個(gè)指定的容器共享 IP、端口范圍等。同樣,兩個(gè)容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離的。兩個(gè)容器的進(jìn)程可以通過 lo 網(wǎng)卡設(shè)備通信。
運(yùn)行一個(gè)容器:查看容器的IP
將容器切換到后臺(tái)運(yùn)行:ctrl+p ctrl+q
在運(yùn)行一個(gè)容器使用container模式:查看新容器的地址
將這個(gè)網(wǎng)絡(luò)設(shè)備加入到docker0網(wǎng)橋中,可以通過brctl show命令查看;從docker0子網(wǎng)中分配一個(gè)IP給容器使用,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān)。
容器內(nèi)部訪問外網(wǎng)以及容器和主機(jī)之間的端口映射都是通過Iptables實(shí)現(xiàn)的,可以查看Iptables表分析。
查看當(dāng)前 docker0地址
在容器運(yùn)行時(shí),每個(gè)容器都會(huì)分配一個(gè)特定的虛擬機(jī)口并橋接到 docker0。每個(gè)容器都會(huì)配置同 docker0 ip 相同網(wǎng)段的專用 ip 地址,docker0 的 IP 地址被用于所有容器的默認(rèn)網(wǎng)關(guān)。
運(yùn)行一個(gè)容器
并且查看
通過brctl show命令查看
執(zhí)行docker network inspect bridge查看橋接網(wǎng)絡(luò)的詳細(xì)信息
除了默認(rèn)的 docker0 網(wǎng)橋,用戶也可以指定網(wǎng)橋來連接各個(gè)容器。在啟動(dòng) Docker 服務(wù)的時(shí)候,使用 -b BRIDGE 或 --bridge=BRIDGE 來指定使用的網(wǎng)橋。
Docker允許你管理 docker0 橋接或者通過-b選項(xiàng)自定義橋接網(wǎng)卡,需要安裝bridge-utils軟件包。
基本步驟如下:
1.確保 docker 的進(jìn)程是停止的
2.創(chuàng)建自定義網(wǎng)橋
3.給網(wǎng)橋分配特定的 ip
4.以 -b 的方式指定網(wǎng)橋
具體操作步驟:
如果服務(wù)已經(jīng)運(yùn)行,那需要先停止服務(wù),并刪除舊的網(wǎng)橋
然后創(chuàng)建一個(gè)網(wǎng)橋 bridge0,給網(wǎng)橋分配特定的 ip
查看確認(rèn)網(wǎng)橋創(chuàng)建并啟動(dòng)
(兩種方法)
修改/etc/sysconfig/docker文件
添加 –b=bridge0
啟動(dòng) Docker 服務(wù)
新建一個(gè)容器,可以看到它已經(jīng)橋接到了 bridge0 上
進(jìn)入容器,查看容器的IP
docker服務(wù)啟動(dòng)成功并綁定容器到新的網(wǎng)橋,新建一個(gè)容器,你會(huì)看到它的 ip 是我們的設(shè)置的新 ip段, docker 會(huì)自動(dòng)檢測(cè)到它。用 brctl show 可以看到容器啟動(dòng)或則停止后網(wǎng)橋的配置變化,在容器中使用 ip a和 ip r 來查看 ip 地址配置和路由信息。
下面通過配置一個(gè)以 --net=none 啟動(dòng)的容器,使他達(dá)到跟平常一樣具有訪問網(wǎng)絡(luò)的權(quán)限。來介紹docker 是如何連接到容器中的。
啟動(dòng)一個(gè)運(yùn)行 /bin/bash的容器,并指定 --net=none
再開啟一個(gè)新的終端,查找這個(gè)容器的進(jìn)程 id ,然后創(chuàng)建它的命名空間,后面的 ip netns 會(huì)用到
檢查橋接網(wǎng)卡的 ip 和子網(wǎng)掩碼
創(chuàng)建一對(duì)” peer“接口A 和 B ,綁定 A 到網(wǎng)橋,并啟用它
將 B 放到容器的網(wǎng)絡(luò)命名空間,命名為 eth0, 配置一個(gè)空閑的 ip
可以使用網(wǎng)絡(luò)了
本文名稱:docker的網(wǎng)絡(luò)管理(1)
網(wǎng)站網(wǎng)址:http://www.chinadenli.net/article28/iijojp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、商城網(wǎng)站、App設(shè)計(jì)、微信小程序、網(wǎng)站收錄、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)