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
,会发生以下情况:
- 一个名为
myapp
的networking被创build。 - 一个容器是使用
web
的configuration创build的。 它以名称web
joinnetworkingmyapp
。 - 一个容器是使用
db
的configuration创build的。 它以名称db
joinnetworkingmyapp
。
每个容器现在可以查找主机名web
或db
并取回适当的容器的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
你可以看到这是如何循环的