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 模式会减少网络上的时间消耗