前戏

Docker安装时会自动在host上创建三个网络,我们可用docker network ls命令查看

Docker网络_linux

none网络

顾名思义,none网络就是什么都没有的网络。挂在这个网络下的容器除了lo,没有其他任何网卡。容器创建时,可以通过 –network=none指定使用none网络

Docker网络_docker_02

这玩意儿有啥用?

其实还真有应用场景。封闭意味着隔离,一些对安全性要求高并且不需要联网的应用可以使用none网络。比如某个容器的唯一用途是生成随机密码,就可以放到none网络中避免密码被窃取。当然大部分容器是需要网络的

host网络

连接到host网络的容器共享Docker host的网络栈,容器的网络配置与host完全一样。可以通过 –network=host指定使用host网络

Docker网络_静态ip_03

在容器中可以看到所有的网卡,并且连hostname也是一样的,这样有什么好处?

直接使用Docker host的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择host网络。当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host上已经使用的端口就不能再用了。

docker host的另一个用途是让容器可以直接配置host网路,比如某些跨host的网络解决方案,其本身也是以容器方式运行的

 bridge网络

Docker安装时会创建一个命名为docker0的Linux bridge。如果不指定–network,创建的容器默认都会挂到docker0上

没有启动docker服务是不会有的docker0的

Docker网络_linux_04

上图没有任何网络设备,创建一个容器之后

Docker网络_静态ip_05

一个新的网络接口veth28c57df被挂到了docker0上,vethfab030c就是新创建容器的虚拟网卡

user-defined网络

除了none、host、bridge这三个自动创建的网络,用户也可以根据业务需要创建user-defined网络

通过bridge驱动创建类似前面默认的bridge网络

Docker网络_docker_06

新增了一个网桥br-f43ef678aacb ,这里f43ef678aacb 正好是新建bridge网络my_net的短id。执行docker network inspect查看一下my_net的配置信息

Docker网络_docker_07

注:这里172.18.0.0/16是Docker自动分配的IP网段

我们可以自己指定ip网段

​–subnet和 –gateway参数

Docker网络_静态ip_08

启动一个my_net2网段的容器

Docker网络_linux_09

注:默认的ip是随机按顺序分配的,如有需求可以用 –ip指定只有使用 –subnet创建的网络才能指定静态IP。my_net创建时没有指定 –subnet,如果指定静态IP报错如下

Docker网络_linux_10