问题 Docker撰写圆形容器链接


我正在试图用docker来集成我们的开发环境。这包括Google Appengine项目的混合以及最终在容器化vm内的Google Compute引擎中托管的服务。

我们当前的开发环境引导脚本在boot2docker中调出elasticsearch和nginx,而其他应用程序在dev_appserver appengine沙箱中的localhost:{product port}上运行。这个过程很难管理和维护,因为它需要对我们的应用程序通信方式有很多了解。

我在docker-compose中遇到错误,它检测到容器之间的循环依赖关系。

cs和vbc以及aa和sr之间的循环导入。

由于此配置仅适用于开发环境(mac osx),因此在将所有产品套件依赖项链接在一起时,是否有人就不同的方法提出建议或想法。

docker-compose.yml的一部分:

elasticsearch:
  build: ./compute/containers/elasticsearch/elasticsearch
  ports:
    - "9200:9200"
  environment:
    - PROJECT_ID=localhost
nginx:
  build: ./compute/containers/elasticsearch/nginx
  links:
    - elasticsearch:localhost
  ports:
    - "9201:9201"
cs:
  build: ./CS
  command: dev_appserver.py /src/ --host=0.0.0.0 --admin_host=0.0.0.0 --port=8080 --admin_port=9080 --storage_path=/data/
  ports:
    - "8080:8080"
    - "9080:9080" 
  volumes:
   - /Users/source/CS/src:/src
   - /Users/source/CS/data:/data 
aa:
  build: ./AA
  command: dev_appserver.py /src/ --host=0.0.0.0 --admin_host=0.0.0.0 --port=8081 --admin_port=9081 --storage_path=/data/
  links:
    - vbc:vbc-local
    - st:st-local
    - elasticsearch:localhost    
  ports:
    - "8081:8081"
    - "9081:9081" 
  volumes:
   - /Users/source/AA/src:/src
   - /Users/source/AA/data:/data 
vbc:
  image: google/cloud-sdk
  command: dev_appserver.py /src/ --host=0.0.0.0 --admin_host=0.0.0.0 --port=8082 --admin_port=9082 --storage_path=/data/
  links:
    - cs:cs-local
    - sr:sr-local
    - sm:sm-local
    - ms:ms-local
    - st:st-local    
    - cis:cis-local
    - elasticsearch:localhost
  ports:
    - "8082:8082"
    - "9082:9082" 
  volumes:
   - /Users/source/VBC/src:/src
   - /Users/source/VBC/data:/data    
sr:
  build: ./SR
  command: dev_appserver.py /src/ --host=0.0.0.0 --admin_host=0.0.0.0 --port=8083 --admin_port=9083 --storage_path=/data/
  links:
    - cs:cs-local  
    - aa:aa-local      
  ports:
    - "8083:8083"
    - "9083:9083" 
  volumes:
   - /Users/source/SR/src:/src
   - /Users/source/SR/data:/data 

10375
2018-03-24 16:59


起源

您可以考虑使用像consul这样的服务注册表 github.com/progrium/docker-consul 和容器的自动注册管理员 registry.hub.docker.com/u/progrium/registrator。使用这些组件,您可以在领事中注册容器,每个容器都必须从领事中读取所需的信息,从而消除循环依赖关系。但是增加了更多的复杂性。 - christian


答案:


您应该可以尽快使用以下解决方案。

圆形链接正在修复中 公关#1676

这个 他们是如何解决这个问题的。简单地说,他们将使容器能够相互通信而不需要连接。我已将更新添加到下面的Docker Compose文档中:

撰写网络

默认情况下,Compose会为您的应用设置一个默认网络。服务的每个容器都加入默认网络,并且可以通过服务名称下的DNS发现。

注意: 您的应用程序的网络名称与“项目名称”相同,后者基于其所在目录的名称。有关如何覆盖它的CLI文档,请参阅CLI文档。

例如,假设您的应用程序位于名为的目录中 myapp, 和你的 docker-compose.yml 看起来像这样:

web:
  build: .
  ports:
    - "8000:8000"
db:
  image: postgres

当你跑步 docker-compose up,发生以下情况:

  1. 一个叫做的网络 myapp 被建造。
  2. 使用创建容器 web的配置。它加入了网络 myapp 以...之名 web
  3. 使用创建容器 db的配置。它加入了网络 myapp 以...之名 db

现在,每个容器都可以查找主机名 web 要么 db 并获取相应容器的IP地址。例如, web的应用程序代码可以连接到URL postgres://db:5432 并开始使用Postgres数据库。

因为 web 显式映射端口,它也可以通过Docker主机网络接口上的端口8000从外部世界访问。

进一步阅读实验性Docker网络API: https://github.com/docker/docker/blob/master/experimental/networking_api.md


8
2017-09-08 03:12



太棒了,期待尝试这个! - Jesse


现在使用v2 docker-compose文件定义,它们之间可以使用所有服务,而无需链接部分。

您可以直接向每个人(包括自身的服务)请求服务名称。所以如果你想从cs向vbc提出请求,你就是这样 curl vbc

也可以使用声明a的自定义域名定义服务 hostname 在docker-compose文件的服务部分中键入。

如果你想看到更多,网络api不再是实验性的: https://github.com/docker/compose/blob/master/docs/networking.md

这是v2中的docker-compose文件,没有不必要的链接:

version: '2'

services:
  elasticsearch:
    build: ./compute/containers/elasticsearch/elasticsearch
    ports:
      - "9200:9200"
    environment:
      - PROJECT_ID=localhost
  nginx:
    build: ./compute/containers/elasticsearch/nginx
    ports:
      - "9201:9201"
  cs:
    build: ./CS
    command: dev_appserver.py /src/ --host=0.0.0.0 --admin_host=0.0.0.0 --port=8080 --admin_port=9080 --storage_path=/data/
    ports:
      - "8080:8080"
      - "9080:9080" 
    volumes:
     - /Users/source/CS/src:/src
     - /Users/source/CS/data:/data 
  aa:
    build: ./AA
    command: dev_appserver.py /src/ --host=0.0.0.0 --admin_host=0.0.0.0 --port=8081 --admin_port=9081 --storage_path=/data/
    ports:
      - "8081:8081"
      - "9081:9081" 
    volumes:
     - /Users/source/AA/src:/src
     - /Users/source/AA/data:/data 
  vbc:
    image: google/cloud-sdk
    command: dev_appserver.py /src/ --host=0.0.0.0 --admin_host=0.0.0.0 --port=8082 --admin_port=9082 --storage_path=/data/
    ports:
      - "8082:8082"
      - "9082:9082" 
    volumes:
     - /Users/source/VBC/src:/src
     - /Users/source/VBC/data:/data    
  sr:
    build: ./SR
    command: dev_appserver.py /src/ --host=0.0.0.0 --admin_host=0.0.0.0 --port=8083 --admin_port=9083 --storage_path=/data/
    ports:
      - "8083:8083"
      - "9083:9083" 
    volumes:
     - /Users/source/SR/src:/src
     - /Users/source/SR/data:/data 

2
2017-07-18 15:00





它在你的链接:

sr requires aa
aa requires vbc
vbc requires sr
sr requires aa

sr requires cs
sr requires vbc
vbc requires sr
vbc requires cs

你可以看到这是循环的。


0
2018-05-02 19:36



是的,我知道这个问题是因为链接。但是,在我的单个docker-compose文件中,为了开发环境引导“统治它们”,这是一个理想的恶魔。问题的目的是弄清楚如何实现这一目标。 - Jesse
为什么要将它们链接在一起?是沟通吗?如果是这样,那么你有几个选择:1。大使容器2.中间代理(我个人更喜欢这个)3。其他几个试图链接远程容器的项目。 - Michael