2016-07-23 18 views
9

Giả sử bạn có hai dịch vụ trên topo của bạnDocker chế độ bầy đàn nhiều dịch vụ cùng một cổng

  1. API
  2. Giao diện Web

Cả hai giả sử sẽ được chạy trên cổng 80.

On docker swarm khi bạn tạo một dịch vụ nếu bạn muốn truy cập nó bên ngoài cluster bạn cần để lộ ra và ánh xạ cổng từ dịch vụ tới các nút (các cổng bên ngoài). Nhưng nếu bạn ánh xạ cổng 80 để cho phép nói dịch vụ API thì bạn không thể ánh xạ cùng một cổng cho dịch vụ Giao diện web vì nó sẽ được ánh xạ.

Làm cách nào để giải quyết vấn đề này?

Theo tôi thấy trường hợp sử dụng này không được hỗ trợ. Mặc dù nếu bạn muốn có một cụm đám đông lớn và thông qua trong đó tất cả các dịch vụ và ứng dụng của bạn sẽ không thể thực hiện được vì hành vi này.

Tôi đang thiếu thứ gì đó?

Bất kỳ mẫu nào để giải quyết vấn đề này?

+0

Bối rối bởi câu hỏi. Không có gì docker cụ thể về việc không thể ánh xạ 2 thứ tới cùng một cổng. Chúng sẽ chạy trên cổng 80 bên trong thùng chứa của bạn nhưng bạn sẽ ánh xạ chúng tới các cổng bên ngoài khác nhau. – johnharris85

+0

@JHarris yes i chỉnh sửa câu hỏi chính để chỉ định các cổng bên ngoài. Nhưng đó là mối quan tâm, sau khi bạn ánh xạ dịch vụ API 80 cổng đến cổng ngoài 80 nó không thể được ánh xạ lại cho giao diện Web dịch vụ – bitgandtter

+0

Đúng, làm thế nào để bạn giải quyết điều này mà không cần docker? – johnharris85

Trả lời

3

Sử dụng cổng khác nếu họ cần phải được công khai tiếp xúc:

docker service create -p 80:80 --name web nginx

và sau đó

docker service create -p 8080:80 --name api myapi

Trong ví dụ thứ hai, cổng công cộng 8080 bản đồ để cảng container 80. Trong số tất nhiên nếu họ không cần phải được công khai cổng tiếp xúc, bạn có thể thấy các dịch vụ giữa các container trên cùng một mạng bằng cách sử dụng tên container và container port.

curl http://api:80

sẽ tìm thấy một api chứa tên và kết nối với cổng 80 sử dụng khám phá DNS cho container trên cùng một mạng.

+0

hey @BMitch nhưng trường hợp sử dụng không được hoàn thành, vì API được tiếp xúc với internet trên cổng 8080 khi giả sử là cổng 80. Đó là trường hợp sử dụng mà tôi đang cố gắng hoàn tất.Dù bằng cách nào nếu bạn muốn chỉ có một cụm đám đông lớn và nhiều dịch vụ khác nhau trên đó và một số dịch vụ đó cần phải hiển thị trên cổng 80 tới internet – bitgandtter

+0

Tôi đang cung cấp mô tả về giải pháp mà Docker cung cấp. Triển khai hiện tại của họ không cung cấp bất kỳ tùy chọn nào khác cho phép hiển thị công khai cùng một cổng thông qua cơ chế khám phá dịch vụ của họ cho hai dịch vụ khác nhau. Cách giải quyết mà tôi có thể nghĩ là sử dụng một công cụ khác để hiển thị các dịch vụ theo IP thay vì cổng hoặc proxy giải thích các yêu cầu và gửi tới API hoặc máy chủ web của bạn dựa trên nội dung. – BMitch

+0

@bitgandtter Nó làm cho ít ý nghĩa để có hai dịch vụ xuất khẩu thông qua cùng một cổng. Họ chỉ cách cân bằng tải sẽ có thể gửi lưu lượng truy cập đến dịch vụ chính xác là bằng cách kiểm tra tiêu đề http. Khả thi nhưng chắc chắn không hiệu quả và phức tạp hơn. Trong trường hợp sử dụng của bạn, thông thường sử dụng cổng 80/443 cho phần web và một thứ khác (phạm vi> = 30000) cho api. – Alkaline

3

Nếu bạn cần hiển thị cả giao diện API và giao diện web cho công khai, bạn có hai tùy chọn. Hoặc sử dụng cổng khác nhau cho các dịch vụ

http://my-site.com  # Web interface 
http://my-site.com:8080 # API 

hoặc sử dụng một proxy đó lắng nghe cổng 80 và chuyển tiếp yêu cầu để sửa chữa dịch vụ theo đường dẫn:

http://my-site.com  # Web interface 
http://my-site.com/api # API 
4

Bạn có thể nhìn vào Docker Flow:Proxy để sử dụng như một easy- để cấu hình proxy ngược. NHƯNG, tôi tin rằng, như các nhà bình luận khác đã chỉ ra, chế độ swarm Docker 1.12 có một vấn đề cơ bản với nhiều dịch vụ phơi bày cùng một cổng (như 80 hoặc 8080). Nó tóm tắt (tôi nghĩ) với ma thuật định tuyến lưới - đó là một điều 4 cấp độ, có nghĩa là về cơ bản TCP/IP - nói cách khác, địa chỉ IP + cổng. Vì vậy, mọi thứ trở nên lộn xộn khi nhiều dịch vụ được liệt kê trên (ví dụ) cổng 8080. Bộ định tuyến lưới sẽ vui vẻ cung cấp lưu lượng truy cập đến cổng 8080 cho bất kỳ dịch vụ nào có cùng cổng.

Bạn CÓ THỂ cách ly mọi thứ với nhau bằng cách sử dụng mạng lớp phủ ở chế độ swarm, NHƯNG vấn đề xảy ra khi bạn phải kết nối dịch vụ với proxy (mạng che phủ) - tại thời điểm đó có vẻ như mọi thứ đã bị lẫn lộn (và điều này là nơi tôi đang gặp khó khăn). Giải pháp mà tôi có tại thời điểm này là để cho các dịch vụ cần phải được tiếp xúc với các cổng sử dụng thuần duy nhất khi mạng có liên quan đến proxy (lớp phủ) có liên quan (chúng KHÔNG phải được xuất bản lên các cổng). swarm!), và sau đó thực sự sử dụng một cái gì đó giống như Docker Flow Proxy để xử lý lưu lượng truy cập đến trên cổng mong muốn.

mẫu nhanh để giúp bạn có được tôi bắt đầu (khoảng dựa trên this:

docker network create --driver overlay proxy 
    docker network create --driver overlay my-app 
    # App1 exposed port 8081 
    docker service create --network proxy --network my-app --name app1 myApp1DockerImage 
    docker service create --name proxy \ 
    -p 80:80 \ 
    -p 443:443 \ 
    -p 8080:8080 \ 
    --network proxy \ 
    -e MODE=swarm \ 
    vfarcic/docker-flow-proxy 
    #App2 exposes port 8080 
    docker service create --network proxy --network my-app --name app2 myApp2DockerImage 

Sau đó bạn cấu hình reverse proxy theo đó là documentation

LƯU Ý:. Tôi thấy bây giờ có mới AUTO cấu hình sẵn - Tôi chưa thử điều này.

Kết quả cuối cùng nếu mọi thứ đã hoạt động:

  • ủy quyền lắng nghe trên cổng 80, 443 (và 8080 cho nó là cuộc gọi cấu hình, vì vậy giữ cho rằng OFF net công cộng!)
  • ủy quyền chuyển tiếp đến dịch vụ thích hợp, dựa trên các service domain hoặc service path (Tôi có vấn đề với service path)
  • dịch vụ có thể liên lạc nội bộ qua mạng lớp phủ riêng biệt.
  • dịch vụ không công bố cổng không cần thiết để swarm

[EDIT 2016/10/20]

Bỏ qua tất cả những thứ trên về các vấn đề với cổng tiếp xúc tương tự trên mạng overlay cùng gắn liền với proxy.

Tôi xé thiết lập lỗ của mình và bắt đầu lại - mọi thứ đang hoạt động như mong đợi bây giờ: Tôi có thể truy cập nhiều dịch vụ khác nhau trên cổng 80, sử dụng các miền khác nhau, thông qua proxy lưu trữ docker.

Cũng sử dụng cấu hình tự động được đề cập - mọi thứ đang hoạt động như một nét duyên dáng.

Các vấn đề liên quan