Làm cách nào để liên kết các dịch vụ Docker giữa các máy chủ?


115

Docker cho phép các máy chủ từ nhiều vùng chứa kết nối với nhau thông qua liên kết và khám phá dịch vụ . Tuy nhiên, từ những gì tôi có thể thấy khám phá dịch vụ này là máy chủ cục bộ. Tôi muốn triển khai một dịch vụ sử dụng các dịch vụ khác được lưu trữ trên một máy khác.

Đã có một số cách tiếp cận để giải quyết vấn đề này trong Docker, chẳng hạn như CoreOSjumpers , các dịch vụ máy chủ cục bộ về cơ bản là proxy cho máy khác và một loạt các dự án github để quản lý triển khai Docker dường như đã cố gắng hỗ trợ trường hợp sử dụng này .

Với tốc độ phát triển, thật khó để tuân theo các phương pháp hay nhất hiện nay. Do đó câu hỏi của tôi về cơ bản là:

  1. Phương thức chủ yếu hiện tại để liên kết giữa các máy chủ trong Docker là gì (nếu có) và
  2. Có kế hoạch nào để hỗ trợ chức năng này trực tiếp trong hệ thống Docker không?

Câu trả lời:


58

Cập nhật

Docker gần đây đã công bố một công cụ mới được gọi là Swarm cho Docker hoặc dàn nhạc.

Swarm cho phép bạn "tham gia" nhiều trình quản lý bầy đàn: Trước tiên, bạn tạo một bầy đàn, bắt đầu một trình quản lý bầy đàn trên một máy và yêu cầu các trình quản lý bầy đàn “tham gia” trình quản lý bầy đàn bằng cách sử dụng định danh của bầy đàn. Máy khách docker kết nối với trình quản lý bầy đàn như thể nó là một máy chủ docker thông thường.

Khi một vùng chứa bắt đầu với Swarm, nó sẽ tự động được gán cho một nút miễn phí đáp ứng mọi ràng buộc đã được xác định. Ví dụ sau được lấy từ bài đăng trên blog:

$ docker run -d -P -e constraint:storage=ssd mysql

Một trong những ràng buộc được hỗ trợ là "node"cho phép bạn ghim vùng chứa vào một tên máy chủ cụ thể. Swarm cũng giải quyết các liên kết giữa các nút.

Trong thử nghiệm của mình, tôi có ấn tượng rằng Swarm chưa hoạt động tốt với các khối lượng ở một vị trí cố định (hoặc ít nhất là quá trình liên kết chúng không trực quan lắm), vì vậy đây là điều cần lưu ý.

Swarm hiện đang trong giai đoạn thử nghiệm.


Cho đến gần đây, Ambassador Pattern là cách tiếp cận Docker-native duy nhất để khám phá dịch vụ máy chủ từ xa. Mẫu này vẫn có thể được sử dụng và không yêu cầu bất kỳ phép thuật nào ngoài Docker đơn giản ở chỗ mẫu bao gồm một hoặc nhiều vùng chứa bổ sung hoạt động như proxy.

Ngoài ra, có một số tiện ích mở rộng của bên thứ ba để làm cho Docker có khả năng sử dụng cụm. Các giải pháp của bên thứ ba bao gồm:

  • Kết nối các cầu nối mạng Docker trên hai máy chủ, tồn tại các giải pháp nhẹ và nhiều giải pháp khác nhau, nhưng nhìn chung có một số lưu ý
  • Khám phá dựa trên DNS, ví dụ với skydock và SkyDNS
  • Các công cụ quản lý Docker như Shipyard và các công cụ điều phối Docker. Xem câu hỏi này để biết danh sách mở rộng: Cách mở rộng quy mô vùng chứa Docker trong sản xuất

2
Vì vậy, về cơ bản vẫn không có cách nào để liên kết các container giữa các máy chủ không liên quan đến mẫu ambasador hoặc bỏ qua docker và nói chuyện trực tiếp với lxc?
user3012759

@ user3012759 Ambassador Pattern là cách gốc duy nhất được thiết lập, nhưng Swarm (trong alpha) là một cách gốc khác hoạt động bằng cách thay thế bộ lập lịch Docker. Xin lỗi vì sự phản ứng chậm.
lyschoening

SkyDock không (chưa: 03/2015) bao gồm hỗ trợ đa máy chủ . Nhà đăng ký (một dự án đơn giản có thể hoạt động với SkyDNS) thì có, nhưng cấu hình thì thủ công hơn (các dịch vụ phải có các cổng được ánh xạ tới các cổng máy chủ).
rùamonvh

6
Điều tra lướt qua của tôi về bầy đàn cho thấy rằng nó tập trung vào quản lý cụm chứ không phải kết nối giữa các máy chủ. Thiếu sót này được nêu rõ bởi bản demo của Docker của youtube.com/watch?v=M4PFY6RZQHQ&t=3m37s
Bruno Bronosky

1
@lyschoening Docker bố mẹ đẻ chủ đa mạng , bạn có thể muốn cập nhật câu trả lời của bạn
Thomasleveil

15

CẬP NHẬT 3

Libswarm đã được đổi tên thành swarm và hiện là một ứng dụng riêng biệt.

Đây là bản demo trang github để sử dụng làm điểm bắt đầu:

# create a cluster
$ swarm create
6856663cdefdec325839a4b7e1de38e8

# on each of your nodes, start the swarm agent
#  <node_ip> doesn't have to be public (eg. 192.168.0.X),
#  as long as the other nodes can reach it, it is fine.
$ swarm join --token=6856663cdefdec325839a4b7e1de38e8 --addr=<node_ip:2375>

# start the manager on any machine or your laptop
$ swarm manage --token=6856663cdefdec325839a4b7e1de38e8 --addr=<swarm_ip:swarm_port>

# use the regular docker cli
$ docker -H <swarm_ip:swarm_port> info
$ docker -H <swarm_ip:swarm_port> run ... 
$ docker -H <swarm_ip:swarm_port> ps 
$ docker -H <swarm_ip:swarm_port> logs ...
...

# list nodes in your cluster
$ swarm list --token=6856663cdefdec325839a4b7e1de38e8
http://<node_ip:2375>

CẬP NHẬT 2

Cách tiếp cận chính thức bây giờ là sử dụng libswarm xem bản demo tại đây

CẬP NHẬT

Có một ý chính tốt đẹp chính cho giao tiếp máy chủ openvswitch trong docker bằng cách sử dụng cùng một phương pháp.

Để cho phép khám phá dịch vụ, có một cách tiếp cận thú vị dựa trên DNS được gọi là skydock .

Ngoài ra còn có một video truyền hình .


Đây cũng là một bài viết hay sử dụng các mảnh ghép tương tự nhưng thêm vlans ở trên:

http://fbevmware.blogspot.it/2013/12/coupling-docker-and-open-vswitch.html

Việc vá lỗi không liên quan gì đến độ mạnh của giải pháp. Docker thực sự chỉ là một loại DSL trên Vùng chứa Linux và cả hai giải pháp trong các bài viết này chỉ đơn giản là bỏ qua một số cài đặt tự động của Docker và trở lại trực tiếp với Vùng chứa Linux.

Vì vậy, bạn có thể sử dụng các giải pháp một cách an toàn và chờ đợi để có thể thực hiện nó theo cách đơn giản hơn sau khi Docker thực hiện nó.


2
Gần đây không có nhiều hoạt động trong chế độ sưởi ấm. Không biết có phải đội docker đang đi hướng khác không nhỉ?
Raman

12

Dệt là một công nghệ mạng ảo Docker mới hoạt động như một bộ chuyển mạch ethernet ảo qua TCP / UDP - tất cả những gì bạn cần là một vùng chứa Docker chạy Weave trên máy chủ của bạn.

Điều thú vị ở đây là

  • Thay vì liên kết, hãy sử dụng IP tĩnh / tên máy chủ trong mạng ảo của bạn
  • Các máy chủ không cần kết nối đầy đủ, một mạng lưới được hình thành dựa trên những gì các đối tác có sẵn và các gói sẽ được định tuyến đa bước đến nơi chúng cần đến

Điều này dẫn đến các tình huống thú vị như

  • Tạo một mạng ảo trên toàn WAN, không có bộ chứa Docker nào sẽ biết hoặc quan tâm đến mạng thực mà chúng đang ở
  • Di chuyển các vùng chứa của bạn đến các máy chủ docker vật lý khác nhau, Weave sẽ phát hiện máy chủ ngang hàng tương ứng

Ví dụ: có một hướng dẫn ví dụ về cách tạo một cụm Cassandra nhiều nút trên máy tính xách tay của bạn và một vài máy chủ đám mây (EC2) với hai lệnh trên mỗi máy chủ. Tôi đã khởi chạy một cụm CoreOS với AWS CloudFormation, được cài đặt dệt trên mỗi trong / nhà / lõi, cộng với máy ảo docker dành cho máy tính xách tay của tôi và đã có một cụm sau chưa đầy một giờ. Máy tính xách tay của tôi có tường lửa nhưng Weave có vẻ ổn với điều đó, nó chỉ kết nối với các đồng nghiệp EC2 của nó.


Theo những gì tôi hiểu, dệt là một lớp phủ mạng hoạt động bên trong các thùng chứa để kết nối dịch vụ, trong khi swarm là một công nghệ phân cụm giúp mở rộng CLI docker cho việc điều phối cơ sở hạ tầng. Kết nối hồng ngoại cần được thực hiện bên ngoài bầy đàn (ví dụ: sử dụng công tắc thông thường) và điều phối dịch vụ bên ngoài dệt (ví dụ: sử dụng Mesos / Kubernetes). Điều này có phù hợp với ý tưởng của bạn về cách nó hoạt động không?
Henrik

Đây là cách tôi sẽ xem xét nó: docker compac là về liên kết vùng chứa và điều phối, docker swarm là về việc chạy docker trên nhiều máy chủ docker, socketplane (hiện thuộc sở hữu của docker) và dệt đều là mạng lớp phủ. Socketplane dựa trên openvswitch thường được sử dụng cho các lớp phủ trong máy ảo (ví dụ: openstack); Mặt khác, Weave chỉ dành cho docker. trong số đó, Mesos / Kubernetes / Lattice là sự thay thế cho nhóm docker với trải nghiệm người dùng và mức độ mở rộng hơi khác so với docker CLI.
Stuart Charlton

7

Cập nhật

Docker 1.12 chứa cái gọi là chế độ bầy đàn và cũng thêm một phần servicetrừu tượng. Chúng có thể không đủ trưởng thành cho mọi trường hợp sử dụng, nhưng tôi khuyên bạn nên theo dõi chúng. Chế độ bầy đàn ít nhất cũng giúp ích trong việc thiết lập nhiều máy chủ lưu trữ, điều này không nhất thiết giúp liên kết dễ dàng hơn. Máy chủ DNS nội bộ Docker (kể từ 1.11) sẽ giúp bạn truy cập các tên vùng chứa, nếu chúng nổi tiếng - có nghĩa là các tên được tạo trong ngữ cảnh Swarm sẽ không dễ sử dụng.


Với bản phát hành Docker 1.9, bạn sẽ được tích hợp mạng đa máy chủ . Họ cũng cung cấp một kịch bản mẫu để dễ dàng cung cấp một cụm làm việc.

Bạn sẽ cần một cửa hàng K / V (ví dụ: Consul) cho phép chia sẻ trạng thái trên các công cụ Docker khác nhau trên mọi máy chủ. Mọi công cụ Docker cần được định cấu hình với cửa hàng K / V đó và sau đó bạn có thể sử dụng Swarm để kết nối các máy chủ của mình.

Sau đó, bạn tạo một mạng lớp phủ mới như sau:

$ docker network create --driver overlay my-network

Các vùng chứa hiện có thể được chạy với tên mạng dưới dạng tham số chạy:

$ docker run -itd --net=my-network busybox

Chúng cũng có thể được kết nối với mạng khi đã chạy:

$ docker network connect my-network my-container

Thông tin chi tiết có sẵn trong tài liệu .


6

Bài viết sau đây mô tả độc đáo cách kết nối bộ chứa docker trên nhiều máy chủ: http://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/


1
Đó thực sự là một giải pháp rất hay; Tôi cũng đã xem qua. Điều tôi quan tâm là bài báo chỉ mới được đăng ngày hôm qua và nó yêu cầu một bản vá Docker. (Với cách nó được đăng gần đây, tôi sẽ đợi một chút để xem liệu họ có hợp nhất bản vá đó vào Docker hay không).
lyschoening

Docker đang trong giai đoạn phát triển ban đầu, có thể không phải tất cả các yêu cầu đều rõ ràng và không phải tất cả các yêu cầu đã xác định đều được thực hiện. Do đó cần phải vá.
paweloque

2
Đây là một câu trả lời không Sao chép câu trả lời từ bài báo được liên kết. Đó là tiêu chuẩn SO.
Bruno Bronosky

6

Có thể kết nối một số mạng con Docker với nhau bằng cách sử dụng Open vSwitch hoặc Tinc. Tôi đã chuẩn bị Gists để hướng dẫn cách thực hiện:

Ưu điểm mà tôi thấy khi sử dụng giải pháp này thay vì --linktùy chọn và mô hình đại sứ là tôi thấy nó minh bạch hơn: không cần phải có thêm thùng chứa và quan trọng hơn, không cần để lộ các cổng trên máy chủ. Trên thực tế, tôi nghĩ về--link tùy chọn là một bản hack tạm thời trước khi Docker có được một câu chuyện hay hơn về thiết lập đa máy chủ (hoặc đa daemon).

Lưu ý: Tôi biết có một câu trả lời khác trỏ đến Gist đầu tiên của tôi nhưng tôi không có đủ nghiệp lực để chỉnh sửa hoặc bình luận về câu trả lời đó.


Bạn sẽ phát hiện dịch vụ như thế nào? Giả sử nếu tôi có Redis trên một máy và một ứng dụng khách trên một máy khác, thì ứng dụng khách sẽ lấy IP của dịch vụ Redis như thế nào?
lyschoening

Theo cách tương tự bạn sẽ làm trên một máy chủ duy nhất: cung cấp cho mình IP / cổng cho các dịch vụ mới bắt đầu hoặc sử dụng kho khóa / giá trị (ví dụ: etcd) hoặc sử dụng DNS mà các dịch vụ có thể truy vấn. Tôi thích sử dụng DNS vì nhiều dịch vụ hiện có có thể sử dụng nó mà không cần sửa đổi.
ghi chú

1

Như đã đề cập ở trên, Weave chắc chắn là một giải pháp khả thi để liên kết các vùng chứa Docker trên các máy chủ. Dựa trên kinh nghiệm của riêng tôi với nó, việc thiết lập nó khá dễ dàng. Nó hiện cũng có dịch vụ DNS mà bạn có thể xử lý vùng chứa bằng tên DNS của nó.

Mặt khác, có Flannel của CoreOS và Opencontrail của Juniper để nối các vùng chứa qua các máy chủ.


1

Có vẻ như bầy đàn docker 1.14cho phép bạn:

  • gán tên máy chủ cho vùng chứa, sử dụng --hostnamethẻ, nhưng tôi không thể làm cho nó hoạt động, các vùng chứa không thể ping lẫn nhau theo tên máy chủ được chỉ định.

  • chỉ định dịch vụ cho máy sử dụng --constraint 'node.hostname == <host>'

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.