docker的网络分为:单主机、跨主机
这篇先说:单主机
我们先说一下docker的原生网络模式
网络模式 | 简介 | 优点 | 使用场景 |
none | 空网络,没有网络 | 此网络与外界隔离,安全度非常高 | 适合公司内部生产密钥 |
host | 容器与宿主机共享namespace | 直接使用宿主机的网络,网络性能方面最好。 | |
bridge | 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。 |
1、none
none翻译过来就是没有的意思,就是没有网络,对于安全性完全与外界完全隔离。
创建none容器,只有一张lo网卡!
创建参数 --network none
1 [root@node1 harbor]# docker run -it --name none --network none busyBox:latest 2 / # ip a 3 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 4 link/loopback 00:00 brd 00 5 inet 127.0.0.1/8 scope host lo 6 valid_lft forever preferred_lft forever
2、host
host翻译为主机,就是主机网络,大致意思就是和宿主机共用的网络;
容器使用host网络,不会去获取新的network namespace,而是和主机共用一个network namespace。
直接使用宿主机的IP、端口号。所以我们在使用host网络发布服务的时候,一定要注意端口冲突这个问题。
创建参数 --network host
[root@node1 harbor]# docker run -it --name host --network host busyBox:latest
/ # ip a
1: lo: <LOOPBACK,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:50:56:22:6c:1c brd ff:ff:ff:ff:ff:ff
inet 192.168.1.1/24 brd 192.168.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::5658:12c2:bb4f:b14e/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,UP> mtu 1500 qdisc noqueue qlen 1000
link/ether 52:54:00:d7:f2:59 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 qlen 1000
link/ether 52:54:00:d7:f2:59 brd ff:ff:ff:ff:ff:ff
5: docker0: <NO-CARRIER,UP> mtu 1500 qdisc noqueue
link/ether 02:42:34:a2:7d:a6 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:34ff:fea2:7da6/64 scope link
valid_lft forever preferred_lft forever
8: br-ffb3d00df08f: <NO-CARRIER,UP> mtu 1500 qdisc noqueue
link/ether 02:42:93:76:c6:32 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-ffb3d00df08f
valid_lft forever preferred_lft forever
inet6 fe80::42:93ff:fe76:c632/64 scope link
valid_lft forever preferred_lft forever
我的宿主机IP为192.168.1.1,上述的网络配置和主机一模一样
使用场景:对网络传输有较高要求,不二选择!
3、bridge
在说这个桥接模式之前,了解一个词“网桥”
网桥:网桥又叫做桥接器,是连接两个局域网的一种存储/转发设备,它能将一个大的LAN分割为多个网段,或将两个以上的LAN互联为一个逻辑LAN,使LAN上的所有用户都可以访问服务器。
简单说一下:有点想交换机,但是有区别,具体了解自行查询资料。
正式了解桥接:
创建参数:--network bridge
1 [root@node1 /]# docker run -it --name bridge --network bridge busyBox:latest 2 / 3 4 link/loopback 5 inet 6 valid_lft forever preferred_lft forever 7 27: eth0@if28: <BROADCAST,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 8 link/ether 02:42:ac:11:02 brd ff:ff:ff:ff:ff:ff 9 inet 172.17.0.2/16 brd 255.255 scope global eth0 10 valid_lft forever preferred_lft forever
了解:docker0默认的IP172.17.0.1,分配容器IP都是依此类推。
实操环节:
1、我们来自定义bridge网络
[root@node1 /]# docker network create -d bridge net1 创建一个名为net1的bridge网络 44686c0ae4194a156c309a18d320d3497551900600b0ef28729152004d6cdf05 [root@node1 /]# docker network ls #查看当前网卡 NETWORK ID NAME DRIVER SCOPE 74f8ff66202b bridge bridge local
创建基于net1的容器
[root@node1 /]# docker run -itd --name a1 --network net1 busyBox:latest 026ff92c05a54803333313fe9da077bb47adb5e3cdb0183e86b5a93e4e350da6 [root@node1 /]# docker run -itd --name a2 --network net1 busyBox:latest cb77b215baff887714cd8a587b981d7e391c4237d95d45e97663d69bf958c2ce [root@node1 /]# docker run -itd --name a3 --network net1 busyBox:latest 125f031364a66c1568297fb8bbac890abcb8826de15cbf053471974603c965d6
#对于自定义网络的优点可以通过主机名进行ping
测试访问
[root@node1 /]# docker exec -it a1 sh / # ping a2 PING a2 (172.19.0.3): 56 data bytes 64 bytes from 0.3: seq=0 ttl=64 time=0.065 ms 1 ttl=0.170 ms ^C --- a2 ping statistics --- 2 packets transmitted,2 packets received,1)">0% packet loss round-trip min/avg/max = 0.065/0.117/ ms / # a3 PING a3 (0.4): 0.4: 0.0630.058C --- a3 0.058/0.060/0.063 ms
自定义bridge网络
[root@node1 /]# docker network create -d bridge --subnet 172.20.16.0/24 --gateway 172.20.16.254 net2
c517433db7e3230c7faea88cf485e320a10d1a66b8f31e3cd9f2c3e84d4208a4
创建基于bridge网络的容器,指定IP为172.20.16.10、172.20.16.20
[root@node1 /]# docker run -itd --name a4 --network net2 --ip 172.20.16.10 busyBox:latest
415193c1a428782b6689881b58e66565e38ec3e699484032ef754c92efd00609
[root@node1 /]# docker run -itd --name a5 --network net2 --ip 172.20.16.20 busyBox:latest
6b304a044d60de792188e6bbc2fd414b8c98919413a7bc19a6b58ee7a4b89a9a
测试访问
[root@node1 /]# docker exec -it a4 a5 PING a5 (172.20.16.20): 16.20: 0.079C --- a5 1 packets transmitted,1)">1 packets received,1)">0.079/0.079 ms