Docker编写循环容器链接

dgiusagp  于 2023-04-29  发布在  Docker
关注(0)|答案(4)|浏览(293)

我正在尝试用docker容器化我们的开发环境。这包括Google Appengine项目的混合以及最终托管在容器化VM内的Google Compute引擎中的服务。
我们当前的开发环境引导脚本在boot 2docker中启动elasticsearch和nginx,其他应用程序在dev_appserver appengine沙箱中的localhost:{product port}上运行。事实证明,这个过程很难管理和维护,因为它需要深入了解我们的应用程序如何通信。
我在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
pxq42qpu

pxq42qpu1#

您应该很快就可以使用以下解决方案。
正在PR # 1676中修复循环链接
这就是他们解决问题的方式。简单地说,它们将使容器能够在没有链接的情况下彼此对话。我已经在Docker Compose文档中添加了以下更新:

Compose组网

默认情况下,Compose会为您的应用设置单个默认网络。服务的每个容器都加入默认网络,并且可以通过服务名称下的DNS发现。

**注意:**您的应用网络的名称与“项目名称”相同,该名称基于其所在目录的名称。有关如何覆盖它,请参阅CLI文档。

例如,假设您的应用位于名为myapp的目录中,并且您的docker-compose.yml看起来像这样:

web:
  build: .
  ports:
    - "8000:8000"
db:
  image: postgres

运行docker-compose up时,会发生以下情况:
1.创建一个名为myapp的网络。
1.使用web的配置创建容器。它以名称web加入网络myapp
1.使用db的配置创建容器。它以db的名称加入网络myapp
每个容器现在都可以查找主机名webdb,并获取相应容器的IP地址。例如,web的应用程序代码可以连接到URL postgres://db:5432并开始使用Postgres数据库。
因为web显式Map了一个端口,所以外部世界也可以通过Docker主机网络接口上的端口8000访问它。
进一步阅读实验性Docker网络API:https://github.com/docker/docker/blob/master/experimental/networking_api.md

sg24os4d

sg24os4d2#

现在有了v2 docker-compose文件定义,所有服务都可以在它们之间使用,而不需要链接部分。
您可以直接从每个人向每个人(包括服务本身)请求服务名称。所以如果你想从cs向vbc发出一个请求,你只需要curl vbc
也可以在docker-compose文件的service部分定义一个自定义域名,声明一个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
atmip9wb

atmip9wb3#

在你的链接中:

sr requires aa
aa requires vbc
vbc requires sr
sr requires aa

sr requires cs
sr requires vbc
vbc requires sr
vbc requires cs

你可以看到这是一个循环。

1wnzp6jl

1wnzp6jl4#

你要做的只是不链接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

相关问题