Docker 编写循环容器链接
Docker Compose circular container linking
我正在尝试使用 docker 将我们的开发环境容器化。这包括 Google Appengine 项目以及最终托管在容器化虚拟机内的 Google 计算引擎中的服务。
我们当前的开发环境引导脚本在 boot2docker 中启动 elasticsearch 和 nginx,在 dev_appserver appengine 沙箱中的 localhost:{product port} 上启动其他应用程序 运行。这个过程很难管理和维护,因为它需要深入了解我们的应用程序如何通信。
docker-compose 检测到容器之间的循环依赖时出现错误。
Circular import between cs and vbc and aa and 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
它在您的链接中:
sr requires aa
aa requires vbc
vbc requires sr
sr requires aa
sr requires cs
sr requires vbc
vbc requires sr
vbc requires cs
你可以看到这是循环的。
您应该很快就能使用以下解决方案。
正在修复循环链接 PR # 1676
This 是他们解决问题的方式。简而言之,他们将使容器能够在没有链接的情况下相互交谈。我已将更新添加到下面的 Docker Compose 文档中:
Compose 中的网络
默认情况下,Compose 会为您的应用程序设置一个默认网络。服务的每个容器都加入默认网络,并可通过服务名称下的 DNS 发现。
Note: Your app's network is given the same name as the "project name", which is based on the name of the directory it lives in. See the CLI docs for how to override it.
例如,假设您的应用位于名为 myapp
的目录中,并且您的 docker-compose.yml
如下所示:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
当您 运行 docker-compose up
时,会发生以下情况:
- 创建了一个名为
myapp
的网络。
- 容器是使用
web
的配置创建的。它以 web
. 的名字加入网络 myapp
- 容器是使用
db
的配置创建的。它以 db
. 的名字加入网络 myapp
每个容器现在可以查找主机名 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 文件定义,它们之间的所有服务都可用,无需 link 部分。
可以直接向everyone对everyone(包括对自己的服务)的服务名进行请求。所以如果你想从 cs 向 vbc 发出请求,你只需 curl vbc
.
也可以使用自定义域名定义服务,在 docker-compose 文件的服务部分声明 hostname
键。
如果你想看更多,网络api不再是实验性的:
https://github.com/docker/compose/blob/master/docs/networking.md
这是您的 docker-compose 文件,没有不必要的 links:
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
我正在尝试使用 docker 将我们的开发环境容器化。这包括 Google Appengine 项目以及最终托管在容器化虚拟机内的 Google 计算引擎中的服务。
我们当前的开发环境引导脚本在 boot2docker 中启动 elasticsearch 和 nginx,在 dev_appserver appengine 沙箱中的 localhost:{product port} 上启动其他应用程序 运行。这个过程很难管理和维护,因为它需要深入了解我们的应用程序如何通信。
docker-compose 检测到容器之间的循环依赖时出现错误。
Circular import between cs and vbc and aa and 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
它在您的链接中:
sr requires aa
aa requires vbc
vbc requires sr
sr requires aa
sr requires cs
sr requires vbc
vbc requires sr
vbc requires cs
你可以看到这是循环的。
您应该很快就能使用以下解决方案。
正在修复循环链接 PR # 1676
This 是他们解决问题的方式。简而言之,他们将使容器能够在没有链接的情况下相互交谈。我已将更新添加到下面的 Docker Compose 文档中:
Compose 中的网络
默认情况下,Compose 会为您的应用程序设置一个默认网络。服务的每个容器都加入默认网络,并可通过服务名称下的 DNS 发现。
Note: Your app's network is given the same name as the "project name", which is based on the name of the directory it lives in. See the CLI docs for how to override it.
例如,假设您的应用位于名为 myapp
的目录中,并且您的 docker-compose.yml
如下所示:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
当您 运行 docker-compose up
时,会发生以下情况:
- 创建了一个名为
myapp
的网络。 - 容器是使用
web
的配置创建的。它以web
. 的名字加入网络 - 容器是使用
db
的配置创建的。它以db
. 的名字加入网络
myapp
myapp
每个容器现在可以查找主机名 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 文件定义,它们之间的所有服务都可用,无需 link 部分。
可以直接向everyone对everyone(包括对自己的服务)的服务名进行请求。所以如果你想从 cs 向 vbc 发出请求,你只需 curl vbc
.
也可以使用自定义域名定义服务,在 docker-compose 文件的服务部分声明 hostname
键。
如果你想看更多,网络api不再是实验性的: https://github.com/docker/compose/blob/master/docs/networking.md
这是您的 docker-compose 文件,没有不必要的 links:
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