Docker编写循环的容器链接

我正在试图用docker来集成我们的开发环境。 这包括Google Appengine项目的组合以及最终在集装箱化虚拟机中的Google Compute引擎中托pipe的服务。

我们当前的开发环境引导脚本在boot2docker中启动elasticsearch和nginx,其他应用程序在dev_appserver appengine沙箱中的localhost:{product port}上运行。 这个过程certificate难以pipe理和维护,因为它需要我们的应用程序沟通的很多洞察力。

docker-compose发现错误,它检测到容器之间的循环依赖。

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

由于此configuration仅适用于开发环境(mac osx),因此在将所有产品套件依赖关系链接在一起时,是否有人对采用不同方法提出build议或意见。

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 

您应该能够尽快使用以下解决scheme。

圆形链接正在固定在PR#1676

这是他们如何解决这个问题。 简而言之,他们将使集装箱能够彼此交谈,而无需联系。 我已经将更新添加到下面的Docker Compose文档中:

在撰写networking

默认情况下,Compose会为您的应用程序设置一个默认networking。 服务的每个容器都join默认networking,并且可以通过服务名称下的DNS来发现。

注意:您的应用程序的networking名称与“项目名称”相同,该名称基于所在目录的名称。请参阅CLI文档以了解如何覆盖它。

例如,假设您的应用程序位于名为myapp的目录中,并且您docker-compose.yml如下所示:

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

当你运行docker-compose up ,会发生以下情况:

  1. 一个名为myapp的networking被创build。
  2. 一个容器是使用web的configuration创build的。 它以名称webjoinnetworkingmyapp
  3. 一个容器是使用db的configuration创build的。 它以名称dbjoinnetworkingmyapp

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

由于web显式映射端口,所以也可以通过Docker主机的networking接口上的端口8000从外部访问。

进一步阅读实验DockernetworkingAPI: https : //github.com/docker/docker/blob/master/experimental/networking_api.md

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

您可以直接向所有人(包括自己的服务)向服务名称提出请求。 所以如果你想从cs到vbc的请求,你只是curl vbc

也可以在docker-compose文件的服务部分中定义一个具有声明hostname密钥的自定义域名的服务。

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

这是你的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 

这是在你的链接:

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

你可以看到这是如何循环的