小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
1. Docker 本地网络类型
1.1 查看支持网络类型
docker network ls
NETWORK ID NAME DRIVER SCOPE
137e2fd68513 bridge bridge local
c43acf6a922f host host local
295eb17c2c16 none null local
1.2 测试使用各类网络类型
docker run network=xxx
-
none:无网络模式
-
bridge:默认模式,相当于 NAT
-
host:公用宿主机 Network NameSpace
-
container:与其他容器公用 Network Namespace
1.2.1 bridge
bridge 是启动容器默认的一种网络类型,相当于 NAT 的一种模式。
我们使用 ifconfig,可以看到有个 docker0 的网络。
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80::42:aeff:fe30:bf0f prefixlen 64 scopeid 0x20<link>
ether 02:42:ae:30:bf:0f txqueuelen 0 (Ethernet)
RX packets 49768 bytes 5180725 (4.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 54077 bytes 346273392 (330.2 MiB)
docker0 网络就是 NAT 的网桥,是 172.17.0.1。
宿主机有对外的端口,eth0、eth1 ……,装完 docker,会有一个 docker0 的网桥,这个网桥的默认网段是 172.17.0/16。
每次启动容器,容器内部也会有一个 eth0 网卡,地址假如是 172.17.0.2。通过网桥,容器可以和宿主机访问了。
如果容器想要上网,对外访问,怎么办呢?docker0 会提供一个 NAT 功能,通过 eth0 出去,访问网址。
内部访问外部:比如访问 baidu.com,容器先丢给 docker0,docker0 再丢给 eth0,eth0 去访问外部网址。
外部访问内部:其实是加了几条 iptables 规则,比如对宿主机上访问 8080,转到容器的 80,对宿主机上访问 33060,转到容器的 3306 端口。
bridge 只提供容器内部之间访问、以及容器与宿主机之间访问、以及容器内部上网的功能,但是没有提供外部访问内部端口的功能。只能通过映射访问内部的端口。
1.2.2 host
host 隔离性没有 bridge 强了,但是可以共用宿主机端口了。
其他依旧隔离,但是网络不隔离。
host 用的并不多,性能很好,但是隔离性不高。如果我们起了一个 80 端口的容器,就不能再启动一个 80 端口的容器了。
host 不存在跨主机的概念了,因为访问容器就相当于访问宿主机了。
1.2.3 container
多个容器公用一个 NameSpace。
不能同时使用,谁先占用算谁的。
适用场景:高可用。开了两个容器,一个正常服务,一个做备用。
1.3 实践演示
1.3.1 bridge 模式演示
- 启动一个
--network=bridge类型的 docker
docker container run -it --name="centos_bridge" --network=bridge centos:6.9 /bin/bash
- 查看
eth0网卡,可以看到网址是172.17.0.2
[root@dffe83cca591 /]# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:656 (656.0 b) TX bytes:656 (656.0 b)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
- 测试访问百度,发现可以 ping 成功
yum install -y iputils
ping baidu.com
- 另外启动一个容器
docker container run -it --name="centos_bridge2" --network=bridge centos:6.9 /bin/bash
- 测试容器内能否访问,在第一个容器 ping 第二个容器地址,发现可以正常 ping 通。
ping 172.17.0.3
- 本地宿主机测试访问容器
ping 172.17.0.2
- 跨主机无法互联
1.3.2 host 模式演示
- 启动容器
docker container run -it --name="centos_host1" --network=host centos:6.9 /bin/bash
- 查看地址、端口(和宿主机是一样的)
ifocnfig
- 如果确定在容器中还是 docker 中:输入一个 docker 命令,容器中没有 docker 命令,宿主机中有 docker 命令。