Docker--网络详解
文章目錄
- 一、Docker網絡原理
- 1.1**容器內先安裝net-tools工具yum install -y net-tools然后查看容器IP(container ip)**
- 1.2**默認網絡**
一、Docker網絡原理
Docker使用Linux橋接,在宿主機虛擬一個Docker容器網橋(docker0),Docker啟動一個容器時會根據Docker網橋的網段分配給容器一個IP地址,稱為Container-IP, 同時Docker網橋是 每個容器的默認網關。因為在同一宿主機內的容器都接入同一個網橋,這樣容器之間就能夠通過容器的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容器內先安裝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進行隨機端口映射 [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加端口進行指定的端口映射 [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頁面#可以訪問是因為通過iptables的DNAT進行了轉換 [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默認網絡
當你安裝Docker時,它會自動創建三個網絡。你可以使用以下docker network ls命令列出這些網絡
[root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 69b39f1a9e1a bridge bridge local da57f14ea87a host host local b3681285c530 none null localDocker網絡類型
| Host | 容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和端口 |
| Container | 創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、端口范圍 |
| None | 該模式關閉了容器的網絡功能 |
| Bridge | 默認為該模式,此模式會為每一個 容器分配、設置IP等,并將容器連接到一個docker0虛擬網橋,通過docker0網橋以及iptables nat表配置與宿主機通信 |
| 自定義網絡模式 | 安裝Docker時,它會自動創建三個網絡,bridge (創建容器默認連接到此網絡)、none 、host |
使用docker run 創建Docker容器時,可以用–net或–network 選項指定容器的網絡模式
| host模式 | 使用–net=host指定 |
| Container模式 | 使用–net=none 指定 |
| None模式 | 使用–net=container:NAME_ _or_ID指定 |
| Bridge模式 | 使用–net=bridge指定,默認設置,可省略 |
Host模式
Host 模式并沒有為容器創建一個隔離的網絡環境。而之所以稱之為host模式,是因為該模式下的 Docker 容器會和 host 宿主機共享同一個網絡 namespace,故 Docker Container可以和宿主機一樣,使用宿主機的eth0,實現和外界的通信。換言之,Docker Container的 IP 地址即為宿主機 eth0 的 IP 地址,其特點包括:
(1)這種模式下的容器沒有隔離的 network namespace
(2)容器的 IP 地址同 Docker host 的 IP 地址
(3)需要注意容器中服務的端口號不能與 Docker host 上已經使用的端口號相沖突
(3)host 模式能夠和其它模式共存
container模式
Container 網絡模式是 Docker 中一種較為特別的網絡的模式。處于這個模式下的 Docker 容器會共享其他容器的網絡環境,因此,至少這兩個容器之間不存在網絡隔離,而這兩個容器又與宿主機以及除此之外其他的容器存在網絡隔離
none模式
網絡模式為 none,即不為 Docker 容器構造任何網絡環境。一旦Docker 容器采用了none 網絡模式,那么容器內部就只能使用loopback網絡設備,不會再有其他的網絡資源。Docker Container的none網絡模式意味著不給該容器創建任何網絡環境,容器只能使用127.0.0.1的本機網絡
bridge模式
Docker 容器默認使用 bridge 模式的網絡。其特點如下:
(1)使用一個 linux bridge,默認為 docker0
(2)使用 veth 對,一頭在容器的網絡 namespace 中,一頭在 docker0 上
(3)該模式下Docker Container不具有一個公有IP,因為宿主機的IP地址與veth pair的 IP地址不在同一個網段內
(4)Docker采用 NAT 方式,將容器內部的服務監聽的端口與宿主機的某一個端口port 進行“綁定”,使得宿主機以外的世界可以主動將網絡報文發送至容器內部
(5)外界訪問容器內的服務時,需要訪問宿主機的 IP 以及宿主機的端口 port
(6)NAT 模式由于是在三層網絡上的實現手段,故肯定會影響網絡的傳輸效率
(7)容器擁有獨立、隔離的網絡棧;讓容器和宿主機以外的世界通過NAT建立通信
自定義網絡模式創建步驟
指定IP運行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總結
以上是生活随笔為你收集整理的Docker--网络详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows安装TortoiseSVN
- 下一篇: git repack多包使用及相关性能测