10-Docker 網絡
基礎網絡概念
數據傳輸通過數據包
兩臺筆記本之間通信是通過數據包通信的。想知道數據包是怎么打包的呢,就先要知道網絡分層的概念。
網絡分層
目前有兩種網絡分層的模型。
- ISO/OSI 分層,也就是 7 層模型。
- TCP/IP 分層,也就是 5 層模型。
TCP/IP 是目前最流行的分層模型。
TCP/IP模型
- 最底層物理層 也就是 傳輸介質,像 網線,光纖…
- 網絡接口層,主要是一些網絡協議
- IP 層,這一層比較重要,比如想連接目標,需要目標的ip地址和自身ip地址
- 傳輸層,tcp/udp
- 應用層,主要是應用的協議,如http,ssh…
路由的概念
我們在地圖中搜索一個地點,我們可能獲得很多路徑,我們從中選擇一條路徑,這就是現實中的路由概念。
那么在網絡中會有路由器幫我們選擇哪一條路徑進行傳輸,路由本身涉及很多知識點,不做介紹。
IP地址和路由
IP地址是唯一標識設備的,如果我們想連接目標地址,那么傳輸的數據內要包含我們的源地址和目的地址。這樣才知道一發一回才知道發給誰。
我們在訪問的過程中,會經過很多路由,比如 電信運行商。
公有IP和私有IP
- Public IP : 互聯網上的唯一標識,可以訪問internet
- Private IP : 不可在互聯網上使用,僅供機構內部使用
那么如果我想通過私有IP訪問互聯網怎么辦?這里就需要用到網絡地址轉換 NAT 技術。
比如說 校園網,那么這個校園網有一個出口,而且有一個公有的 ip 地址, 學生及老師都是使用私有ip地址,那么當學生或老師訪問互聯網的時候,會將數據發送到 學校的路由器上,然后路由器會對這條信息做 NAT 地址轉換。
轉換過程為,NAT 會記錄源地址(source)和目標地址(dest),然后轉換成公網的ip地址,然后發送出去,當發送回來的時候,NAT 會查詢本地存儲的表然后轉換回內部的私有ip地址。
這里我們要先介紹兩個工具 Ping(ICMP) 和 Telnet
- ping 可以判斷IP的可達性
- telnet 檢查服務的可用性,比如一個 web服務器 80/443 端口
案例:
ping www.imooc.com # 慕課網,這里是不能ping 通的,可能是防火墻的原因
使用telnet
telnet www.imooc.com 80
這里可以成功訪問,說明慕課網的這個ip地址是不可達的,但是 80端口的服務是可達的。
實例分析
-
創建一個容器
docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600; done"
busybox 是一個最小化的 linux 鏡像。
-
進入容器內部
docker exec -it test1 /bin/sh
-
查看網絡
$: 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
查看宿主機器的網絡
ip a
此時這里面的網絡和剛剛容器內的網絡是完全隔離的,原理是通過 linux net namespace 技術進行隔離的
-
再次創建一個容器
docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600; done"
-
查看網絡
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
我們再次查看一下 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
我們可以發現 test1 的 ip 為
172.17.0.2
,而 test2 為172.17.0.3
。 -
進入 test1 容器
docker exec -it test1 /bin/sh
ping test2 容器ip
ping 172.17.0.3
我們發現可以ping通,說明兩個容器之間是網絡互通的。