Docker là công cụ mã nguồn mở giúp tự động triển khai một ứng dụng bên trong container phần mềm. Cách đơn giản nhất để nắm bắt ý tưởng đằng sau Docker là so sánh nó với một container tàu hàng
Ngày nay những công ty vận chuyển phải đối mặt với những thách thức như sau:
- Cách vận chuyển các loại hàng hoá khác nhau cạnh nhau như là thực phẩm và hoá chất, hay thuỷ tinh và gạch.
- Làm thế nào để xử lý các gói kích cỡ khác nhau sử dụng cùng một phương tiện
Sau khi giới thiệu sử dụng container, gạch có thể được đặt lên trên thuỷ tinh và hoá chất có thể lưu trữ bên cạnh thực phẩm. Hàng hoá với kích thước khác nhau có thể được đặt trong container với kích cỡ phù hợp và được đưa vào / dỡ ra trên cùng phương tiện.
Khi chúng ta phát triển một ứng dụng, chúng ta cần cung cấp code mình cùng với tất cả các phụ thuộc như là các thư viện, web server, cơ sở dữ liệu… Bạn có thể gặp trường hợp ứng dụng đang hoạt động tốt trên máy tính của mình, nhưng nó thậm chí không thể khởi động lên được trên server staging, hoặc trên máy của dev hoặc SQA khác.
Thử thách này có thể được giải quyết bằng cách cô lập ứng dụng để nó độc lập với hệ thống.
Docker khác với máy ảo như thế nào?
Theo truyền thống, chúng ta sẽ sử dụng máy áo để tránh những trường hợp không mong muốn này. Nhưng vấn đề chính khi chúng ta sử dụng máy ảo, nó là một hệ điều hành phụ trên hệ điều hành máy chủ, làm tăng thêm không gian lưu trữ cho dự án. Hầu hết thời gian server của bạn sẽ lưu trữ nhiều máy ảo, do đó nó sẽ chiếm nhiều không gian lưu trữ hơn. Và bằng cách này, ngày nay hầu hết các nhà cung cấp server dựa trên cloud sẽ tính phí thêm cho bạn không gian lưu trữ đấy. Một nhược điểm quan trọng nữa của máy áo là khởi động rất chậm
Docker đã loại bỏ hết các nhược điểm trên đơn giản bằng cách chia sẻ kernel hệ điều hành cho tất cả các container đang chạy dưới dạng các tiến trình riêng rẽ của hệ điều hành máy chủ.
Tại sao chúng ta cần docker
Những lợi ích khi sử dụng docker bao gồm:
- Quy trình phát triển nhanh hơn
- Đóng gói ứng dụng tiện dụng
- Hoạt động trên cùng một môi trường giống nhau trên máy local và server dev, staging, production.
- Monitor dễ dàng và rõ ràng
- Dễ mở rộng
Quy trình phát triển nhanh hơn
Sẽ không cần cài ứng dụng bên thứ 3 như là PostgreSQL, Redis, Elastic Search trên hệ thống. Bạn có thể chạy nó trên container. Docker cũng giúp chúng ta có thể chạy version khác nhau của cùng một ứng dụng đồng thời. Ví dụ: Giả sử bạn cần migrate dữ liệu bằng tay từ một version PostgreSQL cũ hơn sang version mới hơn. Bạn có thể gặp trường hợp như thế trong kiến trúc microservice khi bạn muốn tạo một microservice mới để kết nối đến phần mềm mới của bên thứ 3.
Nó có thể hơi phức tạp để giữ 2 version khác nhau của cùng một ứng dụng trên hệ điều hành máy chủ. Trong trường hợp này, Docker có thể là một giải pháp hoàn hảo. Bạn sẽ có được môi trường được cô lập giúp cho ứng dụng của bạn và bên thứ 3
Đóng gói ứng dụng tiện dụng
Bạn có thể phân phối ứng dụng của mình trong một phần (trong container). Hầu hết các ngôn ngữ, framework và tất cả các hệ điều hành đều có trình quản lý package riêng. Và ngay cả khi ứng dụng của bạn có thể được đóng gói với trình quản lý package native, thì nó vẫn rất là khó để tạo một port cho hệ thống khác.
Docker đem đến cho bạn định dạng ảnh (image) thống nhất để chia ứng dụng của bạn trên hệ thống máy chủ và các dịch vụ cloud khác nhau. Bạn có thể phân phối ứng dụng của mình trong một phần với tất cả các dependency được yêu cầu (thư viện..), tất cả được đặt trong một image và sẵn sàng để chạy.
Hoạt động trên cùng một môi trường giống nhau trên máy local và server dev, staging, production.
Docker không thể đảm bảo giống nhau hoàn toàn 100% giữa các môi trường local / dev / staging / production, bởi vì sẽ luôn luôn có yếu tố con người tác động vào. Nhưng nó giảm xuống gần như bằng 0 khả năng xảy ra lỗi do phiên bản khác nhau của hệ điều hành, dependency hệ thống…
Với cách tiếp cận chính xác để xây dựng các Image của Docker, ứng dụng của bạn sẽ sử dụng cùng một image chuẩn với cùng một version hệ điều hành và các dependency được yêu cầu.
Monitor dễ dàng và rõ ràng
Bạn sẽ có một cách thống nhất để đọc các file log từ tất cả container đang chạy. Bạn không cần phải nhớ tất cả các đường dẫn xác định nơi mà các ứng dụng, các Dependency của nó lưu các file log và viết các tuỳ chỉnh móc vào để xử lý điều này. Bạn có thể tích hợp monitor và driver logging bên ngoài cho các file log của ứng dụng về một chỗ.
Dễ mở rộng
Ứng dụng được đóng gói chính xác sẽ bao hàm gần như toàn bộ 12 tiêu chí. Theo thiết kế, Docker bắt buộc bạn phải tuân theo các nguyên tắc cốt lõi của nó, chẳng hạn cấu hình trên các biến môi trường, giao tiếp qua các port TCP/UDP… Và nếu ứng dụng của bạn thực hiện chính xác, nó sẽ sẵn sàng mở rộng không chỉ trong Docker.
Các nền tảng được hỗ trợ
Nền tảng native của Docker là Linux, vì nó dựa trên các đặc điểm được cung cấp bởi Kernel Linux. Tuy nhiên, bạn vẫn có thể chạy Docker trên MacOS và Window. Chỉ có điều hơi khác một chút là trên Window và MacOS, Docker được đóng gói thành một máy ảo nhỏ. Ngày nay, Docker cho MacOS và Window đã đạt tới mức độ đầy ý nghĩa về khả năng sử dụng và cảm thấy giống một ứng dụng native.