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 时,会发生以下情况:

  1. 创建了一个名为 myapp 的网络。
  2. 容器是使用 web 的配置创建的。它以 web.
  3. 的名字加入网络 myapp
  4. 容器是使用 db 的配置创建的。它以 db.
  5. 的名字加入网络 myapp

每个容器现在可以查找主机名 webdb 并取回相应容器的 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