Hệ sinh thái Docker: Tổng quan về Containerization
Thường có nhiều rào cản cản trở việc dễ dàng di chuyển ứng dụng của bạn qua chu kỳ phát triển và cuối cùng là đi vào production . Bên cạnh công việc thực tế là phát triển ứng dụng của bạn để đáp ứng phù hợp trong từng môi trường, bạn cũng có thể phải đối mặt với các vấn đề với việc theo dõi dependencies , mở rộng ứng dụng và cập nhật các thành phần riêng lẻ mà không ảnh hưởng đến toàn bộ ứng dụng.Docker container hóa và thiết kế hướng dịch vụ cố gắng giải quyết nhiều vấn đề này. Các ứng dụng có thể được chia thành các thành phần chức năng, có thể quản lý được, được đóng gói riêng lẻ với tất cả các thành phần phụ thuộc của chúng và được triển khai trên kiến trúc bất thường một cách dễ dàng. Chia tỷ lệ và cập nhật các thành phần cũng được đơn giản hóa.
Trong hướng dẫn này, ta sẽ thảo luận về những lợi ích của việc container hóa và cách Docker giúp giải quyết nhiều vấn đề mà ta đã đề cập ở trên. Docker là thành phần cốt lõi trong triển khai containers phân tán cung cấp khả năng mở rộng và quản lý dễ dàng.
Lược sử tóm tắt về quá trình chứa Linux
Containerization và cô lập không phải là những khái niệm mới trong thế giới máy tính. Một số hệ điều hành giống Unix đã tận dụng các công nghệ container hóa trưởng thành trong hơn một thập kỷ.
Trong Linux, LXC, khối xây dựng hình thành nền tảng cho các công nghệ chứa sau này đã được thêm vào kernel vào năm 2008. LXC đã kết hợp việc sử dụng các group kernel (cho phép cô lập và theo dõi việc sử dụng tài nguyên) và không gian tên (cho phép các group được tách biệt để chúng không thể “nhìn thấy” nhau) để thực hiện cách ly quy trình nhẹ.
Sau đó, Docker được giới thiệu như một cách đơn giản hóa công cụ cần thiết để tạo và quản lý containers . Ban đầu nó sử dụng LXC làm trình điều khiển thực thi mặc định (kể từ đó nó đã phát triển một thư viện gọi là libcontainer
cho mục đích này). Docker, trong khi không giới thiệu nhiều ý tưởng mới, đã làm cho chúng có thể tiếp cận được với nhà phát triển và administrator hệ thống bình thường bằng cách đơn giản hóa quy trình và chuẩn hóa trên giao diện. Nó đã thúc đẩy mối quan tâm mới đến việc container hóa trong thế giới Linux giữa các nhà phát triển.
Mặc dù một số chủ đề ta sẽ thảo luận trong bài viết này tổng quát hơn, nhưng ta sẽ chủ yếu tập trung vào Docker container do sự phổ biến rộng rãi và việc áp dụng tiêu chuẩn của nó.
Những gì chứa đựng mang lại cho bức tranh
Container đi kèm với nhiều lợi ích rất hấp dẫn cho cả nhà phát triển và quản trị hệ thống / group vận hành.
Một số lợi ích nhất được liệt kê dưới đây.
Tóm tắt hệ thống server lưu trữ khỏi ứng dụng chứa
Các container được tiêu chuẩn hóa hoàn toàn. Điều này nghĩa là containers kết nối với server và với bất kỳ thứ gì bên ngoài containers bằng các giao diện đã xác định. Một ứng dụng được container hóa không nên dựa vào hoặc quan tâm đến các chi tiết về tài nguyên hoặc kiến trúc của server lưu trữ cơ bản. Điều này đơn giản hóa các giả định phát triển về môi trường hoạt động. Tương tự như vậy, đối với server , mỗi containers là một hộp đen. Nó không quan tâm đến các chi tiết của ứng dụng bên trong.
Khả năng mở rộng dễ dàng
Một trong những lợi ích của sự trừu tượng hóa giữa hệ thống server và các containers là, với thiết kế ứng dụng chính xác, việc mở rộng quy mô có thể đơn giản và dễ hiểu. Thiết kế hướng tới dịch vụ (sẽ thảo luận ở phần sau) kết hợp với các ứng dụng được container hóa cung cấp nền tảng cho khả năng mở rộng dễ dàng.
Một nhà phát triển có thể chạy một vài containers trên máy trạm của họ, trong khi hệ thống này có thể được mở rộng theo chiều ngang trong một khu vực thử nghiệm hoặc tổ chức.Khi các container đi vào production , chúng có thể mở rộng trở lại.
Quản lý phụ thuộc đơn giản và tạo version ứng dụng
Vùng chứa cho phép nhà phát triển gói một ứng dụng hoặc một thành phần ứng dụng cùng với tất cả các thành phần phụ thuộc của nó như một đơn vị. Hệ thống chủ không phải quan tâm đến các phụ thuộc cần thiết để chạy một ứng dụng cụ thể. Miễn là nó có thể chạy Docker, nó sẽ có thể chạy tất cả các containers Docker.
Điều này làm cho việc quản lý phụ thuộc trở nên dễ dàng và cũng đơn giản hóa việc quản lý version ứng dụng. Các hệ thống server và group vận hành không còn chịu trách nhiệm quản lý các nhu cầu phụ thuộc của một ứng dụng vì ngoài việc phụ thuộc vào các containers liên quan, tất cả chúng đều phải được chứa trong chính containers đó.
Môi trường thực thi cô lập, cực kỳ nhẹ
Mặc dù các container không cung cấp cùng mức độ cô lập và quản lý tài nguyên như các công nghệ ảo hóa, nhưng những gì họ giành được từ sự đánh đổi là một môi trường thực thi cực kỳ nhẹ. Các containers được tách biệt ở cấp độ tiến trình, chia sẻ kernel của server . Điều này nghĩa là bản thân containers không bao gồm một hệ điều hành hoàn chỉnh, dẫn đến thời gian khởi động gần như ngay lập tức. Các nhà phát triển có thể dễ dàng chạy hàng trăm containers từ máy trạm của họ mà không gặp sự cố.
Phân lớp được chia sẻ
Các container có trọng lượng nhẹ theo một nghĩa khác là chúng được đặt trong các “lớp”. Nếu nhiều containers dựa trên cùng một lớp, chúng có thể chia sẻ lớp bên dưới mà không bị trùng lặp, dẫn đến việc sử dụng dung lượng đĩa rất tối thiểu cho các hình ảnh sau này.
Khả năng so sánh và khả năng dự đoán
Các file Docker cho phép user xác định các hành động chính xác cần thiết để tạo một containers images mới. Điều này cho phép bạn viết môi trường thực thi của bạn như thể nó là mã, lưu trữ nó trong kiểm soát version nếu muốn. Cùng một file Docker được xây dựng trong cùng một môi trường sẽ luôn tạo ra một containers images giống hệt nhau.
Sử dụng Dockerfiles cho các bản dựng lặp lại, nhất quán
Mặc dù có thể tạo containers images bằng quy trình tương tác, nhưng thường tốt hơn là đặt các bước cấu hình trong Dockerfile khi đã biết các bước cần thiết. Dockerfiles là các file xây dựng đơn giản mô tả cách tạo containers images từ một điểm xuất phát đã biết.
Dockerfiles hữu ích đáng kinh ngạc và khá dễ sử dụng. Một số lợi ích mà họ cung cấp là:
- Phiên bản dễ dàng : Bản thân các Dockerfiles có thể commit kiểm soát version để theo dõi các thay đổi và hoàn nguyên bất kỳ lỗi nào
- Tính khả thi : Việc xây dựng hình ảnh từ Dockerfile giúp loại bỏ lỗi của con người khỏi quá trình tạo hình ảnh.
- Trách nhiệm giải trình : Nếu bạn định chia sẻ hình ảnh của bạn , bạn nên cung cấp Dockerfile đã tạo ra hình ảnh đó như một cách để những user khác kiểm tra quá trình. Về cơ bản, nó cung cấp lịch sử lệnh về các bước thực hiện để tạo hình ảnh.
- Tính linh hoạt : Tạo hình ảnh từ Dockerfile cho phép bạn overrides các giá trị mặc định mà các bản dựng tương tác đưa ra. Điều này nghĩa là bạn không phải cung cấp nhiều tùy chọn thời gian chạy để hình ảnh hoạt động như dự định.
Dockerfiles là một công cụ tuyệt vời để tự động hóa việc xây dựng containers images nhằm cài đặt một quy trình có thể lặp lại.
Kiến trúc của các ứng dụng chứa đựng
Khi thiết kế các ứng dụng để triển khai bên trong các container , một trong những lĩnh vực đầu tiên cần quan tâm là kiến trúc thực tế của ứng dụng. Nói chung, các ứng dụng được chứa trong containers hoạt động tốt nhất khi triển khai thiết kế hướng dịch vụ.
Các ứng dụng hướng dịch vụ phá vỡ chức năng của hệ thống thành các thành phần rời rạc giao tiếp với nhau qua các giao diện được xác định rõ. Bản thân công nghệ container cũng khuyến khích kiểu thiết kế này vì nó cho phép mỗi thành phần mở rộng quy mô hoặc nâng cấp độc lập.
Các ứng dụng triển khai kiểu thiết kế này phải có những phẩm chất sau:
- Họ không nên quan tâm hoặc dựa vào bất kỳ chi tiết cụ thể nào của hệ thống server
- Mỗi thành phần phải cung cấp các API nhất quán mà người tiêu dùng có thể sử dụng để truy cập dịch vụ
- Mỗi dịch vụ nên nhận các dấu hiệu từ các biến môi trường trong quá trình cấu hình ban đầu
- Dữ liệu ứng dụng phải được lưu trữ bên ngoài containers trên các ổ đĩa được gắn hoặc trong containers dữ liệu
Các chiến lược này cho phép từng thành phần được swap hoặc nâng cấp một cách độc lập miễn là API được duy trì. Họ cũng hướng tới khả năng mở rộng theo chiều ngang tập trung do thực tế là mỗi thành phần có thể được mở rộng tùy theo nút cổ chai đang trải qua.
Thay vì mã hóa cứng các giá trị cụ thể, mỗi thành phần thường có thể xác định các giá trị mặc định hợp lý. Thành phần có thể sử dụng chúng làm giá trị dự phòng, nhưng nên ưu tiên các giá trị mà nó có thể thu thập từ môi trường của nó. Điều này thường được thực hiện thông qua sự hỗ trợ của các công cụ khám phá dịch vụ, mà thành phần có thể truy vấn trong quá trình khởi động của nó.
Lấy cấu hình ra khỏi containers thực tế và đặt nó vào môi trường cho phép dễ dàng thay đổi hành vi ứng dụng mà không cần xây dựng lại containers images . Nó cũng cho phép một cài đặt duy nhất ảnh hưởng đến nhiều trường hợp của một thành phần. Nhìn chung, thiết kế hướng dịch vụ kết hợp tốt với các chiến lược cấu hình môi trường vì cả hai đều cho phép triển khai linh hoạt hơn và mở rộng quy mô thẳng thắn hơn.
Sử dụng Register Docker để Quản lý Vùng chứa
Khi ứng dụng của bạn được chia thành các thành phần chức năng và được cấu hình để phản hồi thích hợp với các containers và cờ cấu hình khác trong môi trường, bước tiếp theo thường là cung cấp containers images của bạn thông qua register . Tải containers images lên register cho phép server Docker kéo hình ảnh xuống và tạo các trường hợp containers chỉ bằng cách biết tên hình ảnh.
Có nhiều đăng ký Docker khác nhau cho mục đích này. Một số là cơ quan đăng ký công khai, nơi mọi người có thể xem và sử dụng các hình ảnh đã được commit , trong khi các cơ quan đăng ký khác là riêng tư. Hình ảnh có thể được gắn thẻ để chúng dễ dàng nhắm đến để download hoặc cập nhật.
Kết luận
Docker cung cấp khối xây dựng cơ bản cần thiết cho việc triển khai containers phân tán. Bằng cách đóng gói các thành phần ứng dụng trong các container của riêng chúng, việc mở rộng quy mô theo chiều ngang trở thành một quá trình đơn giản để xoay vòng hoặc tắt nhiều version của mỗi thành phần. Docker cung cấp các công cụ cần thiết để không chỉ xây dựng containers mà còn quản lý và chia sẻ chúng với user hoặc server mới.
Trong khi các ứng dụng được đóng gói cung cấp sự cách ly và đóng gói quy trình cần thiết để hỗ trợ triển khai, thì vẫn có nhiều thành phần khác cần thiết để quản lý và mở rộng các containers một cách đầy đủ trên một cụm server phân tán.Trong hướng dẫn tiếp theo của ta , ta sẽ thảo luận về cách thức khám phá dịch vụ và các cửa hàng cấu hình phân tán global đóng góp vào việc triển khai containers theo cụm.
Các tin liên quan
Hệ sinh thái Docker: Giới thiệu về các thành phần chung2015-02-01
Hệ sinh thái Docker: Lập lịch và Điều phối
2015-02-01
Hệ sinh thái Docker: Khám phá dịch vụ và Cửa hàng cấu hình phân tán
2015-02-01
Hệ sinh thái Docker: Mạng và Truyền thông
2015-02-01
Cách thiết lập registry Docker riêng trên Ubuntu 14.04
2014-10-15
Cách thực hiện kiểm tra tích hợp liên tục với Drone.io trên CoreOS và Docker
2014-10-08