网络类型
None网络
-
none网络就是什么都没有的网络。挂在这个网络下的容器出了lo,没有其他任何网卡。容器创建时,可以通过–network=none指定使用none网络。
-
应用场景:
封闭隔离,对安全性要求高且不需要联网的应用可以使用none网络,比如某个容器的唯一作用是生成随机密码,我们就可以放到none网络中,避免密码被窃取。
Host网络
-
容器自己不会创建网卡和IP等,使用的宿主机上面IP和端口。可以通过–network=host指定使用host网络。
-
应用场景:
高性能,对网络传输效率要求较高,可以选择host。让容器可以直接配置host网络,跨网络解决方案。 -
缺点:
灵活性差,端口冲突
Bridge网络
-
Docker安装时会创建一个命名为docker0的Linux bridge,如果不指定–network,创建的容器默认都会挂到docker0上。
-
创建一个容器看看docker0有没有变化
-
此模式会为每个容器配置ip以及并将容器连接到虚拟网桥docker0上面,并通过docker0网桥以及nat转换与宿主机之间进行通信。
subnet:172.17.0.0/16
gateway:172.17.0.1
-
User-defined 网络
-
用户可以根据业务需要创建user-defined网络。Docker提供三种user-defined网络驱动:bridge、overlay、macvlan。overlay与macvlan用于创建跨主机网络。
-
新增网桥:br-acae5dcb5029。正好是新建网络my_net的短id。
docker network inspect my_net
- 我们以自行指定IP网段。
例如:
docker network create --driver bridge --subnet 172.23.24.0/24 --gateway 172.23.24.1 my_net2
docker network inspect my_net2
-
容器需要使用新的网络,需要在启动时通过–network指定,可以通过–ip来指定静态IP。
-
只有使用–subnet创建的网络才能指定静态IP。
-
如何实现docker中两个不同网桥之间的跨网络通信?
- 我们先创建一个busybox test1使用my_net2网卡。
docker run -it --name test1 --network=my_net2 busybox
- 再创建一个busybox test2 使用默认网卡
docker run -it --name test2 busybox
- 两者相ping,发现ping不通
- 查看host上的路由表
- 查看路由转发功能
- 查看iptables:iptables-save
- 从规则命名DOCKER-ISOLATION可知docker在设计上就是要隔离不同的network。
如何让test1与test2通信?
- 我们可以用docker network connect 命令实现,在test2容器中添加一块my_net2的网卡。
- 查看test2里的网卡
- 然后再ping一次,可以ping通
容器间通信
- IP通信:
两个容器要能通信,必须要有属于同一个网络的网卡,满足这个条件之后,容器可以通过IP交互了,可以通过docker network connect实现,上述实验已介绍。 - Docker DNS Server:
Docker从1.10版本以后,docker daemon实现了一个内衬的DNS Server,使容器直接通过容器名通信,我们可以通过–name来指定容器名。 - joined容器:
joined容器可以使两个或多个容器共享一个网络栈,网卡和配置信息,joined容器之间可以通过127.0.0.1直接通信。
举例
先创建个httpd容器,名为web1
再创建busybox容器并通过–network=container:web1指定joined容器为web1
docker run -d -it --name=web1 httpd
docker run -it --network=container:web1 busybox
- 可用通过127.0.0.1访问web1的http服务。
joined容器适合以下场景:- 不同容器中的程序希望通过loopback高效地通信,比如web server与app server
- 希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序。
容器与外部世界连接
容器访问外部世界
-进入容器,ping www.baidu.com
- 容器默认能访问外网,主要是NAT技术。
- 通过tcpdump查看地址如何转换:
- 访问过程
外部世界访问容器
- 端口映射
docker可将容器对外提供服务的端口映射到host的某个端口,外网通过该端口访问容器,容器启动通过-p映射端口。 - 默认映射
- 指定端口映射
- 每映射一个端口,host就会启动一个docker-proxy进程来处理访问容器的流量。
- 端口映射分析流程图