docker虚拟网络
封闭式网络
桥接式网络
联盟式网络
开放式网络
叠加网络
如何叠加?
物理机的物理网卡做一个虚拟的桥,让各个虚拟机连到这个桥上,来实现报文的隧道转发。
docker的网络
安装完后提供了三种网络
[root@localhost vagrant]# docker network ls
NETWORK ID NAME DRIVER SCOPE 244a0bdfb5a6 bridge bridge local # net桥,自动创建软交换机docker0,可以当做网卡使用 98103accc8c5 host host local # 让容器直接使用主机的网络名称空间(开放式网络) bb173b2423b5 none null local # 只有lo接口:没有网卡 (封闭式网络)
1、什么是LO接口? 在LINUX系统中,除了网络接口eth0,还可以有别的接口,比如lo(本地环路接口)。 2、LO接口的作用是什么? 假如包是由一个本地进程为另一个本地进程产生的, 它们将通过外出链的'lo'接口,然后返回进入链的'lo'接口.具体参考包过滤器的相关内容。 第三种网络存在的意义: 运行一些不需要网络通信的复杂程序,
启动每一个容器,都会给其自动分配一对网卡设备,一半在容器,一半在docker0桥上(桥接式网络)
[root@localhost ~]# docker run -d redis:latest 0e5a52bb5efd9acbd5c1c132de64a5a591a641723b3226dc27f2fe32f03775f5 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0e5a52bb5efd redis:latest "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 6379/tcp agitated_dijkstra [root@localhost ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:6c:3e:95 brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3 valid_lft 77184sec preferred_lft 77184sec inet6 fe80::a00:27ff:fe6c:3e95/64 scope link valid_lft forever preferred_lft forever 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP link/ether 02:42:8b:6e:8c:f7 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:8bff:fe6e:8cf7/64 scope link valid_lft forever preferred_lft forever 7: veth8bf9a87@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP link/ether 4a:ef:9c:53:42:79 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::48ef:9cff:fe53:4279/64 scope link valid_lft forever preferred_lft forever
veth8bf9a87@if6 被关联到了docker0上
如何查看?
yum -y install bridge-utils
[root@localhost ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.02428b6e8cf7 no veth8bf9a87 # 并没有if6 ***********
# 另一半在容器内部;执行ifconfig会看到eth0 ping 172.17.0.1 可以ping通 每创建一个容器,启动后,会自动生成iptables规则
[root@localhost ~]# iptables -t nat -vnL Chain PREROUTING (policy ACCEPT 9 packets, 368 bytes) pkts bytes target prot opt in out source destination 9 368 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT 9 packets, 368 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 109 packets, 6895 bytes) pkts bytes target prot opt in out source destination 0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT 109 packets, 6895 bytes) pkts bytes target prot opt in out source destination 0 0 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0 Chain DOCKER (2 references) pkts bytes target prot opt in out source destination 0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
# POSTROUTING可以看到从任何接口进来,只要不从docker0出去,原地址来自172.17.0.0/16的任何一台主机,都要MASQUERADE(地址伪装) ---->net桥的原因 这样就可以实现 1、容器之间的访问 2、主机和容器之间的通信 3?外部host想访问其中一个容器 映射的方式? 物理机的一个端口使用dnet的方式,使其转发到其间的一个容器,让其再访问这个端口 必然的面临的问题 多web.png 如何用众所周知的端口映射到不同的web 而叠加网络可以解决这个问题
(联盟式网络)
创建容器时默认使用桥接式网络(net桥) # docker network inspect bridge [root@localhost ~]# docker run --help Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container Options: ... -m, --network string Connect a container to a network (default "default"指的是bridge) ...