我正在尝试使用docker来集成我们的开发环境。这包括Google Appengine项目的混合以及最终在容器化vm内的Google Compute引擎中托管的服务。
我们的目前的开发环境中启动脚本弹出elasticsearch和nginx的boot2docker内和其他应用程序在本地主机上运行:在dev_appserver AppEngine上沙箱内{产品端口}。这个过程很难管理和维护,因为它需要大量了解我们的应用程序如何通信。
我在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
答案 0 :(得分:8)
您应该可以尽快使用以下解决方案。
循环链接正在PR # 1676
中修复This就是他们如何解决这个问题。简单地说,他们将使容器能够相互通信而不需要连接。我已将更新添加到下面的Docker Compose文档中:
默认情况下,Compose会为您的应用设置一个默认网络。服务的每个容器都加入默认网络,并且可以通过服务名称下的DNS发现。
注意:您的应用程序的网络名称与“项目名称”相同,后者基于其所在目录的名称。有关如何覆盖它的CLI文档,请参阅CLI文档。
例如,假设您的应用位于名为myapp
的目录中,而您的docker-compose.yml
如下所示:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
当您运行docker-compose up
时,会发生以下情况:
myapp
的网络。web
的配置创建容器。它以名称myapp
。web
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
答案 1 :(得分:2)
现在使用v2 docker-compose文件定义,它们之间可以使用所有服务,而无需链接部分。
您可以直接向每个人(包括自身的服务)请求服务名称。因此,如果您想要从cs向vbc发出请求,则只需curl vbc
。
还可以在docker-compose文件的服务部分中使用自定义域名声明hostname
键来定义服务。
如果你想看到更多,网络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