# ip addr show docker0
bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。容器通过宿主机的NAT规则后可以访问外网。
host网络模式需要在容器创建时指定 --network=host
# docker run -it --name vm1 --network host ubuntu
4. host模式可以让容器共享宿主机网络线,这样的好处是外部主机与容器的直接通信,但容器的网络缺少隔离性
none模式是指禁用网络功能,只有lo接口,在容器创建时使用
–network=none指定。
# docker run -it --name vm3 --network none ubuntu
bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,
overlay和macvlan是用于创建跨主机网络。
建议使用自定义的网络来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。
# docker run -it --name vm4 --network my_net1
# docker run -it --name vm4 --network my_net1 ubuntu
root@354e0a0c4a9d:/# ping vm4
# docker network create --subnet 172.24.0.0/24 --gateway 172.24.0.1 my_net2
# docker network inspect my_net2
4. 使用–ip参数可以指定容器ip地址,但必须是在自定义网桥上,默认的bridge模式不支持,同一网桥上的容器是可以互通的
# docker run -it --name vm5 --network my_net2 --ip 172.24.0.11 ubuntu
# docker run -it --name vm6 --network my_net2 --ip 172.24.0.12 ubuntu
桥接到不同网桥上的容器,彼此是不通信的
那么如何使两个不同网桥的容器通信呢:
使用 docker network connect命令为vm1添加一块my_net2 的网卡。
# docker network connect my_net2 vm2
容器之间除了使用ip通信外,还可以使用容器名称通信。
# docker run -d --name vm1 --network my_net1 nginx:1.16
# docker run -it --name vm2 --network my_net1 ubuntu
root@2904c1357156:/# ping vm1
# docker run -it --name vm3 --network container:vm2 ubuntu
2. --link 可以用来链接2个容器
–link的格式:
# docker run -d --name web nginx:1.16
# docker run -it --name vm1 --link web:nginx ubuntu
root@7633180228dc:/# ping nginx
CNM分三类组件
在不同docker主机上添加双网卡,打开网卡的混杂模式
# ip link set eth1 promisc on
# ip link set eth1 up
# docker network create -d macvlan --subnet 172.26.0.0/24 --gateway 172.26.0.1 -o parent=eth1 macvlan1
# docker run -it --name vm1 --network macvlan1 --ip 172.26.0.2 ubuntu
# docker network create -d macvlan --subnet 172.26.0.0/24 --gateway 172.26.0.1 -o parent=eth1 macvlan1
# docker run -it --name vm2 --network macvlan1 --ip 172.26.0.4 ubuntu