如何使用docker-compose在同一主机上连接处于不同部署的Docker容器?

5

我很难理解如何将属于同一主机上不同docker-compose项目的容器进行互联。

假设我有一组容器在 部署A 中:

root@debussy:~# docker ps | awk '{print $2}' | grep "cl"
cl-worker:latest
cl-nginx:latest
cl-app:latest
cl-rabbitmq:latest
cl-memcached:latest
cl-db:latest

所有这些容器都是从一个单独的配置文件 deployment-a.yml 中启动的。现在,我们还有另一个不同的部署B,它有自己的 `deployment-b.yml`:

root@debussy:~# docker ps | awk '{print $2}' | grep "stockagents"
stockagents-app:latest

是否可以通过在deployment-b.yml和/或deployment-a.yml中进行特定配置,从stockagents-app访问数据库(cl-db容器)?

注意:我知道如何使用纯docker命令和通过--link链接容器来实现,但是否有一种方法可以仅使用docker-compose及其配置文件来实现相同的行为?


你可以使用SkyDNS和Regulator在创建Docker容器时进行自动DNS注册,这非常酷。然后你的容器可以通过名称相互引用。 - Greg
@Greg 快速搜索显示,Skydns需要运行etcd,而etcd又需要自己的配置。此外,我正在运行Ubuntu,它默认情况下没有启用etcd :( 这似乎是一种针对容器之间通信的普遍情况的复杂解决方案。 - Andrew Druchenko
这是一个复杂的问题,对吧?你有想要“发现”彼此的独立组件。有只有一个 Docker 实例,还是可能有多个(Swarm、Fleet、K8s 等)?听起来你想要一些轻量级的东西。如果这是一个单独的 Docker,也许你需要一个卷,每个组件都可以挂载到其中以进行通信?你知道,也许是一个目录,其中一个写入“我在 X 地址”,另一个读取它? - Greg
@Greg 嗯,我的当前部署只在一台机器上。目前,考虑到在多个主机上运行它的可能性不大。目录共享是一个有趣的想法,谢谢你提出来。 - Andrew Druchenko
2个回答

2
似乎最近版本的docker-compose(至少是1.5.2)支持在docker-compose.yml文件中使用"external_links"选项,这允许指定在当前配置之外启动的容器。
这正是我在尝试为不同部署的容器共享公共服务(例如MySQL)时所需要的功能。

0

看起来你的需求已经超出了docker-compose的机会。你需要使用编排工具(更或者更复杂)。我们也使用Ubuntu,对于我们的环境,SkyDNS+SkyDock似乎是一个不错且简单的解决方案(当然不需要etcd)。部署包括三个步骤:你只需要拉取镜像,重新配置docker守护进程并启动SkyDNSSkyDock。如果你熟悉俄语,可以在这里找到一个很好的部署指南。

这种解决方案的主要优点是Docker环境内提供了新的DNS区域。容器可以通过名称相互调用。但由于SkyDNS缺乏反向查找功能,你需要显式地传递主机名:

 web:
  image: django
  hostname: web.django.dev.skydns.local
  build: ./webapp
  ports:
    - "8000:8000"
  environment:
    - DEBUG=true
    - SEND_EMAILS=false

通过这种方式,您的容器将在任何容器内部通过名称web.django.dev.skydns.local可用。

“SkyDNS” 不需要 “etcd” 是真的吗?他们主页上的 Setup/Install 部分 的第一行明确提到了使用 etcd 进行配置。此外,我快速浏览了你提到的文章,那里提供的解决方案需要在我的现有配置中同时运行 2 个不同的容器。无论如何,感谢你提到这些服务,我可能会进一步探索这种“服务自动发现”的方向。 - Andrew Druchenko
@AndrewDruchenko,你指出的是SkyDNS2。但我建议你先尝试一下更早版本的SkyDNS(实际上在文章中有描述)。它不需要etcd - Vitaly Isaev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接