Khi nào sử dụng Docker-Compose và khi nào sử dụng Docker-Swarm


82

Tôi đang cố gắng hiểu sự khác biệt hoặc tương đồng giữa Docker-ComposeDocker-Swarm .

Bằng cách đọc tài liệu, tôi đã hiểu rằng docker -omp cung cấp một cơ chế để liên kết các vùng chứa khác nhau với nhau và hoạt động cộng tác, như một dịch vụ duy nhất (tôi đoán nó sử dụng chức năng tương tự như lệnh --link được sử dụng để liên kết hai vùng chứa)

Ngoài ra, hiểu biết của tôi về docker-swarm là nó cho phép bạn quản lý một nhóm các máy chủ docker- khác nhau , mỗi máy chủ đang chạy một số phiên bản container của một số hình ảnh docker. Chúng ta có thể xác định các kết nối là mạng lớp phủ giữa các vùng chứa khác nhau trong bầy (ngay cả khi chúng qua hai máy chủ docker trong bầy) để kết nối chúng như một đơn vị.

Điều tôi đang cố gắng hiểu là docker-swarm đã thành công docker-comparm và mạng lớp phủ có phải là cách mới (được khuyến nghị) để kết nối các vùng chứa không?

Hay là do docker-compo vẫn là một phần không thể thiếu của toàn bộ gia đình docker và người ta mong đợi và khuyến khích sử dụng nó để kết nối các container để làm việc cộng tác. Nếu vậy, docker-soạn có hoạt động với các vùng chứa trên các nút khác nhau trong nhóm không ??

Hay là mạng lớp phủ là để kết nối các vùng chứa trên các máy chủ khác nhau trong bầy và trình soạn thảo là để tạo liên kết nội bộ ??

Bên cạnh đó, tôi cũng thấy rằng nó được đề cập trong tài liệu docker rằng - các liên kết không được khuyến khích nữa và sẽ sớm lỗi thời.

Tôi hơi bối rối ???

Cảm ơn rất nhiều!


9
Không có câu trả lời nào giải quyết được câu hỏi của bạn? nếu họ làm vậy, hãy chọn hộp kiểm để chấp nhận một trong số họ làm câu trả lời của bạn.
JoeG

Câu trả lời:


102

Có thể sẽ hữu ích khi bắt đầu với một vài định nghĩa:

  • docker -omp : Lệnh được sử dụng để cấu hình và quản lý một nhóm các vùng chứa có liên quan. Nó là một giao diện người dùng của cùng một api được sử dụng bởi cli docker, vì vậy bạn có thể tái tạo hành vi của nó bằng các lệnh như docker run.
  • docker-compo.yml : Tệp định nghĩa cho một nhóm các vùng chứa, được sử dụng bởi docker-compile và giờ đây cũng được sử dụng bởi chế độ bầy đàn.
  • Chế độ bầy đàn : Được sử dụng để quản lý một nhóm công cụ docker như một thực thể duy nhất và cung cấp sự điều phối (liên tục cố gắng sửa chữa bất kỳ sự khác biệt nào giữa trạng thái hiện tại và trạng thái đích).
  • dịch vụ : Một hoặc nhiều vùng chứa cho cùng một hình ảnh và cấu hình trong bầy, nhiều vùng chứa cung cấp khả năng mở rộng.
  • ngăn xếp : Một hoặc nhiều dịch vụ trong một nhóm, những dịch vụ này có thể được xác định bằng cách sử dụng DAB hoặc tệp docker-compost.yml.
  • mạng cầu nối : Mạng được quản lý bởi một công cụ docker duy nhất trong đó nhiều vùng chứa có thể giao tiếp với nhau. Bạn có thể có nhiều mạng được quản lý bởi một công cụ và các vùng chứa có thể được gắn với không hoặc nhiều mạng.
  • mạng lớp phủ : Tương tự như mạng cầu nối nhưng bao gồm nhiều công cụ docker. Những thứ này yêu cầu một kho khóa / giá trị để duy trì trạng thái của chúng. Chế độ bầy đàn cung cấp điều này, nhưng nếu chế độ bầy đàn bị tắt, bạn cũng có thể sử dụng etcd, lãnh sự hoặc người trông coi vườn thú.
  • liên kết : một phương thức để kết nối các vùng chứa với nhau có trước mạng bắc cầu. Việc sử dụng nó không còn được khuyến khích.
  • bầy đàn cổ điển : Một tiền thân của chế độ bầy đàn tích hợp chạy như một thùng chứa, cho phép nhiều động cơ xuất hiện dưới dạng một, nhưng không cung cấp điều phối hoặc bao gồm cửa hàng k / v của riêng nó.

Để trả lời các câu hỏi:

Docker-swarm đã thành công docker-soạn và mạng lớp phủ có phải là cách mới (được khuyến nghị) để kết nối các vùng chứa không?

Hay là do docker-compo vẫn là một phần không thể thiếu của toàn bộ gia đình docker và người ta mong đợi và khuyến khích sử dụng nó để kết nối các container để làm việc cộng tác. Nếu vậy, docker-soạn có hoạt động với các vùng chứa trên các nút khác nhau trong nhóm không ??

Chúng cung cấp các chức năng khác nhau và sẽ tiếp tục phục vụ cả hai mục đích. Docker-compos không thể khởi động các vùng chứa bên trong chế độ bầy đàn, nhưng có thể sử dụng phiên bản mới hơn của tệp docker-compos.yml (phiên bản 3) để xác định một ngăn xếp trực tiếp ở chế độ bầy đàn mà không cần sử dụng chính docker-compam. cần docker-comp để quản lý các vùng chứa bên ngoài chế độ bầy đàn, trên một công cụ docker đơn lẻ hoặc với bầy đàn cổ điển.

Hay là mạng lớp phủ là để kết nối các vùng chứa trên các máy chủ khác nhau trong bầy và trình soạn thảo là để tạo liên kết nội bộ ??

Bên cạnh đó, tôi cũng thấy rằng nó được đề cập trong tài liệu docker rằng - các liên kết không được khuyến khích nữa và sẽ sớm lỗi thời.

docker-comp bắt đầu từ phiên bản 2 của tệp yml kết nối nhiều vùng chứa với nhau theo mặc định với một mạng bắc cầu mới cho mỗi dự án (dự án được đặt mặc định là tên thư mục). Với swarm cổ điển, điều đó sẽ được mặc định là mạng lớp phủ sử dụng cửa hàng k / v bên ngoài. Và với ngăn xếp chế độ bầy đàn, đây sẽ là một mạng lớp phủ.

Sử dụng mạng docker là cách ưa thích để các container giao tiếp với nhau. Bạn muốn có một mạng cho mỗi nhóm vùng chứa mà bạn muốn tách biệt khỏi phần còn lại của môi trường docker của bạn. docker-comp sẽ tự động hóa việc tạo mạng này, nhưng bạn cũng có thể làm điều đó từ dòng lệnh với docker networks create.

Việc liên kết đã được thay thế phần lớn bằng các mạng docker với tính năng khám phá DNS tích hợp. Khi xóa các liên kết khỏi docker-compost.yml, bạn có thể cần phải thay thế chúng bằng một depends_onphần để thực thi lệnh khởi động vùng chứa. Mặt khác, có rất ít trường hợp mà liên kết có ý nghĩa và tất cả cách sử dụng mà tôi đã thấy là từ một người nào đó theo dõi tài liệu lỗi thời.


3
Điều này là hữu ích. Bạn có thể vui lòng xác định DAB?
Matthew James Briggs

3
DAB là một định dạng tệp thử nghiệm chưa bao giờ đạt được sức hút. Về cơ bản, nó là một tập tin v3 docker -omp.yml bây giờ. docs.docker.com/compose/bundles/#bundle-file-format
BMitch

22

biên soạn hoặc bầy đàn hoặc chia nhóm các mạng lớp phủ

Bạn sẽ thấy rằng bạn cần phải sử dụng tất cả những điều trên nếu bạn đang làm bất cứ điều gì khác ngoài bản demo trên máy tính xách tay của mình, v.v.

Tôi đã cố tình tách ra các mạng lớp phủ bầy đàn & bầy đàn, bởi vì bạn không cần sử dụng cả hai, nhưng bạn không thể có được mạng lớp phủ mà không có một bầy đàn bên dưới nó.

Soạn là để kết hợp nhiều vùng chứa với nhau. Bây giờ nó có ý nghĩa rằng chúng có liên quan đến nhau, mặc dù chúng có thể không. Nhưng hãy giả sử một trường hợp điển hình khi các vùng chứa dành cho các dịch vụ có liên quan đến nhau, khi đó bạn sẽ muốn chúng nói chuyện với nhau theo một cách nào đó nhưng vẫn kiểm soát cách chúng nói chuyện với nhau bằng mạng. Ví dụ: lấy một ứng dụng 3 tầng có máy chủ web, máy chủ ứng dụng và db. Giả sử cả ba thành phần đều được làm dày và bạn đang sử dụng tính năng soạn thư để kết hợp chúng lại với nhau thay vì chạydocker run..ba lần với các thông số khác nhau, v.v. Cả ba sẽ xuất hiện, nhưng bạn muốn kiểm soát cách chúng kết nối với nhau. Bạn muốn máy chủ web có thể nói chuyện với máy chủ ứng dụng, nhưng không phải trực tiếp với db. Và bạn sẽ muốn máy chủ ứng dụng nói chuyện (ping) vùng chứa máy chủ db và cũng ping máy chủ web. Tất cả các kết nối đều có hai chiều, nhưng chỉ giới hạn ở những dịch vụ mà bạn muốn có thể giao tiếp với nhau. Đối với sự sắp xếp như vậy, bạn thường sẽ thiết lập 2 mạng - giả sử frontendbackend. Vùng chứa web và ứng dụng được kết nối với mạng giao diện người dùng. Các vùng chứa ứng dụng và db được kết nối với mạng phụ trợ. Vì không có mạng chung giữa vùng chứa db và web nên chúng không thể chạm (ping) vào nhau, đó là ý định của bạn.

Bây giờ, nếu bạn muốn 3 dịch vụ này có thể chạy trên cụm 100 máy của mình và bạn cũng muốn mở rộng quy mô trên chúng, bạn sẽ cần một mạng trải dài trên nhiều máy chủ. Đó là lúc mạng lớp phủ (theo bầy đàn) xuất hiện. Mạng lớp phủ không gì khác ngoài việc xây dựng mạng đa máy chủ qua công nghệ VxLAN. Bạn không cần phải biết về VxLAN, ngoại trừ việc nó là một cấu trúc liên kết mạng tiêu chuẩn được hỗ trợ trong hầu hết các cơ sở hạ tầng mạng hiện đại.

Tôi hy vọng điều đó làm rõ.

Chỉnh sửa: Tôi không thấy rằng bạn đã có câu trả lời!


1
Cảm ơn bạn @Anoop. Vì vậy, tôi đoán là đúng nếu tôi nói soạn thư và bầy đàn đều sử dụng mô tả dịch vụ dựa trên .yaml để bắt đầu các dịch vụ và cả hai đều sử dụng mạng do người dùng xác định được tạo để kết nối các dịch vụ này. Chỉ có sự khác biệt là soạn thư dành cho một tập hợp các vùng chứa chạy trên một docker-host duy nhất và swarm dành cho một nền tảng đa máy chủ.
Shabirmean

Có, nhưng bạn có thể kết hợp và kết hợp, nghĩa là - bạn có thể sử dụng cùng một tệp soạn thảo để nhắm mục tiêu một cụm bầy đàn thay vì một máy chủ docker duy nhất. Nó cực kỳ linh hoạt theo cách đó.
Anoop

8

Tôi nghĩ rằng bạn có hầu hết hiểu đúng về những gì từng là, nhưng một số điều chỉnh là cần thiết.

Bạn đúng là docker-compile là mang đến các ứng dụng nhiều vùng chứa. Trước đó bạn thường làm docker run ..để bắt đầu mọi vùng chứa. Thông thường, các ứng dụng hiện đại bao gồm mô hình dịch vụ vi mô có thể được tạo thành từ hàng chục dịch vụ và việc sử dụng docker run ..sẽ rất nhanh chóng mệt mỏi. Do đó, docker-compile cho phép bạn thể hiện tất cả các vùng chứa và thuộc tính của chúng cũng như cách chúng kết nối với nhau dưới dạng tệp yamlhoặc jsontệp để bạn có thể quản lý nó theo cách dễ dàng hơn.

Vì vậy, docker-compile là một phần điều phối vùng chứa trong hệ sinh thái docker.

Các liên kết thì khác, chúng chỉ là một phần của trình soạn nhạc hoặc docker runlệnh và không được dùng nữa software defined networksoverlay networkschỉ là một trong số chúng.

Swarm là thành phần lập lịch trong docker. Lập lịch là gì - không có gì khác ngoài việc tìm ra nơi "đặt" các vùng chứa của bạn trong cụm máy chủ docker của bạn. Bạn có thể có một cụm hàng trăm máy chủ, và bạn có thể có hàng trăm vùng chứa, mỗi vùng chứa một dịch vụ cho hàng chục ứng dụng khác nhau. Bây giờ làm thế nào để các vùng chứa này được phân phối trên cụm hàng trăm máy chủ của bạn, một số vùng chứa có nên được đặt chỉ trên một số máy chủ nhất định vì chúng đáp ứng một tiêu chí cụ thể hay không hoặc có thể chúng phải gần (hoặc không) các vùng chứa khác có liên quan bằng cách nào đó ... tất cả những thứ này là một phần của thành phần lập lịch được thực hiện bởi docker Swarm.

Tôi khuyên bạn nên xem qua tài liệu bắt đầu trên docker.com tại đây: https://docs.docker.com/engine/getstarted-voting-app/


Cảm ơn rât nhiều. Tôi đã thực hiện hướng dẫn đó. Tôi đang cố gắng tìm hiểu xem có đề xuất cụ thể nào của chính các nhà phát triển docker về những gì cần được sử dụng để kết nối các vùng chứa có liên quan chặt chẽ với nhau hay không - các mạng lớp phủ soạn thảo hoặc nhóm . Vấn đề khó xử mà tôi gặp phải là ý tưởng kết nối các thùng chứa qua mạng dường như không giống với việc kết nối chúng bằng một thứ gì đó như soạn (hoặc chúng giống nhau ???). Có phải soạn thảo như liên kết vùng chứa an toàn hơn kết nối kiểu mạng lớp phủ không?
Shabirmean
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.