docker学习笔记(三)docker中的网络
目錄
Linux中的網(wǎng)卡
Network Namespace?
Docker中的Bridge網(wǎng)絡(luò)
使用自定義Bridge網(wǎng)絡(luò)創(chuàng)建容器
Container中的其他網(wǎng)絡(luò)
Host網(wǎng)絡(luò)
None網(wǎng)絡(luò)
Linux中的網(wǎng)卡
網(wǎng)卡:網(wǎng)卡是計算機(jī)網(wǎng)絡(luò)中,計算機(jī)能夠進(jìn)行通信的硬件支撐(會有唯一的Mac地址)
1.查看網(wǎng)卡[網(wǎng)絡(luò)接口]?
ip a:
狀態(tài):UP/DOWN/UNKOWN等
link/ether:MAC地址
inet:綁定的IP地址?
2.給網(wǎng)卡添加ip地址
(1) 添加ip地址
? ? ?ip addr add 192.168.0.100/24 dev eth0
(2)刪除IP地址 ? ?
? ? ?ip addr delete 192.168.0.100/24 dev eth0
3. 網(wǎng)卡啟動與關(guān)閉?
重啟網(wǎng)卡
service network restart / systemctl restart network
啟動/關(guān)閉某個網(wǎng)卡
ifup/ifdown eth0
或者ip link set eth0 up/down
Network Namespace?
在linux上,網(wǎng)絡(luò)的隔離是通過network namespace來管理的,不同的network namespace是互相隔離的
管理namespace命令:
ip netns list? ? ? ?//查看
ip netns add ns1? ? ?//添加
ip netns delete ns1? //刪除
ip netns exec ns1 ip a //查看ns1 namespace下的網(wǎng)卡情況
創(chuàng)建兩個namespace,并且啟動其上的網(wǎng)卡
ip netns add ns1 ip netns exec ns1 ip a ip netns exec ns1 ip link set lo up ip netns exec ns1 ip a ip netns add ns2 ip netns exec ns2 ip link set lo up此時想讓兩個namespace網(wǎng)絡(luò)連通起來 就需要使用veth pair?
Virtual Ethernet Pair,是一對的虛擬設(shè)備接口,用于不同network namespace間進(jìn)行通信,veth?pair將一個network namespace數(shù)據(jù)發(fā)往另一個network namespace的veth,如下圖
?
##創(chuàng)建一對veth pair的link,veth-ns1 veth-ns2 ip link add veth-ns1 type veth peer name veth-ns2##查看link情況
此時veth-ns1和veth-ns2還沒有ip,無法連通,查看宿主機(jī)和各namespace下的ip情況
##給veth-ns1 ,veth-ns2添加ip ip netns exec ns1 ip addr add 192.168.0.11/24 dev veth-ns1 ip netns exec ns2 ip addr add 192.168.0.12/24 dev veth-ns2再次查看,發(fā)現(xiàn)state 是down
##啟動veth-ns1和veth-ns2 ip netns exec ns1 ip link set veth-ns1 up ip netns exec ns2 ip link set veth-ns2 up再次使用ip a 查看,發(fā)現(xiàn)veth-ns1,veth-ns2有了IP,并且狀態(tài)是UP
兩個ip可以ping通了
veth-ns1@if5代表該網(wǎng)卡與ns2上的編號為5的網(wǎng)卡是一對,veth-ns2@if6的@if6也是同樣的意思
Docker中的Bridge網(wǎng)絡(luò)
創(chuàng)建兩個tomcat容器,并進(jìn)入其中查看
docker run -d --name tomcat01 -p 8081:8080 tomcat docker run -d --name tomcat02 -p 8082:8080 tomcat docker exec -it tomcat01 ip a docker exec -it tomcat02 ip a兩個container之間的網(wǎng)絡(luò)是互通的,這樣才可以保證在不同容器里部署的多個服務(wù)相互之間可以調(diào)用
創(chuàng)建更多的容器,可以發(fā)現(xiàn)各個容器之間的網(wǎng)絡(luò)都是互通的,但是他們分別屬于不同的namespace,不可能都是之間通過Virtual Ethernet Pair來連通的,這樣容器之間的網(wǎng)絡(luò)就太復(fù)雜了(需要每兩個容器之間都有一個veth pair對)
查看宿主機(jī)的ip
在宿主機(jī)中直接ping tomcat01的ip是可以ping通的,猜測tomcat01和宿主機(jī)之間是通過veth pair連通的.。
在tomcat01中有一個eth0@if8和centos的docker0中的veth97c1ac6@if7(第8個網(wǎng)卡)是成對的
可以安裝下bridge-utils驗證下:yum install bridge-utils?
故docker中容器之間可以連通,是因為他們各自通過veth pair對與docker0連通,
像docker這樣容器之間通過中間層(docker0)實現(xiàn)連通的網(wǎng)絡(luò)連接方式稱之為bridge.
如下圖所示
通過docker network inspect bridge可以看到docker 的bridge網(wǎng)絡(luò)中各container的信息(默認(rèn)的Bridge網(wǎng)絡(luò)名稱就是bridge)
使用自定義Bridge網(wǎng)絡(luò)創(chuàng)建容器
(1)創(chuàng)建自己的bridge network
docker network create tomcat-net?
或者 docker network create --subnet=172.18.0.0/24 tomcat-net?
查看當(dāng)前docker的網(wǎng)絡(luò)
查看一下tomcat-net網(wǎng)絡(luò)的詳情,當(dāng)前沒有任何的container
#docker network inspect tomcat-net
(2)創(chuàng)建tomcat的容器,并且指定使用tomcat-net
? ?docker run -d --name custom-net-tomcat --network tomcat-net tomcat?
(3)查看下自定義的tomcat-net 的網(wǎng)絡(luò)信息
(4)查看容器custom-net-tomcat的網(wǎng)絡(luò)信息和宿主機(jī)的網(wǎng)絡(luò)信息
docker exec -it custom-net-tomcat ip a?
ip a查看宿主機(jī)下的ip
(5)查詢bridge網(wǎng)絡(luò)信息,在新的bridge上有新的pair對
(6)在custome-net-tomcat 自定義network的容器中ping一下tomcat01的ip,發(fā)現(xiàn)不通
不同的network下的容器無法互通
docker exec -it custom-net-tomcat ping 172.17.0.2
(7)嘗試把tomcat01的容器也加入到tomcat-net的網(wǎng)絡(luò)中
? docker network connect tomcat-net tomcat01?
(8)查看tomcat-net的網(wǎng)絡(luò),發(fā)現(xiàn)tomcat01這個容器也在其中
docker network inspect tomcat-net
而且一個network里的tomcat01和custom-net-tomcat可以通過ip和容器名ping通
?
默認(rèn)的bridge和自定義的bridge網(wǎng)絡(luò)區(qū)別:
1. 自定義的bridge網(wǎng)絡(luò)可以刪除,但是默認(rèn)bridge網(wǎng)絡(luò)不可以
2. 默認(rèn)bridge網(wǎng)絡(luò)中所有容器間只能用IP相互訪問。自定義bridge網(wǎng)絡(luò)中容器之間除ip訪問外,還可以直接用容器名作為hostname訪問
3. docker run的時候只能在使用自定義網(wǎng)絡(luò)時指定容器ip
?
Container中的其他網(wǎng)絡(luò)
?
Host網(wǎng)絡(luò)
host網(wǎng)絡(luò)意味著容器與宿主機(jī)共用一套網(wǎng)絡(luò),也就是說容器使用的網(wǎng)絡(luò)就是宿主機(jī)的網(wǎng)絡(luò),使用--network? host指定使用host網(wǎng)絡(luò)。
(1)創(chuàng)建一個tomcat容器,并且指定網(wǎng)絡(luò)為host
docker run -d --name my-tomcat-host --network host tomcat?
(2)查看ip地址 與宿主機(jī)的ip是一樣的?
docker exec -it my-tomcat-host ip a? ?
(3)檢查host網(wǎng)絡(luò)
?使用host網(wǎng)絡(luò)就可以直接通過8080端口訪問容器,而不需要映射到宿主機(jī)的端口
優(yōu)點:復(fù)用了宿主機(jī)網(wǎng)絡(luò),網(wǎng)絡(luò)性能好,數(shù)據(jù)的傳輸效率;
缺點:宿主機(jī)端口可能發(fā)生沖突;破壞了容器的網(wǎng)絡(luò)隔離性
None網(wǎng)絡(luò)
none網(wǎng)絡(luò)意味著沒有網(wǎng)絡(luò),所創(chuàng)建的容器只有l(wèi)o,沒有其他的網(wǎng)卡。容器創(chuàng)建時可以使用--network? none指定使用none網(wǎng)絡(luò)。
(1)創(chuàng)建一個tomcat容器,并且指定網(wǎng)絡(luò)為none
docker run -d --name my-tomcat-none --network none tomcat?
(2)查看ip地址
docker exec -it my-tomcat-none ip a?
?其網(wǎng)絡(luò)類型為UNKNOWN?
(3)檢查none網(wǎng)絡(luò)
?
?
?
總結(jié)
以上是生活随笔為你收集整理的docker学习笔记(三)docker中的网络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker学习笔记(二)创建自己的镜像
- 下一篇: docker学习笔记(四)docker数