2015-03-24 39 views
10

Tôi đang trong quá trình cố gắng chứa môi trường phát triển của chúng tôi bằng docker. Điều này bao gồm kết hợp các dự án Google Appengine cũng như các dịch vụ cuối cùng được lưu trữ trong công cụ Google Compute trong một vm được container.Docker Soạn thùng chứa hình tròn liên kết

Kịch bản khởi động môi trường phát triển hiện tại của chúng tôi mang đến elasticsearch và nginx trong boot2docker và các ứng dụng khác chạy trên localhost: {product port} trong hộp cát dev_appserver appengine. Quá trình này chứng tỏ khó quản lý và duy trì vì phải mất rất nhiều thông tin chi tiết về cách ứng dụng của chúng tôi giao tiếp.

Tôi gặp lỗi khi tạo docker đang phát hiện sự phụ thuộc vòng tròn giữa các vùng chứa.

Thông tư nhập khẩu giữa cs và VBC và aa và sr.

Như cấu hình này chỉ dành cho môi trường phát triển (Mac OSX), không ai có một lời đề nghị hay ý tưởng về một cách tiếp cận khác nhau để thực hiện khi kết nối tất cả các dãy sản phẩm phụ thuộc với nhau.

Một phần của 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 
+2

Bạn có thể xem xét sử dụng một dịch vụ đăng ký như lãnh sự https://github.com/progrium/docker-consul và người đăng ký tự động cho các vùng chứa của bạn như https://registry.hub.docker.com/u/progrium/registrator/. Với những thành phần này, bạn có thể đăng ký container của bạn trong lãnh sự và mọi thùng chứa sẽ phải đọc thông tin cần thiết từ lãnh sự, loại bỏ các phụ thuộc vòng tròn. Thêm phức tạp hơn mặc dù. – christian

Trả lời

8

Bạn sẽ sớm có thể sử dụng giải pháp sau.

Các liên kết hình tròn đã được cố định trong PR # 1676

This là cách họ đang giải quyết vấn đề này. Nói một cách đơn giản, họ sẽ làm cho các container có thể nói chuyện với nhau mà không cần liên kết. Tôi đã thêm các bản cập nhật cho tài liệu Docker Soạn dưới đây:

Networking trong Soạn

Theo mặc định, Soạn thiết lập một mạng lưới mặc định duy nhất cho ứng dụng của bạn. Mỗi vùng chứa cho một dịch vụ tham gia vào mạng mặc định và có thể phát hiện được thông qua DNS dưới tên của dịch vụ.

Lưu ý: mạng của ứng dụng của bạn được đưa ra cùng tên là "tên dự án", mà là dựa vào tên của thư mục nó sống trong Xem các tài liệu CLI cho làm thế nào để ghi đè lên nó..

Ví dụ, giả sử ứng dụng của bạn trong một thư mục gọi là myapp, và docker-compose.yml của bạn trông như thế này:

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

Khi bạn chạy docker-compose up, sau đây sẽ xảy ra:

  1. Một mạng lưới được gọi là myapp được tạo.
  2. Vùng chứa được tạo bằng cấu hình web. Nó tham gia mạng myapp dưới tên web.
  3. Vùng chứa được tạo bằng cấu hình db. Nó tham gia mạng myapp dưới tên db.

Mỗi vùng chứa bây giờ có thể tra cứu tên máy chủ web hoặc db và lấy lại địa chỉ IP của vùng thích hợp. Ví dụ: mã ứng dụng của web có thể kết nối với URL postgres://db:5432 và bắt đầu sử dụng cơ sở dữ liệu Postgres.

web ánh xạ cổng một cách rõ ràng, bạn cũng có thể truy cập cổng từ thế giới bên ngoài thông qua cổng 8000 trên giao diện mạng của máy chủ Docker.

Tiếp tục đọc trên thực nghiệm API mạng Docker: https://github.com/docker/docker/blob/master/experimental/networking_api.md

+2

Tuyệt vời, mong được thử điều này! – Jesse

0

Đó là trong liên kết của bạn:

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

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

bạn có thể thấy đây là hình tròn.

+0

Vâng, tôi biết vấn đề này là do liên kết. Tuy nhiên, trong tập tin docker-compose đơn của tôi để "cai trị tất cả" cho việc khởi động môi trường bootstrapping, đây là một điều ác mong muốn. Mục đích của câu hỏi là tìm ra cách để thực hiện điều này. – Jesse

+0

Tại sao bạn muốn liên kết chúng lại với nhau? Là nó cho giao tiếp? Nếu vậy, sau đó bạn có một số tùy chọn: 1. đại sứ container 2. proxy ở giữa (tôi thích cá nhân này) 3. một số dự án khác mà cố gắng liên kết container từ xa. – Michael

2

Bây giờ với v2 file Docker-soạn định nghĩa, tất cả các dịch vụ có sẵn giữa chúng mà không cần một phần liên kết.

Bạn có thể trực tiếp yêu cầu tên dịch vụ từ mọi người cho mọi người (kể cả dịch vụ cho chính nó). Vì vậy, nếu bạn muốn thực hiện yêu cầu từ cs đến vbc, bạn chỉ cần curl vbc.

Cũng có thể xác định dịch vụ có tên miền tùy chỉnh khai báo khóa hostname trong phần dịch vụ của tệp trình tạo bản đồ.

Nếu bạn muốn xem chi tiết, các api mạng không còn thực nghiệm: https://github.com/docker/compose/blob/master/docs/networking.md

Đây là tập tin Docker-soạn của bạn trong v2 mà không liên kết không cần thiết:

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 
Các vấn đề liên quan