2015-06-20 77 views
14

Bạn đang xem xét việc sử dụng Docker cho một dự án dịch vụ REST. Một câu hỏi tôi có là liệu chúng ta có thể sử dụng Docker để chạy nhiều phiên bản của dịch vụ trên cùng một máy chủ/cổng. Ví dụ: Tôi muốn có điểm cuối tại {myserver}: 8080/v1/và một điểm cuối khác tại {myserver}: 8080/v2 /.Nhiều vùng chứa Docker có thể chạy bằng cùng một máy chủ/cổng không?

Nếu nó có liên quan, thì đây sẽ là hình ảnh Docker dựa trên Java: 8 được xây dựng bằng một thùng java trên khung công tác Spring Boot REST.

Điều này có thể thực hiện với vùng chứa Docker không?

+2

đây là vấn đề XY. điều này là có thể nếu không có vùng chứa sử dụng proxy (ví dụ: nginx). các thùng chứa không liên quan ở đây; bạn có thể chạy các dịch vụ phụ trợ trong các thùng chứa ... hay không. – dnozay

+0

Đó là một câu hỏi thú vị khó khăn, bởi vì Docker có thể đã tích hợp một tính năng proxy nhỏ cho các tuyến đường. Hãy tưởng tượng một cái gì đó như: một container với Apache, một với Node.js làm việc cả trên: 80 mà không cần một proxy ... –

Trả lời

4

Đây là câu hỏi về cách cổng tcp hoạt động như cách trình docker hoạt động. Trong cùng một cách mà hai ứng dụng không thể liên kết với cùng một cổng tcp, không thể có hai vùng chứa docker.

Vì @Sergei Rodionov chỉ ra SO_REUSEPORT có thể được sử dụng để cho phép nhiều quy trình chia sẻ cùng một cổng tcp (và điều này có thể được chỉ định khi khởi chạy ứng dụng java của bạn). Tôi không nghĩ rằng điều này sẽ làm việc trên container.

+0

Nếu socket ban đầu bị ràng buộc với tùy chọn SO_REUSEPORT thì sao? –

+0

Dường như với tôi rằng SO_REUSEPORT có nghĩa là được sử dụng cho các quy trình trên cùng một máy. Bạn có nghĩ rằng nó sẽ làm việc trên container? –

+0

@RobertMoskal Đối với Nginx giải pháp nginx-proxy sau đây với docker-gen có thể giúp: github.com/jwilder/nginx-proxy Về cơ bản bạn thêm một proxy trong môi trường docker của bạn và để nó xử lý các yêu cầu trên cổng host của bạn và chuyển tiếp nó tới thùng chứa thích hợp –

7

Bạn có thể chạy cả hai vùng chứa bằng các cổng lưu trữ khác nhau và sử dụng haproxy/nginx/varnish (bản địa hoặc bên trong thùng chứa khác) lắng nghe cổng máy chủ và chuyển hướng đến vùng chứa phù hợp dựa trên URL.

+1

Đối với Nginx, giải pháp nginx-proxy sau đây với docker-gen có thể giúp: https://github.com/jwilder/nginx-proxy Về cơ bản bạn thêm một proxy trong môi trường docker và để nó xử lý các yêu cầu trên máy chủ của bạn cổng và chuyển tiếp nó vào thùng chứa thích hợp –

5

Có, điều này có thể miễn là bạn đang sử dụng các địa chỉ mạng khác nhau cho mỗi cổng trùng lặp mà bạn đang nghe.

Ví dụ, máy chủ của bạn có IP sau gán cho nó: 192.168.11.223 10.88.88.12

Bạn có thể có hai container riêng biệt cả hai lắng nghe trên: 192.168.11.223:80 10.88.88.12: 80

Nếu bạn nhìn vào cú pháp cho Docker chạy:

-p=[]  : Publish a container᾿s port or a range of ports to the host 
      format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort 
      Both hostPort and containerPort can be specified as a range of ports. 
      When specifying ranges for both, the number of container ports in the range must match the number of host ports in the range. (e.g., `-p 1234-1236:1234-1236/tcp`) 
      (use 'docker port' to see the actual mapping) 
1

có, nó có thể miễn là container đang sử dụng địa chỉ IP khác nhau. bạn có thể kiểm tra địa chỉ IP của các vùng chứa bằng cách sử dụng lệnh dưới đây.

docker inspect -f '{{ .NetworkSettings.IPAddress }}' <container ID> 
Các vấn đề liên quan