前言
当使用 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 项目中基本都包含内个部分
- 数据库 (mysql)
- 缓存工具 (redis)
- web 程序
- 代理工具 (nginx)
在 docker
中配置网络模式时
mysql
redis
web程序
以网桥连接,一般情况下 web程序
中是需要连接数据库
与缓存中间件
做操作的,同一局域网情况下,效率较高,又不会丧失在 docker 中的管理
nginx
一般会对外暴漏,也是网络的直接出口,使用 host
模式会减少网络上的时间消耗