VM hay Docker?

Làm cách nào để hiểu rằng bạn cần Docker chứ không phải VM? Bạn cần xác định chính xác những gì bạn muốn cô lập. Nếu bạn muốn cách ly một hệ thống với các tài nguyên được đảm bảo và phần cứng ảo, thì sự lựa chọn sẽ thuộc về VM. Nếu bạn cần tách các ứng dụng đang chạy thành các quy trình hệ thống riêng biệt, bạn sẽ cần Docker.

Vậy sự khác biệt giữa Docker container và VM là gì?

Máy ảo (VM) là một máy tính ảo với tất cả các thiết bị ảo và một đĩa cứng ảo, trên đó cài đặt một hệ điều hành độc lập mới cùng với trình điều khiển thiết bị ảo, quản lý bộ nhớ và các thành phần khác. Đó là, chúng tôi có được một phần cứng vật lý trừu tượng cho phép bạn chạy nhiều máy tính ảo trên một máy tính.
Một máy ảo đã cài đặt có thể chiếm dung lượng đĩa theo nhiều cách khác nhau:

  • không gian đĩa cứng cố định, cho phép truy cập nhanh hơn vào đĩa cứng ảo và tránh phân mảnh tệp;
  • cấp phát bộ nhớ động. Khi cài đặt các ứng dụng bổ sung, bộ nhớ sẽ được phân bổ động cho chúng cho đến khi đạt đến dung lượng tối đa được phân bổ cho nó.

Càng nhiều máy ảo trên máy chủ, chúng càng chiếm nhiều dung lượng và cũng yêu cầu sự hỗ trợ liên tục của môi trường cần thiết để ứng dụng của bạn hoạt động.

phu bến tàu là phần mềm xây dựng ứng dụng dựa trên container. Bộ chứa và máy ảo có những lợi ích tương tự, nhưng hoạt động khác nhau. Container chiếm ít không gian hơn, bởi vì sử dụng quá nhiều tài nguyên được chia sẻ của hệ thống máy chủ so với VM, bởi vì không giống như VM, cung cấp ảo hóa ở cấp hệ điều hành, không phải phần cứng. Cách tiếp cận này cung cấp ít dung lượng bộ nhớ hơn, triển khai nhanh hơn và mở rộng quy mô dễ dàng hơn.

Bộ chứa cung cấp một cơ chế hiệu quả hơn để đóng gói các ứng dụng bằng cách cung cấp các giao diện cần thiết cho hệ thống máy chủ. Tính năng này cho phép các bộ chứa chia sẻ lõi của hệ thống, trong đó mỗi bộ chứa chạy như một quy trình riêng biệt của HĐH chính, có bộ vùng bộ nhớ riêng (không gian địa chỉ ảo của riêng nó). Do không gian địa chỉ ảo của mỗi bộ chứa là riêng nên dữ liệu thuộc các vùng bộ nhớ khác nhau không thể thay đổi được.
Hệ điều hành gốc cho Docker là Linux (Docker cũng có thể được sử dụng trên Windows và MacOS), nó sử dụng các ưu điểm chính của nó, cho phép nó tổ chức một kernel tách rời. Việc khởi chạy bộ chứa Docker trên Windows sẽ diễn ra bên trong máy ảo Linux. các container chia sẻ hệ điều hành của hệ thống máy chủ và hệ điều hành chính cho chúng là Linux.

Container - nó hoạt động như thế nào?

thùng chứa là một sự trừu tượng ở cấp độ ứng dụng kết hợp mã và các phụ thuộc. Các thùng chứa luôn được tạo từ các hình ảnh, thêm lớp trên cùng có thể ghi và khởi tạo các tham số khác nhau. Vì một vùng chứa có lớp ghi riêng và tất cả các thay đổi được lưu trữ trong lớp đó nên nhiều vùng chứa có thể chia sẻ quyền truy cập vào cùng một hình ảnh chính.

Mỗi vùng chứa có thể được cấu hình thông qua một tệp trong dự án docker-compose có trong giải pháp chính, docker-compose.yml. Ở đó, bạn có thể đặt các tham số khác nhau như tên vùng chứa, cổng, số nhận dạng, giới hạn tài nguyên, sự phụ thuộc giữa các vùng chứa khác. Nếu bạn không chỉ định tên bộ chứa trong cài đặt, thì Docker sẽ tạo một bộ chứa mới mỗi lần, gán tên cho nó một cách ngẫu nhiên.

Khi một bộ chứa được bắt đầu từ một hình ảnh, Docker sẽ gắn hệ thống tệp đọc/ghi lên trên bất kỳ lớp nào bên dưới. Đây là nơi tất cả các quy trình chúng tôi muốn bộ chứa Docker của chúng tôi chạy sẽ chạy.

Khi Docker khởi động một container lần đầu tiên, lớp đọc/ghi ban đầu trống. Khi thay đổi xảy ra, chúng được áp dụng cho lớp đó; ví dụ: nếu bạn muốn sửa đổi một tệp, tệp đó sẽ được sao chép từ lớp chỉ đọc bên dưới sang lớp đọc-ghi.
Phiên bản chỉ đọc của tệp sẽ vẫn tồn tại nhưng hiện bị ẩn dưới bản sao. Các ổ đĩa được sử dụng để lưu trữ dữ liệu, bất kể vòng đời của vùng chứa. Các ổ đĩa được khởi tạo khi một vùng chứa được tạo.

Hình ảnh được liên kết với vùng chứa như thế nào?

Hình ảnh - phần tử chính cho mỗi vùng chứa. Hình ảnh được tạo từ Dockerfile được thêm vào dự án và là một tập hợp các hệ thống tệp (lớp) được xếp chồng lên nhau và được nhóm lại với nhau, chỉ có sẵn để đọc; số lớp tối đa là 127.

Trung tâm của mỗi hình ảnh là một hình ảnh cơ sở, được chỉ định bởi lệnh TỪ - điểm vào khi tạo hình ảnh Dockerfile. Mỗi lớp là một lớp chỉ đọc và được biểu thị bằng một lệnh duy nhất sửa đổi hệ thống tệp, được viết trong Dockerfile.
Để kết hợp các lớp này thành một hình ảnh duy nhất, Docker sử dụng hệ thống tệp Union nhiều lớp nâng cao (AuFS được xây dựng trên UnionFS), cho phép các tệp và thư mục khác nhau từ các lớp tệp khác nhau chồng lên nhau một cách trong suốt, tạo ra một hệ thống tệp được liên kết.

Các lớp chứa siêu dữ liệu cho phép bạn lưu trữ thông tin liên quan về từng lớp trong thời gian chạy và thời gian xây dựng. Mỗi lớp chứa một liên kết đến lớp tiếp theo, nếu lớp không có liên kết, thì đây là lớp trên cùng của hình ảnh.

Dockerfile có thể chứa các lệnh như:

  • TỪ - điểm vào trong việc hình thành hình ảnh;
  • MAINTAINER - tên của chủ sở hữu của hình ảnh;
  • RUN - thực thi lệnh trong quá trình lắp ráp hình ảnh;
  • THÊM - sao chép tệp máy chủ sang hình ảnh mới, nếu bạn chỉ định tệp URL, Docker sẽ tải tệp đó xuống thư mục đã chỉ định;
  • ENV - biến môi trường;
  • CMD - bắt đầu tạo vùng chứa mới dựa trên hình ảnh;
  • ENTRYPOINT - Lệnh được thực thi khi vùng chứa khởi động.
  • WORKDIR là thư mục làm việc để thực thi lệnh CMD.
  • NGƯỜI DÙNG - Đặt UID cho vùng chứa được tạo từ hình ảnh.
  • VOLUME - Gắn thư mục máy chủ vào vùng chứa.
  • EXPOSE là một tập hợp các cổng được nghe trong vùng chứa.

UnionFS hoạt động như thế nào?

Liên minhFS — hệ thống tệp ngăn xếp dịch vụ (FS) cho Linux và FreeBSD. FS này triển khai cơ chế sao chép khi ghi (Copy-On-Write, COW). Đơn vị làm việc của UnionFS là một lớp, mỗi lớp phải được coi là một hệ thống tệp đầy đủ riêng biệt với hệ thống phân cấp thư mục từ chính thư mục gốc. UnionFS tạo một liên kết gắn kết cho các hệ thống tệp khác và cho phép bạn hợp nhất các tệp và thư mục từ các hệ thống tệp khác nhau (được gọi là các nhánh) một cách minh bạch vào một hệ thống tệp được liên kết duy nhất, một cách minh bạch đối với người dùng.

Nội dung của các thư mục có cùng đường dẫn sẽ được hiển thị cùng nhau trong một thư mục kết hợp (trong cùng một không gian tên) của hệ thống tệp kết quả.

UnionFS kết hợp các lớp dựa trên các nguyên tắc sau:

  • một trong các lớp trở thành lớp cấp cao nhất, lớp thứ hai và các lớp tiếp theo trở thành lớp cấp thấp hơn;
  • người dùng có thể truy cập các đối tượng lớp “từ trên xuống dưới”, tức là nếu đối tượng được yêu cầu ở lớp "trên", nó sẽ được trả về, bất kể sự hiện diện của đối tượng có cùng tên trong lớp "dưới"; mặt khác, đối tượng lớp "dưới cùng" được trả về; nếu đối tượng được yêu cầu không có ở đó cũng không có ở đó, lỗi "Không có tệp hoặc thư mục như vậy" được trả về;
  • lớp làm việc là lớp “trên cùng”, nghĩa là mọi hành động thay đổi dữ liệu của người dùng chỉ được phản ánh trên lớp cấp cao nhất mà không ảnh hưởng đến nội dung của các lớp cấp thấp hơn.

Docker là công nghệ phổ biến nhất để sử dụng các thùng chứa trong công việc của ứng dụng. Nó đã trở thành tiêu chuẩn trong lĩnh vực này, được xây dựng trên các nhóm và không gian tên được cung cấp bởi nhân Linux.

Docker cho phép chúng tôi triển khai nhanh các ứng dụng và tận dụng tốt nhất hệ thống tệp bằng cách chia sẻ nhân hệ điều hành giữa tất cả các vùng chứa, chạy dưới dạng các quy trình hệ điều hành riêng biệt.

Nguồn: www.habr.com

Thêm một lời nhận xét