10-Docker 网络
10-Docker 網(wǎng)絡(luò)
基礎(chǔ)網(wǎng)絡(luò)概念
數(shù)據(jù)傳輸通過(guò)數(shù)據(jù)包
兩臺(tái)筆記本之間通信是通過(guò)數(shù)據(jù)包通信的。想知道數(shù)據(jù)包是怎么打包的呢,就先要知道網(wǎng)絡(luò)分層的概念。
網(wǎng)絡(luò)分層
目前有兩種網(wǎng)絡(luò)分層的模型。
- ISO/OSI 分層,也就是 7 層模型。
- TCP/IP 分層,也就是 5 層模型。
TCP/IP 是目前最流行的分層模型。
TCP/IP模型
- 最底層物理層 也就是 傳輸介質(zhì),像 網(wǎng)線,光纖…
- 網(wǎng)絡(luò)接口層,主要是一些網(wǎng)絡(luò)協(xié)議
- IP 層,這一層比較重要,比如想連接目標(biāo),需要目標(biāo)的ip地址和自身ip地址
- 傳輸層,tcp/udp
- 應(yīng)用層,主要是應(yīng)用的協(xié)議,如http,ssh…
路由的概念
我們?cè)诘貓D中搜索一個(gè)地點(diǎn),我們可能獲得很多路徑,我們從中選擇一條路徑,這就是現(xiàn)實(shí)中的路由概念。
那么在網(wǎng)絡(luò)中會(huì)有路由器幫我們選擇哪一條路徑進(jìn)行傳輸,路由本身涉及很多知識(shí)點(diǎn),不做介紹。
IP地址和路由
IP地址是唯一標(biāo)識(shí)設(shè)備的,如果我們想連接目標(biāo)地址,那么傳輸?shù)臄?shù)據(jù)內(nèi)要包含我們的源地址和目的地址。這樣才知道一發(fā)一回才知道發(fā)給誰(shuí)。
我們?cè)谠L問(wèn)的過(guò)程中,會(huì)經(jīng)過(guò)很多路由,比如 電信運(yùn)行商。
公有IP和私有IP
- Public IP : 互聯(lián)網(wǎng)上的唯一標(biāo)識(shí),可以訪問(wèn)internet
- Private IP : 不可在互聯(lián)網(wǎng)上使用,僅供機(jī)構(gòu)內(nèi)部使用
那么如果我想通過(guò)私有IP訪問(wèn)互聯(lián)網(wǎng)怎么辦?這里就需要用到網(wǎng)絡(luò)地址轉(zhuǎn)換 NAT 技術(shù)。
比如說(shuō) 校園網(wǎng),那么這個(gè)校園網(wǎng)有一個(gè)出口,而且有一個(gè)公有的 ip 地址, 學(xué)生及老師都是使用私有ip地址,那么當(dāng)學(xué)生或老師訪問(wèn)互聯(lián)網(wǎng)的時(shí)候,會(huì)將數(shù)據(jù)發(fā)送到 學(xué)校的路由器上,然后路由器會(huì)對(duì)這條信息做 NAT 地址轉(zhuǎn)換。
轉(zhuǎn)換過(guò)程為,NAT 會(huì)記錄源地址(source)和目標(biāo)地址(dest),然后轉(zhuǎn)換成公網(wǎng)的ip地址,然后發(fā)送出去,當(dāng)發(fā)送回來(lái)的時(shí)候,NAT 會(huì)查詢本地存儲(chǔ)的表然后轉(zhuǎn)換回內(nèi)部的私有ip地址。
這里我們要先介紹兩個(gè)工具 Ping(ICMP) 和 Telnet
- ping 可以判斷IP的可達(dá)性
- telnet 檢查服務(wù)的可用性,比如一個(gè) web服務(wù)器 80/443 端口
案例:
ping www.imooc.com # 慕課網(wǎng),這里是不能ping 通的,可能是防火墻的原因使用telnet
telnet www.imooc.com 80這里可以成功訪問(wèn),說(shuō)明慕課網(wǎng)的這個(gè)ip地址是不可達(dá)的,但是 80端口的服務(wù)是可達(dá)的。
實(shí)例分析
創(chuàng)建一個(gè)容器
docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600; done"busybox 是一個(gè)最小化的 linux 鏡像。
進(jìn)入容器內(nèi)部
docker exec -it test1 /bin/sh查看網(wǎng)絡(luò)
$: ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever 21: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ffinet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever然后退出
exit查看宿主機(jī)器的網(wǎng)絡(luò)
ip a此時(shí)這里面的網(wǎng)絡(luò)和剛剛?cè)萜鲀?nèi)的網(wǎng)絡(luò)是完全隔離的,原理是通過(guò) linux net namespace 技術(shù)進(jìn)行隔離的
再次創(chuàng)建一個(gè)容器
docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600; done"查看網(wǎng)絡(luò)
docker exec test2 ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever 23: eth0@if24: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ffinet 172.17.0.3/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever我們?cè)俅尾榭匆幌?test1 容器的ip
docker exec test1 ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever 21: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ffinet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever我們可以發(fā)現(xiàn) test1 的 ip 為 172.17.0.2,而 test2 為172.17.0.3。
進(jìn)入 test1 容器
docker exec -it test1 /bin/shping test2 容器ip
ping 172.17.0.3我們發(fā)現(xiàn)可以ping通,說(shuō)明兩個(gè)容器之間是網(wǎng)絡(luò)互通的。
總結(jié)
以上是生活随笔為你收集整理的10-Docker 网络的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Typescript实现单例之父类调用子
- 下一篇: UVA - 489 Han