docker 容器之间互联

本贴最后更新于 2025 天前,其中的信息可能已经时移世改

起源:国庆断电之后,公司的环境挂掉了一部分,基本是因为容器之间不能访问导致的,还有就是服务器性能一般,多个容器向一个容器请求配置文件,导致堵塞卡住。还有一小部分原因,在于刚开始起容器的时候没有加自起。

启动一个 doc 容器

docker run -ti -p 4000:4000 docs/docker.github.io:latest

关于 docker 容器的网络驱动,官网介绍有以下几个:

*   bridge:默认网络驱动程序。如果未指定驱动程序,则这是您要创建的网络类型。当您的应用程序在需要通信的独立容器中运行时,通常会使用桥接网络。见 [桥接网络](https://docs.docker.com/network/bridge/)。
    
*   host:对于独立容器,删除容器和Docker主机之间的网络隔离,并直接使用主机的网络。host 仅适用于Docker 17.06及更高版本上的群集服务。请参阅 [使用主机网络](https://docs.docker.com/network/host/)。
    
*   overlay:覆盖网络将多个Docker守护程序连接在一起,并使群集服务能够相互通信。您还可以使用覆盖网络来促进群集服务和独立容器之间的通信,或者在不同Docker守护程序上的两个独立容器之间进行通信。此策略无需在这些容器之间执行OS级别的路由。请参阅[覆盖网络](https://docs.docker.com/network/overlay/)。
    
*   macvlan:Macvlan网络允许您为容器分配MAC地址,使其显示为网络上的物理设备。Docker守护程序通过其MAC地址将流量路由到容器。macvlan 在处理期望直接连接到物理网络的传统应用程序时,使用驱动程序有时是最佳选择,而不是通过Docker主机的网络堆栈进行路由。见 [Macvlan网络](https://docs.docker.com/network/macvlan/)。
    
*   none:对于此容器,禁用所有网络。通常与自定义网络驱动程序一起使用。none不适用于群组服务。请参阅 [禁用容器网络](https://docs.docker.com/network/none/)。
    
*   [网络插件](https://docs.docker.com/engine/extend/plugins_services/):您可以使用Docker安装和使用第三方网络插件。这些插件可从 [Docker Hub](https://hub.docker.com/search?category=network&q=&type=plugin) 或第三方供应商处获得。有关安装和使用给定网络插件的信息,请参阅供应商的文档。
    

如何选择合适的驱动

*   当您需要多个容器在同一个Docker主机上进行通信时,用户定义的桥接网络是最佳选择。
    
*   当网络堆栈不应与Docker主机隔离时,主机网络最佳,但您希望隔离容器的其他方面。
    
*   当您需要在不同Docker主机上运行的容器进行通信时,或者当多个应用程序使用swarm服务协同工作时,覆盖网络是最佳选择。
    
*   当您从VM设置迁移或需要您的容器看起来像网络上的物理主机(每个都具有唯一的MAC地址)时,Macvlan网络是最佳的。
    
*   第三方网络插件允许您将Docker与专用网络堆栈集成。
    

环境需要 容器访问以主机 ip+port 访问其他的容器的服务,这边撇开合不合理说,因为一般都会用 link 链接容器等,这边有这个需求

一般来说我们使用桥接的方式,应该没有这些问题,可能是因为重启之后没有执行一下命令导致的 ,实在没想明白为啥,包转发打开的

1.  配置Linux内核以允许IP转发。
    
    $ sysctl net.ipv4.conf.all.forwarding\=1
    
2.  将策略的iptablesFORWARD策略更改DROP为 ACCEPT。
    
    $ sudo iptables \-P FORWARD ACCEPT
    

     这些设置在重新启动时不会持续存在,因此您可能需要将它们添加到启动脚本中。  

忽然想到一点,应该以下方式也可以

db

docker run  -d -p 3306:3306 —name=db mysql

Web

docker run -d -p 80:80 —link db:db web

总结下,关于网络这边还是需要好好研究下,不然每次遇到容器互联,要么关掉防火墙,要么重启 docker 的方式太原始以及 low,还是应该合理的去操作,既然有些知识没有掌握,还是应该看官方文档,别人写的博客都是别人理解的总结,不一定适用,就算适用了,下次也不一定记得住。

环境的问题应该是,iptables 的 FORWARD 策略没修改导致的

没文化多读书的这个道理,没有骗人啊 哈哈

参考文档:

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    483 引用 • 906 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • yuanhenglizhen

    这样的话,网络那一块就没有隔离了,就用了 网络中的其中一个 ip,是不是可以这么理解

  • 其他回帖
  • 其实 我以前使用的是 host 模式。。。

    docker 启动的时候,把 机器名或者 ip 以及 端口一起传到容器里面。

    应用启动后,会到注册中心把 机器名 + 端口注册 注册好。

    调用方式,都从注册中心拿。

    1 回复
  • 是的 没有隔离 共用宿主机的 ip

    比较简单高效

yuanhenglizhen
笔落兴亡定三端之妙,墨写清白尽六艺之奥

推荐标签 标签

  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    923 引用 • 936 回帖
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    51 引用 • 226 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 19 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖 • 2 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    285 引用 • 4482 回帖 • 658 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    207 引用 • 2031 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 566 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 129 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    402 引用 • 3522 回帖 • 1 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    14 引用 • 7 回帖 • 5 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖 • 1 关注
  • 博客

    记录并分享人生的经历。

    272 引用 • 2386 回帖
  • 安全

    安全永远都不是一个小问题。

    191 引用 • 813 回帖 • 2 关注
  • 反馈

    Communication channel for makers and users.

    124 引用 • 907 回帖 • 224 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 701 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    76 引用 • 429 回帖
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖 • 1 关注
  • 倾城之链
    23 引用 • 66 回帖 • 121 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 609 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    21 引用 • 140 回帖 • 12 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    262 引用 • 664 回帖
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 442 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    386 引用 • 1226 回帖 • 593 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    713 引用 • 1174 回帖 • 105 关注