docker 网络模式怎么用

前言

当使用 docker 配置的项目多起来的时候,多个项目之间的通信问题就慢慢暴漏出来了。秉着知其然也要知其所以然的原则,这个需要从 docker 的网络模式开始了解。

怀揣问题

docker 多个容器之前的连接怎么实现?
docker 的网络模式是什么?
一个网络项目 docker 应该怎么配置?

什么是 docker 网络模式

站在巨人肩膀学习

https://www.cnblogs.com/mrhelloworld/p/docker11.html – 哈喽沃德先生

这篇文章详细的介绍了 docker 的网络模式,以及不同网络模式下的详细实现步骤等,强烈推荐大家看看。

再下大概总结一下如下:

none 模式

简介

  • 容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,IP 等。

使用方式

  • none 网络模式是指禁用网络功能,只有 lo 接口 local 的简写,代表 127.0.0.1,即 localhost 本地环回接口。在创建容器时通过参数 --net none 或者 --network none 指定;

网络性能

  • none 网络模式即不为 Docker Container 创建任何的网络环境,容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。可以说 none 模式为 Docke Container 做了极少的网络设定,但是俗话说得好“少即是多”,在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制开发。这也恰巧体现了 Docker 设计理念的开放。

bridge 模式

简介

  • 为每一个容器分配、设置 IP 等,并将容器连接到一个 docker0 虚拟网桥,dokcer 运行容器时默认为该模式。

网络性能

  • 会通过 docker 的虚拟网卡来访问,所以相对性能较低

与其它容器的交互

  • 同一下虚拟网桥下,可以通知 dns 来访问,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通知容器名称通信。

需要注意的时候,虚拟网桥 需要使用 用户自定义的网络。

host 模式

简介

  • 容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。

使用方式

  • host 网络模式需要在创建容器时通过参数 --net host 或者 --network host 指定

网络性能

  • host 网络模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。

container 模式

简介

  • 新创建的容器不会创建自己的网卡和配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。

使用方式

  • Container 网络模式是 Docker 中一种较为特别的网络的模式。在创建容器时通过参数 --net container:已运行的容器名称|ID 或者 --network container:已运行的容器名称|ID 指定;

网络性能

  • 处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快速通信。

web 项目中如何配置 docker 网络

一个 web 项目中基本都包含内个部分

  1. 数据库 (mysql)
  2. 缓存工具 (redis)
  3. web 程序
  4. 代理工具 (nginx)

docker 中配置网络模式时

mysql redis web程序 以网桥连接,一般情况下 web程序 中是需要连接数据库缓存中间件做操作的,同一局域网情况下,效率较高,又不会丧失在 docker 中的管理

nginx 一般会对外暴漏,也是网络的直接出口,使用 host 模式会减少网络上的时间消耗