Docker--网络详解
文章目錄
- 一、Docker網(wǎng)絡(luò)原理
- 1.1**容器內(nèi)先安裝net-tools工具yum install -y net-tools然后查看容器IP(container ip)**
- 1.2**默認(rèn)網(wǎng)絡(luò)**
一、Docker網(wǎng)絡(luò)原理
Docker使用Linux橋接,在宿主機(jī)虛擬一個Docker容器網(wǎng)橋(docker0),Docker啟動一個容器時會根據(jù)Docker網(wǎng)橋的網(wǎng)段分配給容器一個IP地址,稱為Container-IP, 同時Docker網(wǎng)橋是 每個容器的默認(rèn)網(wǎng)關(guān)。因?yàn)樵谕凰拗鳈C(jī)內(nèi)的容器都接入同一個網(wǎng)橋,這樣容器之間就能夠通過容器的Container-IP直接通信
[root@localhost ~]# ifconfig docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255ether 02:42:b1:c5:3b:4f txqueuelen 0 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 01.1容器內(nèi)先安裝net-tools工具yum install -y net-tools然后查看容器IP(container ip)
[root@localhost ~]# yum install -y net-tools [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2d1f43c3d536 tomcat:latest "/bin/bash" 6 seconds ago Created reverent_banzai#使用大寫p進(jìn)行隨機(jī)端口映射 [root@localhost ~]# docker run -itd --name test1 -P tomcat 95fffcb47dbbd93ed798ada33a54b2aa5b17d8fb1e4a7ab73fb638501ca54a5b [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 95fffcb47dbb tomcat "catalina.sh run" 5 seconds ago Up 4 seconds 0.0.0.0:49153->8080/tcp, :::49153->8080/tcp test1 2d1f43c3d536 tomcat:latest "/bin/bash" 2 minutes ago Exited (137) About a minute ago reverent_banzai#使用小寫p加端口進(jìn)行指定的端口映射 [root@localhost ~]# docker run -itd --name test2 -p 49110:80 tomcat 581f77fc4c7cd42d2c41bd9126d9ff0226583e3368d8366dedb1a56e4417a389 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 581f77fc4c7c tomcat "catalina.sh run" 3 seconds ago Up 2 seconds 8080/tcp, 0.0.0.0:49110->80/tcp, :::49110->80/tcp test2 95fffcb47dbb tomcat "catalina.sh run" 2 minutes ago Up 2 minutes 0.0.0.0:49153->8080/tcp, :::49153->8080/tcp test1 2d1f43c3d536 tomcat:latest "/bin/bash" 4 minutes ago Exited (137) 3 minutes ago reverent_banzai#測試 分別登錄192.168.237.141:49110和192.168.237.141:49153可以訪問tomcat頁面#可以訪問是因?yàn)橥ㄟ^iptables的DNAT進(jìn)行了轉(zhuǎn)換 [root@localhost ~]# iptables -nL -t nat Chain PREROUTING (policy ACCEPT) target prot opt source destination DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCALChain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCALChain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0 RETURN all -- 192.168.122.0/24 224.0.0.0/24 RETURN all -- 192.168.122.0/24 255.255.255.255 MASQUERADE tcp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535 MASQUERADE udp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535 MASQUERADE all -- 192.168.122.0/24 !192.168.122.0/24 MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:8080 MASQUERADE tcp -- 172.17.0.3 172.17.0.3 tcp dpt:80Chain DOCKER (2 references) target prot opt source destination RETURN all -- 0.0.0.0/0 0.0.0.0/0 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:172.17.0.2:8080 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49110 to:172.17.0.3:801.2默認(rèn)網(wǎng)絡(luò)
當(dāng)你安裝Docker時,它會自動創(chuàng)建三個網(wǎng)絡(luò)。你可以使用以下docker network ls命令列出這些網(wǎng)絡(luò)
[root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 69b39f1a9e1a bridge bridge local da57f14ea87a host host local b3681285c530 none null localDocker網(wǎng)絡(luò)類型
| Host | 容器將不會虛擬出自己的網(wǎng)卡,配置自己的IP等,而是使用宿主機(jī)的IP和端口 |
| Container | 創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個指定的容器共享IP、端口范圍 |
| None | 該模式關(guān)閉了容器的網(wǎng)絡(luò)功能 |
| Bridge | 默認(rèn)為該模式,此模式會為每一個 容器分配、設(shè)置IP等,并將容器連接到一個docker0虛擬網(wǎng)橋,通過docker0網(wǎng)橋以及iptables nat表配置與宿主機(jī)通信 |
| 自定義網(wǎng)絡(luò)模式 | 安裝Docker時,它會自動創(chuàng)建三個網(wǎng)絡(luò),bridge (創(chuàng)建容器默認(rèn)連接到此網(wǎng)絡(luò))、none 、host |
使用docker run 創(chuàng)建Docker容器時,可以用–net或–network 選項(xiàng)指定容器的網(wǎng)絡(luò)模式
| host模式 | 使用–net=host指定 |
| Container模式 | 使用–net=none 指定 |
| None模式 | 使用–net=container:NAME_ _or_ID指定 |
| Bridge模式 | 使用–net=bridge指定,默認(rèn)設(shè)置,可省略 |
Host模式
Host 模式并沒有為容器創(chuàng)建一個隔離的網(wǎng)絡(luò)環(huán)境。而之所以稱之為host模式,是因?yàn)樵撃J较碌?Docker 容器會和 host 宿主機(jī)共享同一個網(wǎng)絡(luò) namespace,故 Docker Container可以和宿主機(jī)一樣,使用宿主機(jī)的eth0,實(shí)現(xiàn)和外界的通信。換言之,Docker Container的 IP 地址即為宿主機(jī) eth0 的 IP 地址,其特點(diǎn)包括:
(1)這種模式下的容器沒有隔離的 network namespace
(2)容器的 IP 地址同 Docker host 的 IP 地址
(3)需要注意容器中服務(wù)的端口號不能與 Docker host 上已經(jīng)使用的端口號相沖突
(3)host 模式能夠和其它模式共存
container模式
Container 網(wǎng)絡(luò)模式是 Docker 中一種較為特別的網(wǎng)絡(luò)的模式。處于這個模式下的 Docker 容器會共享其他容器的網(wǎng)絡(luò)環(huán)境,因此,至少這兩個容器之間不存在網(wǎng)絡(luò)隔離,而這兩個容器又與宿主機(jī)以及除此之外其他的容器存在網(wǎng)絡(luò)隔離
none模式
網(wǎng)絡(luò)模式為 none,即不為 Docker 容器構(gòu)造任何網(wǎng)絡(luò)環(huán)境。一旦Docker 容器采用了none 網(wǎng)絡(luò)模式,那么容器內(nèi)部就只能使用loopback網(wǎng)絡(luò)設(shè)備,不會再有其他的網(wǎng)絡(luò)資源。Docker Container的none網(wǎng)絡(luò)模式意味著不給該容器創(chuàng)建任何網(wǎng)絡(luò)環(huán)境,容器只能使用127.0.0.1的本機(jī)網(wǎng)絡(luò)
bridge模式
Docker 容器默認(rèn)使用 bridge 模式的網(wǎng)絡(luò)。其特點(diǎn)如下:
(1)使用一個 linux bridge,默認(rèn)為 docker0
(2)使用 veth 對,一頭在容器的網(wǎng)絡(luò) namespace 中,一頭在 docker0 上
(3)該模式下Docker Container不具有一個公有IP,因?yàn)樗拗鳈C(jī)的IP地址與veth pair的 IP地址不在同一個網(wǎng)段內(nèi)
(4)Docker采用 NAT 方式,將容器內(nèi)部的服務(wù)監(jiān)聽的端口與宿主機(jī)的某一個端口port 進(jìn)行“綁定”,使得宿主機(jī)以外的世界可以主動將網(wǎng)絡(luò)報文發(fā)送至容器內(nèi)部
(5)外界訪問容器內(nèi)的服務(wù)時,需要訪問宿主機(jī)的 IP 以及宿主機(jī)的端口 port
(6)NAT 模式由于是在三層網(wǎng)絡(luò)上的實(shí)現(xiàn)手段,故肯定會影響網(wǎng)絡(luò)的傳輸效率
(7)容器擁有獨(dú)立、隔離的網(wǎng)絡(luò)棧;讓容器和宿主機(jī)以外的世界通過NAT建立通信
自定義網(wǎng)絡(luò)模式創(chuàng)建步驟
指定IP運(yùn)行docker
[root@localhost ~]# docker run -it --name test7 --net mynetwork --ip 172.18.0.15 centos:7 /bin/bash [root@228a9b43ff7b /]# yum install net-tools[root@228a9b43ff7b /]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 172.18.0.15 netmask 255.255.0.0 broadcast 172.18.255.255ether 02:42:ac:12:00:0f txqueuelen 0 (Ethernet)RX packets 2895 bytes 23643460 (22.5 MiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 2007 bytes 111783 (109.1 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0總結(jié)
以上是生活随笔為你收集整理的Docker--网络详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows安装TortoiseSVN
- 下一篇: git repack多包使用及相关性能测