Docker 安装时会自动在host上创建三个网络
image.png

none网络

  • 挂在这个网络下的容器除了io, 没有任何网卡, 容器创建时, 可以通过—network=none指定使用none网络
  • 一些对安全性要求高且不需要联网的应用可以使用none网络, 如生成随机密码

host网络

  • 连接到host网络的容器共享Docker host的网络栈, 容器的网络配置与host完全一样
  • 优点一是性能, 但要考虑端口冲突问题, host已使用的端口就不能再用了
  • 优点二是让容器可以直接配置host网络, 比如某些跨host的网络解决方案, 其本身也是以容器方式运行, 需要对网络进行配置

bridge网络

docker安装时会创建一个命名为docker0的linux bridge. 如果不指定—network, 创建的容器默认都会挂到docker0上
image.png
image.png

user-defined网络

用户可以根据业务需要创建user-defined网络, docker提供3种user-defined网络驱动:
bridge, overlay, macvlan, overlay和macvlan用于创建跨主机的网络.

  1. # 通过bridge驱动创建bridge网络
  2. docker network create --driver bridge my_net
  3. # 展示
  4. brctl show
  5. # 容器可在启动时指定网络
  6. docker run -it --network=my_net <container>
  7. # 连接不同的network
  8. docker network connect my_net my_net2

容器间通信

IP通信

  • 两个容器要能通信, 必须要有属于容一个网络的网卡, 满足这个条件后, 就可以通过IP交互了, 具体做法是在容器创建时通过—network指定响应的网络, 或者通过docker network connect 将现有容器加入到指定网络中

Docker DNS Server

  • 从Docker1.10版本开始, docker daemon实现了一个内嵌的DNS server, 使容器可以直接通过容器名通信, 只需在启动时用—name为容器命名即可

image.png

  • 但docker DNS只能在user-defined网络中使用, 默认的bridge网络是无法使用DNS的

image.png

joined容器

joined容器可以使两个或多个容器共享一个网络栈, 共享网卡和配置信息, joined容器之间可以通过127.0.0.1直接通信
image.png

将容器与外部世界连接

容器访问外部世界

容器默认就能访问外网, 外网指容器网络以外的网络环境, 其中原理是网桥docker0做了一个网络地址转换(NAT), 将包的源地址替换成host地址发送出去
image.png

外部世界访问容器

docker可将容器对外提供服务的端口映射到host的某个端口, 外网通过该端口访问容器, 容器启动时通过 -p 参数映射端口
image.png