單一主機(jī)docker容器網(wǎng)絡(luò)
CNM(container network model)模型
- Sandbox代表容器的網(wǎng)絡(luò)命名空間橘荠,包含了容器的完整網(wǎng)絡(luò)棧搜立,不同的容器之間可以完全隔離。在宿主機(jī)上段审,就表現(xiàn)為獨(dú)立的網(wǎng)絡(luò)命名空間。
- Endpoint代表容器接入網(wǎng)絡(luò)的端點(diǎn)创泄,可以形象地認(rèn)為一個(gè)Endpoint對容器來說知染,就是一張物理網(wǎng)卡肋僧。
- Network代表一組可以直接相互通信的Endpoint集合弓熏,可以基于LinuxBridge或者VLAN實(shí)現(xiàn)卸例。在宿主機(jī)上,每個(gè)網(wǎng)絡(luò)都是一個(gè)獨(dú)立的網(wǎng)絡(luò)命名空間搁拙,宿主機(jī)上同一網(wǎng)絡(luò)的的容器掺炭,都通過veth pair鏈接到這個(gè)網(wǎng)絡(luò)命名空間上辫诅。
Docker提供了多種網(wǎng)絡(luò)工作模式
通過 docker network ls
可以查看
scope為local表示網(wǎng)絡(luò)模式只能用于單個(gè)主機(jī),不能用于集群
The brige network
當(dāng) docker daemon 啟動后涧狮,在linux系統(tǒng)中炕矮,可以使用ifconfig
命令查看到有一個(gè)名為docker0的網(wǎng)橋(在mac中么夫,docker是啟動在虛擬機(jī)中,所以不存在docker0的網(wǎng)橋)
默認(rèn)網(wǎng)絡(luò)模式肤视,此模式下档痪,容器有自己的獨(dú)立的Network Namespace。簡單來說邢滑,Docker在宿主機(jī)上虛擬了一個(gè)子網(wǎng)絡(luò)腐螟,宿主機(jī)上所有容器均在這個(gè)子網(wǎng)絡(luò)中獲取IP,這個(gè)子網(wǎng)通過網(wǎng)橋掛在宿主機(jī)網(wǎng)絡(luò)上困后。Docker通過NAT技術(shù)確保容器可與宿主機(jī)外部網(wǎng)絡(luò)交互乐纸。
eth:以太網(wǎng)卡
veth:虛擬以太網(wǎng)卡
新創(chuàng)建一個(gè)bridge
$ docker network create --driver bridge sample-net
再次查看docker network,就會多出一個(gè)實(shí)例
查看子網(wǎng)范圍
$ docker network inspect sample-net |grep Subnet
查看子網(wǎng)范圍摇予,發(fā)現(xiàn)不同bridge子網(wǎng)范圍不一致
指定子網(wǎng)范圍(/16表示子網(wǎng)掩碼)
$ docker network create --driver bridge --subnet "10.1.0.0/16" test-net
啟動容器c1
$ docker container run --name c1 -it -d jenkins
查看默認(rèn)bridge信息
$ docker network inspect bridge
發(fā)現(xiàn)此時(shí)包含容器c1信息
啟動容器c3
$ docker container run --name c3 -d --network test-net jenkins
查看test-net的bridge信息
docker network inspect test-net
發(fā)現(xiàn)此時(shí)包含容器c3信息
連續(xù)兩次聲明network汽绢,以最后一個(gè)為準(zhǔn)
$ docker container run --name c5 -d --network sample-net --network test-net jenkins
刪除network
docker network rm test-net
docker network rm sample-net
The host network
啟動容器
$ docker container run --rm -it --network host jenkins /bin/bash
執(zhí)行ip addr
發(fā)現(xiàn)看到的都是宿主機(jī)上的信息
The null network
啟動容器
$ docker container run --rm -it --network none jenkins /bin/sh
執(zhí)行ip addr show ehto
發(fā)現(xiàn)找不到eth0網(wǎng)卡信息
container:web
創(chuàng)建bridge
$ docker network create --driver bridge test-net
創(chuàng)建鏡像為nginx的容器web
$ docker container run --name web -d --network test-net nginx
創(chuàng)建容器alpine
$ docker container run -it --rm --network container:web alpine /bin/sh
上述容器共享同一namespace,可互相訪問
$ wget localhost:80
port management
$ docker container run --name web -P -d nginx
-P表示所有的容器端口均暴露給主機(jī)的32XXX端口范圍
查看端口
$ docker container port web
以參數(shù)的形式暴露端口
$ docker container run --name web2 -p 8079:80 -d nginx