一、docker原生网络
docker安装后会自动创建3种网络:bridge,host,none
可以使用以下命令查看:
docker安裝时会自动创建一个名为docker0的Linux bridge,新建的容器会自动桥接到这个接口。
例如,现在运行一个容器,查看它的ip:
由于已有一个容器,所以这个新建的容器ip不是2,而是3.
bridge 模式下容器没有一个公有ip,只有宿主机才可以直接访问,外部主机是不可见的。
容器通过宿主机的NAT规则后则可以访问外网。
host网络
需要运行容器的时候指定
容器内外看到的一样。
host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。比如宿主机用了80端口,容器就不能使用。
none模式
none模式是指禁用网络功能,只有lo接口,在容器创建时使用–network=none指定。比如有些数据比较敏感,不适合网络连接就适合用此模式。
二、docker自定义网络
自定义网络模式,docker提供了三种自定义网络驱动:
- bridge
- overiay
- macvian
bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,overiay和macvian是用于创建跨主机网络。
建议使用自定义的网络来控制哪些容器可以相互通信,bridge还可以自动DNS解析容器名称到iP地址。
1.使用自定义的网络驱动
2.自己指定网段
在创建的时候指定参数:–subnet、–gateway
inspect查看:
自己创建容器查看:
3.自己指定容器ip地址,但必须是在自定义网桥上(通过–gateway和–subnet创建的才可以使用–ip),同一网桥上的容器是可以互通的。
桥接到不同网桥上的容器,彼此是不通信的。docker在设计上就是要隔离不同network的。
现在的ip状况:
vm1 | 172.18.0.2 |
vm2 | 172.22.0.2 |
vm3 | 172.22.0.10 |
在vm2里只能和vm3通信(一块网桥),如何能与my
通信呢?
答:将vm2连接到my_net1上。
[root@node2 ~]# docker network connect my_net1 vm2
[root@node2 ~]# docker attach vm2
root@f0744f90a37d:/#
root@f0744f90a37d:/# ip addr #两个ip
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
24: eth0@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:16:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.22.0.2/24 brd 172.22.0.255 scope global eth0 #本来的ip
valid_lft forever preferred_lft forever
26: eth1@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1 #连接到my_net1网桥后分配的ip
valid_lft forever preferred_lft forever