我正在尝试用 docker 容器化我们的开发环境。这包括混合使用 Google Appengine 项目以及最终托管在容器化虚拟机中的 Google Compute 引擎中的服务。
我们当前的开发环境引导脚本在 boot2docker 中启动 elasticsearch 和 nginx,而其他应用程序在 localhost:{product port} 上运行在 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
您应该很快就能使用以下解决方案。
循环链接正在修复PR#1676
这是他们解决问题的方式。简而言之,他们将使容器能够在没有链接的情况下相互交谈。我已经将更新添加到下面的 Docker Compose 文档中:
默认情况下,Compose 会为您的应用设置一个默认网络。服务的每个容器都加入默认网络,并且可以通过服务名称下的 DNS 发现。
注意: 您的应用程序的网络被赋予与“项目名称”相同的名称,该名称基于它所在目录的名称。请参阅 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
现在有了 v2 docker-compose 文件定义,所有服务都可以在它们之间使用,而不需要链接部分。
可以直接向everyone对everyone的服务名发起请求(包括对自己的一个服务)。所以如果你想从 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
在您的链接中:
sr requires aa
aa requires vbc
vbc requires sr
sr requires aa
sr requires cs
sr requires vbc
vbc requires sr
vbc requires cs
你可以看到这是如何循环的。
你想做的只是不要将 2 个容器相互链接,而不是循环发现错误,我已经解决了。
例子:
mongo: # container image name
image: mongo:latest
...
...
springboot-app:
image: anythink
...
...
links:
- mongo #this image mongo container image name
angular-app:
image: anythink
...
...
links:
- springboot-app