替代Docker Compose实现容器双向联通的三种方法

Docker 是目前最热门的技术平台之一,他在产生后很短的时间内就获得了社会的广泛关注。简单的说,他使得开发者和系统管理员能够用一种简易的方法去部署分布式应用。Docker 的生态系统非常庞大,有很多的工具协同工作,比如最常用的工具之一:Docker Compose。他使你可以在单个文件中定义并运行多容器应用,然后通过一个命令执行。

一个 docker-compose.yml 文件看起来是这样的:

links 选项使容器能够在一个运行中创建的内部网络中通讯,并且在运行终止后销毁。在上面的例子中,当这个应用启动时,将在 web 容器中的 /etc/hosts 文件中建立一个别名为“redis”的入口,这使web容器能接通 redis 容器的服务。

问题

到目前为止,这个工具使你能够通过一个命令运行多容器服务应用。但是,如果你的容器间有复杂的连通,这就有可能会导致问题甚至应用无法运行。这里复杂的意思是多于一个的容器通过 links 选项共用另一个容器的服务。举例来说,在上面的应用中,web 容器想使用 redis 容器中的服务,如果在 redis 容器中添加“links:-web”并且通过 docker-compose 来运行他,你会看到如下信息:

事实上,这是 Docker 的一个历史问题,Docker 的网络系统曾有一些问题,而这正是一个典型体现。社区建议使用 ambassador pattern 作为解决这个问题的方法,但是这个解决方法增加了你应用的开销,毕竟这只是一个变通方法,不是一个 docker 化的解决方式。

因为我在自己的应用开发中面临这个问题,所以我寻找了一些基于 Docker 平台和 Docker 工具的方法,下面是我尝试成功的三种解决方法。

解决方案1:使用新的 Docker 网络接口

Docker 在DockerCon 2015上宣布了很多新的特性和工具,其中一个进步就是新的网络系统。新的网络类型使我能够采用一个简单的方法来实现一个有复杂通讯的多容器应用。

使用下面的方法使在同一个私有网络中的两个容器相互可见。

创建一个网络


  1. docker network create mynetwork 

通过列举所有的网络,确保这个网络成功创建。


  1. docker network ls 

把容器连接到你的网络上

打开一个终端,执行以下命令来运行一个容器:


  1. docker run -it --publish-service web.mynetwork web 

打开另一个终端并且运行另一个容器:


  1. docker run -it --publish-service redis.mynetwork redis 

容器相互可见

现在,你可以从第一个终端 ping redis.mynetwork 并且收到回复。同样,从第二个终端,你可以 ping web.mynetwork 并收到回复。这是发布在.下的服务。

通过这种方法,你无需将自己的应用与 Docker Compose 链接,你只需创建一个网络并且在这个网络上发布服务。换句话说,我们将 docker-compose.yml 的连接替换为一个网络。

虽然这个功能还在试验中(在本文写作时),但我认为这种灵活的方式就是运行多容器应用的未来,所以,建议你遵循 Docker 发展的方向。

解决方案2:在多主机网络中使用 Docker Swarm 和 Compose

在多主机网络中使用 Swarm 和 Compose 也是一个实验性的功能。这个解决方案比前一个需要做更多的工作,但是,如果你有很多容器需要连接并且你打算让他们运行在集群中,这是最好的解决方法。

关于解决的详细流程,请参照 GitHub 里的原始功能介绍。首先,在多主机网络中安装 Swarm,然后你可以在去掉 links 选项后立即运行一个组合应用。为什么?因为从这个使用 Swarm 集群的多主机网络上启动的每一个容器都默认使用“overlay:multihost”网络,这意味着他们可以通过容器名相互访问。

因为这是实验性功能,所以请在 GitHub 给作者反馈。

解决方案3:使用外部 DNS 容器

一个经典的解决方法(我觉得是临时方法)是在你的 docker-compose.yml 文件中添加一个额外的容器。添加如下的容器到你的文件中。


  1. dnsdock: 
  2.  
  3. image: tonistiigi/dnsdock 
  4.  
  5. volumes: 
  6.  
  7. - /var/run/docker.sock:/run/docker.sock 
  8.  
  9. ports: 
  10.  
  11. - 172.17.42.1:53:53/udp 

并且,在每个容器中你需要做如下的操作:

告诉容器 DNS 服务在什么位置:


  1. dns: 172.17.42.1 

命名每个容器使其对于服务发现可见


  1. environment: 
  2.  
  3. - DNSDOCK_NAME=web 
  4.  
  5. - DNSDOCK_IMAGE=web 

使用环境变量来完成这个命名。对 redis 容器做同样的操作(不管你的其他容器是什么)。

现在容器在..docker下相互可见。这就是 redis 容器和 web 容器中的服务在 web.docker 下通信的方法。

本文作者:邵长钰

来源:51CTO

时间: 2025-01-30 06:21:58

替代Docker Compose实现容器双向联通的三种方法的相关文章

容器间通信的三种方式 - 每天5分钟玩转 Docker 容器技术(35)

容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信. IP 通信 从上一节的例子可以得出这样一个结论:两个容器要能通信,必须要有属于同一个网络的网卡. 满足这个条件后,容器就可以通过 IP 交互了.具体做法是在容器创建时通过 --network 指定相应的网络,或者通过 docker network connect 将现有容器加入到指定网络.可参考上一节 httpd 和 busybox 的例子,这里不再赘述. Docker DNS Server 通过 I

用Git子模块和Docker Compose实现高效开发工作流

本文讲的是用Git子模块和Docker Compose实现高效开发工作流,[编者的话]搭建开发环境一直让程序员们头疼,本文使用Git子模块和Docker Compose实现高效率的开发工作流,让程序员能够轻松搭建出开发环境,把精力投入到需要开发的应用本身. 问题 自我们从Continuous Software雇佣了第一位远程开发的程序员以来,我们就意识到精简开发工作流的重要性.当新入职的程序员接手由很多应用组成的复杂项目时,我们想尽量避免以下这几个问题: 缺少stack模块:Node.js.PH

Docker Compose:链接外部容器的几种方式

在Docker中,容器之间的链接是一种很常见的操作:它提供了访问其中的某个容器的网络服务而不需要将所需的端口暴露给Docker Host主机的功能.Docker Compose中对该特性的支持同样是很方便的.然而,如果需要链接的容器没有定义在同一个 docker-compose.yml 中的时候,这个时候就稍微麻烦复杂了点. 在不使用Docker Compose的时候,将两个容器链接起来使用 -link 参数,相对来说比较简单,以 nginx 镜像为例子: docker run --rm --n

Spring Boot与Docker(四):额外的微服务、更新容器、Docker Compose和负载均衡

本文讲的是Spring Boot与Docker(四):额外的微服务.更新容器.Docker Compose和负载均衡,[编者的话]本篇是<使用Spring Boot和Docker构建微服务架构>系列的第四篇,本篇我们我们将添加一些额外的服务/容器,并且更新容器,采用Docker Compose以及使用HAProxy容器进行负载均衡.原文作者为3Pillar环球旗下美国Adbanced技术集团的总监Dan Greene,Dan有十八年的软件设计和开发经验,包括在电子商务.B2B集成.空间分析.S

通过Docker Compose及NGINX反向代理实现ASP.NET5应用的负载均衡

本文以ASP.NET应用为例,讲述了如何通过NGINX访问运行在本机上的ASP.NET 5服务,并采用Docker Compose对ASP服务进行编排,同时提供简单的负载均衡机制. ASP.NET 5可以在很多操作系统下运行,也支持IIS等多种不同的web服务器.网上关于ASP.NET 5的教程有很多,这里我就不多说了,大家可以自己去搜索.今天我们要讲的是如何通过NGINX访问运行在本机上的ASP.NET 5服务,并采用Docker Compose对ASP服务进行编排,同时提供简单的负载均衡机制

Docker的Windows容器初体验

系列文章 第一篇 Docker的Windows容器初体验 - 本文 第二篇 阿里云Windows Server 2016环境Docker试用 最近微软发布了Windows Server 2016,其中最让广大开发者和运维同学期待的就是Docker对Windows容器的支持. Windows支持两种不同类型的容器,即 Windows Server 容器和 Hyper V 容器. 这两种类型的容器的使用方式相同,也支持相同的容器映像. 但是它们的实现机制不同,提供了不同的安全隔离级别 Windows

Eclipse Che 5.0会带来对Docker Compose的支持、Workspace Agents等特性

在第一届CheConf16上,有一个专门针对Eclipse Che的用户会议,这是一个容器化的便携开发工作空间,Codenvy CEO兼Che项目的领导者Tyler Jewell宣布了Eclipse Che 5.0.它预期会在年底之前发布,将会引入对Docker Compose的支持,以及Workspace Agents等特性. 根据今年早些时候的介绍,Eclipse Che的特性在于它是一个云端的IDE.工作空间服务器,另外还有借助容器实现的运行时便携性.Jewell认为Eclipse Che

使用Docker Compose部署基于Sentinel的高可用Redis集群

大家一定非常熟悉如何利用Docker启动单个Redis容器用于开发环境,本文将介绍如何利用Docker Compose模板在本机和云端部署基于Sentinel的高可用Redis 3集群. Redis集群可以在一组redis节点之间实现高可用性和sharding.今天我们重点围绕master-slave的高可用模式来进行讨论,在集群中会有1个master和多个slave节点.当master节点失效时,应选举出一个slave节点作为新的master.然而Redis本身(包括它的很多客户端)没有实现自

阿里云部署Docker(7)----将容器连接起来

路遥知马力,日久见人心.恩.该坚持的还是要坚持. 今天看到一个迅雷的师弟去了阿里,祝福他,哎,虽然老是被人家捧着叫大牛,我说不定通过不了人家的面试呢,哎,心有羞愧.  本文为本人原创,转载请表明来源:http://blog.csdn.net/minimicall 我们在阿里云上部署Docker服务系列教程已经到了第7节, 需要回顾的同学可以翻看我的博客. 今天,我们学习一下怎么将docker里面的容器连接起来.例如我是一个web服务,我需要用到mysql服务,如果它们属于不同的容器内,如果连接.