Docker 网络
- 当项目大规模使用 Docker 时
容器通信的问题也就产生了。
- Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理。
- 然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分。 因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求
Network 网络的常用命令
代码语言:javascript复制#查看 Network 帮助
[root@hadoop1 ~]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network #将容器连接到网络
create Create a network #创建一个网络
disconnect Disconnect a container from a network #断开容器与网络的连接
inspect Display detailed information on one or more networks #显示一个或多个网络上的详细信息
ls List networks #网络列表
prune Remove all unused networks #删除所有未使用的网络
rm Remove one or more networks #删除一个或多个网络
Run 'docker network COMMAND --help' for more information on a command.
#查看网络列表;
[root@hadoop1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
59d418f5257a bridge bridge local
8d30fcd98e3b host host local
8ee65d94d1c4 none null local
[root@hadoop1 ~]#
当你安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host
网络模式 | 简介 |
---|---|
Host | 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。 |
Bridge | 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。重点 |
None | 该模式关闭了容器的网络功能。 |
Container | 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。 |
自定义网络 | 略 |
我们在使用docker run创建Docker容器时 可以用 --net 选项指定容器的网络模式,Docker可以有以下4种网络模式:
- host模式:使用 --net=host 指定。
- none模式:使用 --net=none 指定。
- bridge模式:使用 --net=bridge 指定,默认设置。 直接run 创建容器就是bridhe模式,也可以 --net=bridege指定
- container模式:使用 --net=container:NAME_or_ID 指定。
Bridge 桥接模式(默认)
Bridge模式
- 相当于Vmware中的Nat模式
这里不详细介绍:
容器使用独立network Namespace
,并连接到docker0虚拟网卡(默认模式)- 此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
代码场景:网络配置
查看当前网络配置
创建容器 在次查看
多次创建进行比较!
#启动docker
[root@hadoop1 ~]# systemctl start docker
#为了方便操作,先删除之前的容器,不然会看到很多网卡信息
[root@hadoop1 ~]# docker rm -f $(docker ps -aq)
#查看docker 网络配置
[root@hadoop1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5af00ba46ade bridge bridge local
8d30fcd98e3b host host local
8ee65d94d1c4 none null local
#查看当前虚拟机 网关;
#Windows上查看IP地址是ipconfig, Linux上是ifconfig,但是Linux上还有一个命令叫ip addr可以查看IP地址。
#显示了机器上的所有网卡,大部分网卡都有一个IP地址,也存在特殊情况没有IP地址。
[root@hadoop1 ~]# ip addr
#环回地址,就是默认本机自己提供给自己一个 本地地址 1270.0.1
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
#虚拟机上系统 与 宿主机之间的 net模式网卡!
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:79:07:c6 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.110/24 brd 192.168.1.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::96ac:9f1:e210:7f96/64 scope link noprefixroute
valid_lft forever preferred_lft forever
#docke虚拟机 与 宿主机 的网卡
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:21:3e:aa:6b 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
4: br-ecd82fef5194: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:2f:79:87:9c brd ff:ff:ff:ff:ff:ff
inet 192.169.8.1/16 brd 192.169.255.255 scope global br-ecd82fef5194
valid_lft forever preferred_lft forever
5: br-f25721ed3cf8: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:be:72:9c:dd brd ff:ff:ff:ff:ff:ff
inet 192.168.0.1/16 brd 192.168.255.255 scope global br-f25721ed3cf8
valid_lft forever preferred_lft forever
#查看镜像文件
[root@hadoop1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test2_kafkademo latest ed4ebc0ed41c 5 months ago 672MB
app 1.0 02094c567c02 5 months ago 672MB
tomcat 8.5 d5ef56581444 7 months ago 530MB
wurstmeister/kafka latest 40094a582680 8 months ago 435MB
centos 7 7e6257c9f8d8 8 months ago 203MB
logstash 7.6.2 fa5b3b1e9757 12 months ago 813MB
kibana 7.6.2 f70986bc5191 12 months ago 1.01GB
elasticsearch 7.6.2 f29a1ee41030 12 months ago 791MB
wurstmeister/zookeeper latest 3f43f72cb283 2 years ago 510MB
java 8 d23bdf5b1b1b 4 years ago 643MB
#根据Tomcat 镜像生成一个,Tomcat容器
[root@hadoop1 ~]# docker run -d -P --name tomcat1 tomcat:8.5
23e303c70c1a128c5ca6f05f76fa7260445ee6a27e9fd7728e7b4871d37f0dc6
#再次查看所有的网关,发现系统中又多个一个网卡!
#每生成一个Docker 容器,就相当于一新的操作系统环境. 与主宿主机进行连接...网卡
5: veth085e9c6@if4,这是因为docker使用的是 veth-pair技术,容器的网卡和宿主机的网卡会成对出现
[root@hadoop1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:79:07:c6 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.110/24 brd 192.168.1.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::96ac:9f1:e210:7f96/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:21:3e:aa:6b 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:21ff:fe3e:aa6b/64 scope link
valid_lft forever preferred_lft forever
4: br-ecd82fef5194: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:2f:79:87:9c brd ff:ff:ff:ff:ff:ff
inet 192.169.8.1/16 brd 192.169.255.255 scope global br-ecd82fef5194
valid_lft forever preferred_lft forever
5: br-f25721ed3cf8: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:be:72:9c:dd brd ff:ff:ff:ff:ff:ff
inet 192.168.0.1/16 brd 192.168.255.255 scope global br-f25721ed3cf8
valid_lft forever preferred_lft forever
7: veth38cad7c@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 76:f8:99:43:af:96 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::74f8:99ff:fe43:af96/64 scope link
valid_lft forever preferred_lft forever
[root@hadoop1 ~]#
#查看所有的运行容器
[root@hadoop1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ee78a1d4dce4 tomcat:8.5 "catalina.sh run" 10 minutes ago Up 10 minutes 0.0.0.0:49153->8080/tcp, :::49153->8080/tcp tomcat1
#docker exec 进入正在运行的容器并以命令行交互
#ip addr 查看容器内的网卡
[root@hadoop1 ~]# docker exec -it ee78a1d4dce4 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
#宿主机尝试与 宿主机进行连接...连接成功!
[root@hadoop1 ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.219 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.108 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.046 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.099 ms
64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.124 ms
#在宿主机检查网卡信息
#发现 7: veth38cad7c@if6,这是因为docker使用的是 veth-pair技术,容器的网卡和宿主机的网卡会成对出现
#再次测试生成:
[root@hadoop1 ~]# docker run -d -P --name tomcat2 tomcat:8.5
21ebba1d58433d680a2fbb463ad6e595780c2402e4ef17074f7a62a04b3588c1
#又新增了一个 9: veth82e9efa@if8:
[root@hadoop1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:79:07:c6 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.110/24 brd 192.168.1.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::96ac:9f1:e210:7f96/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:87:eb:73:ec 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:87ff:feeb:73ec/64 scope link
valid_lft forever preferred_lft forever
4: br-ecd82fef5194: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:24:49:3a:8d brd ff:ff:ff:ff:ff:ff
inet 192.169.8.1/16 brd 192.169.255.255 scope global br-ecd82fef5194
valid_lft forever preferred_lft forever
5: br-f25721ed3cf8: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:6d:1c:4b:99 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.1/16 brd 192.168.255.255 scope global br-f25721ed3cf8
valid_lft forever preferred_lft forever
7: veth38cad7c@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 76:f8:99:43:af:96 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::74f8:99ff:fe43:af96/64 scope link
valid_lft forever preferred_lft forever
9: veth82e9efa@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 22:2d:c6:17:cf:bf brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::202d:c6ff:fe17:cfbf/64 scope link
valid_lft forever preferred_lft forever
#查看 tomcat2的 容器ip
[root@hadoop1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21ebba1d5843 tomcat:8.5 "catalina.sh run" 4 minutes ago Up 4 minutes 0.0.0.0:49154->8080/tcp, :::49154->8080/tcp tomcat2
ee78a1d4dce4 tomcat:8.5 "catalina.sh run" About an hour ago Up About an hour 0.0.0.0:49153->8080/tcp, :::49153->8080/tcp tomcat1
[root@hadoop1 ~]# docker exec -it 21ebba1d5843 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@hadoop1 ~]#
#Tomcat2 的容器暴漏的ip是172.17.0.3
- 我们发现,首先系统中默认存在几个网卡
lo回环默认本地127.0.0.1
ens33
阿里云内网地址...
docker0docke虚拟机 与 宿主机 的网卡
安装了docker,就会有一个网卡docker0桥接模式
… - 每启动一个docker容器,docker就会给docker容器分配一个ip 使用的技术是evth-pair技术
- 当Docker server服务启动时,会在主机上创建一个名为docker0的虚拟网桥
此主机上启动的Docker容器会连接到这个虚拟网桥上。
- 虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
- 接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,
选择一个和宿主机不同的IP地址和子网分配给docker0
表现: