網(wǎng)站建設(shè)站長(zhǎng)免費(fèi)網(wǎng)絡(luò)營(yíng)銷軟件
1. Docker 網(wǎng)絡(luò)
1.1 Docker 網(wǎng)絡(luò)實(shí)現(xiàn)原理
Docker使用Linux橋接,在宿主機(jī)虛擬一個(gè)Docker容器網(wǎng)橋(docker0),
Docker啟動(dòng)一個(gè)容器時(shí)會(huì)根據(jù)Docker網(wǎng)橋的網(wǎng)段分配給容器一個(gè)IP地址,稱為Container-IP
,
同時(shí)Docker網(wǎng)橋是每個(gè)容器的默認(rèn)網(wǎng)關(guān)。
因?yàn)樵谕凰拗鳈C(jī)內(nèi)的容器都接入同一個(gè)網(wǎng)橋,這樣容器之間就能夠通過(guò)容器的 Container-IP
直接通信。
1.2 為容器創(chuàng)建端口映射
端口映射:底層原理實(shí)際是做了一個(gè)DNAT轉(zhuǎn)換。
#基本格式
docker run -itd ?--name=為容器指定名稱 -P 鏡像名稱
#示例
#方式1 ---- 隨機(jī)映射端口(從32768開(kāi)始)
docker run -d --name test1 -P nginx
#方式2 ---- 指定映射端口
docker run -d --name test2 -p 43000:80 nginx
2. Docker的網(wǎng)絡(luò)模式概述
2.1 Docker的網(wǎng)絡(luò)模式
Host
: 容器不會(huì)虛擬出自己的網(wǎng)卡,配置主機(jī)的IP等,而是使用宿主機(jī)的IP和端口Container
: 創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個(gè)指定的容器共享IP,端口范圍None
: 該模式關(guān)閉了容器的網(wǎng)絡(luò)功能。Bridge
: 默認(rèn)為該模式,此模式會(huì)為每一個(gè)容器分配,設(shè)置IP等,并將容器連接到一個(gè)docker0 的虛擬網(wǎng)橋,通過(guò)docker 0 網(wǎng)橋以及iptables nat 表配置與宿主機(jī)通信。自定義網(wǎng)絡(luò)
在安裝Docker 時(shí),它會(huì)自動(dòng)創(chuàng)建三個(gè)網(wǎng)絡(luò):bridge
(創(chuàng)建容器默認(rèn)連接到此網(wǎng)絡(luò)),none
,host
。
2.2 查看docker的網(wǎng)絡(luò)列表
#查看docker的網(wǎng)絡(luò)列表docker network ls或者docker network list
2.3 指定容器網(wǎng)絡(luò)模式
#使用docker run創(chuàng)建Docker容器時(shí),可以用 --net 或 --network 選項(xiàng)指定容器的網(wǎng)絡(luò)模式- host模式: 使用 --net=host 指定。
- none模式: 使用 --net=none 指定。
- container模式:使用 --net=container:NAME_or_ID 指定。
- bridge模式: 使用 --net=bridge 指定,默認(rèn)設(shè)置,可省略。
3. 網(wǎng)絡(luò)模式詳解
3.1 host模式
- 相當(dāng)于Vmware中的橋接模式,與宿主機(jī)在同一個(gè)網(wǎng)絡(luò)中,但沒(méi)有獨(dú)立IP地址。
- Docker使用了Linux的Namespaces技術(shù)來(lái)進(jìn)行資源隔離
- 一個(gè)Network Namespace提供了一份獨(dú)立的網(wǎng)絡(luò)環(huán)境,包括網(wǎng)卡、路由、iptable規(guī)則等都與其他的Network Namespace隔離。
- 一個(gè)Docker容器一般會(huì)分配一個(gè)獨(dú)立的
Network Namespace
。 但如果啟動(dòng)容器的時(shí)候使用host模式,那么這個(gè)容器將不會(huì)獲得一個(gè)獨(dú)立的Network Namespace
, 而是和宿主機(jī)共用一個(gè)Network Namespace
。容器將不會(huì)虛擬出自己的網(wǎng)卡、配置自己的IP等,而是使用宿主機(jī)的IP和端口。
容器和宿主機(jī)共享網(wǎng)絡(luò)命名空間,但沒(méi)有獨(dú)立IP地址,使用宿主機(jī)的IP地址,和宿主機(jī)共享端口范圍,例如宿主機(jī)使用了80端口,那么容器不能使用80端口。這種模式比較方便,但不安全。
#示例
docker run --network=host
3.2 container模式
- 這個(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)程可以通過(guò)lo網(wǎng)卡設(shè)備通信。
docker run --network=container:指定的容器ID|容器名
#示例
docker run -itd --name s1 nginx:1.12 /bin/bash
#--name 選項(xiàng)可以給容器創(chuàng)建一個(gè)自定義名稱docker ps -a
docker inspect -f '{{.State.Pid}}' 4a472c5865be
#查看容器的進(jìn)程id號(hào)
docker run -itd --name s2 --net=container:4a472c5865be nginx:1.12 /bin/bashdocker inspect -f '{{.State.Pid}}' 3dc91d1b2eb7
#查看新創(chuàng)建容器進(jìn)程號(hào)
ls -l /proc/63713/nsls -l /proc/63613/ns
#查看兩個(gè)容器的 net namespace 編號(hào)
3.3 none模式
使用none模式,Docker容器擁有自己的Network Namespace
,但是,并不為Docker容器進(jìn)行任何網(wǎng)絡(luò)配置。
也就是說(shuō),這個(gè)Docker容器沒(méi)有網(wǎng)卡、IP、路由等信息。
這種網(wǎng)絡(luò)模式下容器只有l(wèi)o回環(huán)網(wǎng)絡(luò),沒(méi)有其他網(wǎng)卡。
這種類型的網(wǎng)絡(luò)沒(méi)有辦法聯(lián)網(wǎng),封閉的網(wǎng)絡(luò)能很好的保證容器的安全性。
docker run -id --net=none --name s3 nginx:1.12
#指定網(wǎng)絡(luò)模式為nonedocker inspect s3
#使用inspect查看
3.4 bridge模式
bridge模式是docker的默認(rèn)網(wǎng)絡(luò)模式,不用--net
參數(shù),就是bridge
模式
相當(dāng)于Vmware中的 nat 模式,容器使用獨(dú)立network Namespace,并連接到docker0虛擬網(wǎng)卡。通過(guò)docker0網(wǎng)橋以及iptables nat表配置與宿主機(jī)通信,此模式會(huì)為每一個(gè)容器分配Network Namespace、設(shè)置IP等,并將一個(gè)主機(jī)上的 Docker 容器連接到一個(gè)虛擬網(wǎng)橋上。
-
當(dāng)Docker進(jìn)程啟動(dòng)時(shí),會(huì)在主機(jī)上創(chuàng)建一個(gè)名為docker0的虛擬網(wǎng)橋,此主機(jī)上啟動(dòng)的Docker容器會(huì)連接到這個(gè)虛擬網(wǎng)橋上。
-
從docker0子網(wǎng)中分配一個(gè)IP給容器使用,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān)。在主機(jī)上創(chuàng)建一對(duì)虛擬網(wǎng)卡veth pair設(shè)備。
-
Docker將 veth pair 設(shè)備的一端放在新創(chuàng)建的容器中,并命名為 eth0(容器的網(wǎng)卡),另一端放在主機(jī)中, 以 veth* 這樣類似的名字命名, 并將這個(gè)網(wǎng)絡(luò)設(shè)備加入到 docker0 網(wǎng)橋中??梢酝ㄟ^(guò)
brctl show
命令查看。 -
使用
docker run -p
時(shí),docker實(shí)際是在iptables做了DNAT規(guī)則,實(shí)現(xiàn)端口轉(zhuǎn)發(fā)功能??梢允褂?code>iptables -t nat -vnL 查看。
3.5 自定義網(wǎng)絡(luò)模式
直接使用bridge模式,是無(wú)法支持指定IP運(yùn)行docker的,例如執(zhí)行以下命令就會(huì)報(bào)錯(cuò)
docker run -itd --name test3 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
#創(chuàng)建自定義網(wǎng)絡(luò)
docker network create --subnet 新網(wǎng)段 --opt "com.docker.network.bridge.name"="新網(wǎng)橋名" 新網(wǎng)絡(luò)模式名docker run -id --network 新網(wǎng)絡(luò)模式名 --ip 自定義IP#可以先自定義網(wǎng)絡(luò),再使用指定IP運(yùn)行docker
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork----------------------------------------------------------------------------------------------------------
#docker1 為執(zhí)行 ifconfig -a 命令時(shí),顯示的網(wǎng)卡名,如果不使用 --opt 參數(shù)指定此名稱,那你在使用 ifconfig -a 命令查看網(wǎng)絡(luò)信息時(shí),看到的是類似 br-110eb56a0b22 這樣的名字,這顯然不怎么好記。
#mynetwork 為執(zhí)行 docker network list 命令時(shí),顯示的bridge網(wǎng)絡(luò)模式名稱。
---------------------------------------------------------------------------------------------
docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 nginx:1.12 /bin/bash
#再次創(chuàng)建新容器docker inspect s4
#查看詳細(xì)信息