Docker bùng nổ vào năm 2013 và kể từ đó nó tạo ra cơn sốt khắp vòng tròn CNTT. Giải pháp dựa trên công nghệ container do Docker cung cấp hoàn toàn thay đổi cách hoạt động IT được thực hiện.
Trong blog này, chúng tôi sẽ giải mã một trong những công nghệ nóng hổi nhất trong pipeline DevOps (Development Operation) ngày nay.
Tại sao Docker được hype (quảng cáo nhiều)?
Giả sử, bạn đã xây dựng một ứng dụng chạy tuyệt vời trên máy phát triển (development machine) sau đó bạn triển khai (deploy) nó lên máy QA hoặc máy production (sản xuất) & bỗng nhiên nó không chạy được ở đó. Tại sao? Các công ty lớn dùng công nghệ dựa trên container để chạy kinh doanh, họ triển khai hơn 2 tỷ container qua trung tâm dữ liệu mỗi tuần vì nó giúp với tích hợp liên tục (continuous integration), giao hàng liên tục (delivery), tính di động (portability) & khả năng mở rộng (scalability) của ứng dụng. Vậy tại sao container bỗng nhiên phổ biến, đâu, Docker chính là lý do.
Công nghệ Docker trở thành đề tài bàn tán vì nó giúp xây dựng bất kỳ ứng dụng nào bằng bất kỳ ngôn ngữ nào dùng bất kỳ stack nào để chạy ở bất kỳ đâu trên bất cứ thứ gì. Nó cơ bản giúp lập trình viên giảm phụ thuộc vào các thành phần khác nhau để chạy một phần mềm cụ thể. Như trường hợp trên, ứng dụng chạy trên máy dev nhưng dừng phản ứng khi triển khai môi trường khác, Docker tỏa sáng ở đây giải quyết vấn đề bằng cách cung cấp giải pháp đóng gói (pack), vận chuyển (ship) và chạy (run) bất kỳ ứng dụng nào như một container tự đủ (self-sufficient container) có thể chạy gần như ở bất kỳ đâu, bất kể môi trường nào.
Công nghệ này siêu hot và nó sẽ đóng vai trò lớn trong tương lai của Phát triển Phần mềm (Software Development).
Docker là gì?
Docker là công nghệ dựa trên container mã nguồn mở (open-source). Nó cơ bản tách ứng dụng khỏi hệ điều hành (OS) nền tảng nó chạy trên, chính xác như Máy ảo (Virtual Machines - VM) tách OS khỏi phần cứng nền tảng nó chạy trên.
Chưa tin?
OK, vậy dùng Docker, bạn có thể xây dựng các ứng dụng khác nhau và chạy chúng trên máy khác nhau hoặc máy tính khác nhau hoặc host khác nhau và làm cho chúng giao tiếp theo cách hiệu quả & hiệu suất.
Tiêu chuẩn ngành thường dùng Máy ảo (VM) để chạy ứng dụng phần mềm, nhưng hôm nay container đang lấy đà trong thế giới CNTT và giảm gánh nặng cho lập trình viên. Làm thế nào?
Vì nó là dự án mã nguồn mở cho phép bạn tích lũy và lưu trữ mã của bạn cộng với cấu hình hoặc phụ thuộc (dependencies) vào một gói gọn gàng - một container, qua đó bạn có thể dễ dàng tạo, triển khai và chạy nhiều ứng dụng trên một server.
Máy ảo (Virtual Machines - VM) là gì?
Máy ảo mô phỏng một hệ thống máy tính gồm RAM, bộ xử lý, v.v. Bên cạnh việc thể hiện đặc điểm như máy tính vật lý, nó cung cấp chức năng chạy OS và ứng dụng khác nhau trên nó. Cấu hình và tài nguyên được hỗ trợ bởi tài nguyên vật lý của hệ thống host (host system). Máy ảo còn được gọi là Guest (Khách) và OS chạy trên chúng gọi là Guest OS. Hệ thống mà máy ảo chạy trên đó gọi là host system.
Docker Containers là gì?
Trước khi bắt đầu "Docker hoạt động như thế nào?", bạn cần làm rõ khái niệm container. Container có thể đơn giản hóa như giải pháp cho vấn đề chạy phần mềm tin cậy khi di chuyển từ môi trường tính toán này sang môi trường khác. Một container bao gồm một ứng dụng, các phụ thuộc, thư viện, file nhị phân (binaries) và các file cấu hình khác cần thiết để chạy phần mềm. Mọi thứ được gói gọn vào một gói. Bằng cách đó, lập trình viên có thể yên tâm ứng dụng sẽ chạy trên bất cứ thứ gì & bất cứ đâu.
Docker Containers làm cho quy trình chạy ứng dụng trên server trở nên rất dễ dàng. Với container dựa trên docker, bạn cơ bản có thể giảm thời gian triển khai xuống giây vì các container này có khả năng làm việc trên các phần của ứng dụng, nghĩa là, nếu cần sửa chữa hoặc cập nhật bất kỳ phần nào trong ứng dụng, với Docker container bạn không cần tắt toàn bộ ứng dụng, thay vào đó bạn có thể làm việc độc lập trên một phần của ứng dụng.
Docker vs. Máy ảo (Virtual Machines)
Cả Docker container và Máy ảo đều có lợi ích cô lập (isolation) và phân bổ tài nguyên (resource allocation) tương tự. Nhưng vẫn vậy, cả hai hoạt động khác nhau và có ưu điểm riêng. Hãy thử hiểu trường hợp dùng tiềm năng cho cả hai và cái nào thắng cái nào.
- Xét về dễ sử dụng, VM cho chúng ta giao diện đồ họa đầy đủ (full flash Graphical interface) của chính xác một hệ điều hành. Công cụ liên quan đến VM đơn giản hơn để truy cập và làm việc. Docker có hệ sinh thái phức tạp và đòi hỏi thích nghi với giao diện dòng lệnh (Command line interface).
- Bên cạnh dễ dùng, Docker thắng thế ở mọi trường hợp dùng từ bây giờ. Docker container không yêu cầu hypervisor phần cứng để chạy. Docker engine ở đây thực hiện tiện ích của hypervisor và có thể chạy nhiều container trên nó. Khác với VM, Docker container cần ít tài nguyên hơn nhiều để vận hành.
- Docker container nhỏ gọn, nhẹ và nhanh hơn rất nhiều so với VM. VM cần thời gian đáng kể để boot và sẵn sàng thiết bị. Container chỉ mất vài microsecond để khởi động từ container image.
- Docker container mã nguồn mở di động hơn nhiều trong pipeline phát triển. Tính năng nhỏ gọn và di động giúp dễ dàng chia sẻ cho nhiều thành viên đội nhóm để phát triển song song (parallel development).
- Docker đã giảm việc dùng VM trong các tập đoàn lớn nhờ lợi ích nhanh nhạy (agile) như tốc độ và hiệu quả. Không đúng nói VM sẽ biến mất một ngày, mà chúng sẽ làm việc song song với Docker.
Quy trình làm việc của Docker (Docker's Workflow)?
Cách dễ nhất giải thích ý tưởng đằng sau công nghệ Docker là đi qua cách nó hoạt động.
Chúng tôi sẽ giải thích hoạt động của nó dùng Docker Hub vì nó là nơi tin cậy nhất.
Bắt đầu với Docker:
- Truy cập link Docker Hub: https://hub.docker.com/
- Khi bạn đến trang chính, hoặc bạn tạo Docker ID miễn phí riêng hoặc bạn chỉ khám phá các docker image khác nhau & kéo (pull) những gói nhẹ đó theo yêu cầu.
Docker Image
Docker image dùng để khởi chạy container. Chúng ta có thể tạo image tùy chỉnh riêng. Chúng nhẹ giúp tăng khả năng tái sử dụng và giảm dùng ổ đĩa.
Docker Container
Chúng ta khởi chạy container bằng cách kéo docker image từ Docker Hub. Chúng ta có thể gói các ứng dụng khác nhau trong các container khác nhau, theo yêu cầu.
Docker Hub cung cấp Docker Store để khám phá Nội dung Docker Công cộng (Public Docker Content), nơi bạn có thể khám phá container phổ biến, plugin & các phiên bản docker.
Docker Repositories (Kho lưu trữ Docker)
Docker Repositories giúp bạn quản lý image của bạn ở một nơi. Các kho này có thể công khai (public) hoặc riêng tư (private). Kho công khai có thể chia sẻ với mọi người tại cộng đồng Docker build. Và kho riêng tư có thể chia sẻ với đồng nghiệp cho phát triển song song.
Bạn sẽ tìm thấy tùy chọn làm cho nó Công khai hoặc Riêng tư hoặc Xóa trong Menu Settings (Cài đặt).
Docker File
Dockerfile là tài liệu văn bản chứa hướng dẫn & lệnh về cách container sẽ được hình thành. Thêm vào đó, Docker engine đọc các docker file này và xây dựng container theo hướng dẫn trong Dockerfile.
Ưu điểm của việc dùng Docker
Hãy khám phá ưu điểm hàng đầu của Docker & hiểu tại sao các công ty lớn nhấn mạnh dùng Docker:
1. Môi trường phát triển tách biệt (Segregated development environment)
Docker cung cấp môi trường tách biệt cho tất cả ứng dụng và tài nguyên. Mỗi container có tài nguyên riêng tách biệt khỏi nhau. Nếu không còn cần container thì tất cả tài nguyên của nó có thể giải phóng chỉ bằng cách xóa nó. Các tài nguyên này có thể phân bổ lại cho container khác. Khi container bị xóa, Docker đảm bảo xóa sạch bằng cách xóa tất cả file host và cấu hình. Mỗi ứng dụng có container riêng chạy trên stack tách biệt hoàn toàn. Docker gán tài nguyên cho ứng dụng và đảm bảo mỗi ứng dụng chỉ dùng tài nguyên được phân bổ cho nó. Điều này giúp duy trì uptime của tất cả ứng dụng tránh giảm hiệu suất.
2. Triển khai tức thì (Instant deployments)
Sử dụng nền tảng container hóa giảm thời gian triển khai xuống giây vì loại bỏ nhu cầu boot OS. Nền tảng này có khả năng quản lý tải công việc di động cao với tài nguyên tối thiểu. Nó có thể chạy động trên hệ thống cục bộ, máy ảo chạy tại trung tâm dữ liệu, server đám mây hoặc sự kết hợp của các môi trường này.
3. Phát triển nhanh và giao hàng ứng dụng nhất quán (Rapid development and consistent deliveries of applications)
Docker tự xử lý tất cả cấu hình nội bộ và phụ thuộc, giảm thiểu nhu cầu can thiệp thủ công trong suốt quá trình phát triển.
Docker bên cạnh cung cấp sự cô lập cho các ứng dụng khác nhau cũng cung cấp tích hợp hiệu quả giữa tất cả ứng dụng này. Tích hợp liên tục (Continuous integration) chịu trách nhiệm giao hàng ứng dụng nhất quán.
4. Kiểm tra liên tục và kiểm soát phiên bản (Constant testing and version control)
Nền tảng dựa trên container là môi trường đồng nhất (homogenous environment) từ production (sản xuất) đến testing (kiểm thử) và QA. Container dùng cho production có thể dùng thêm bởi đội kiểm thử. Điều này đảm bảo kiểm tra liên tục khi nhiều luồng của tổ chức muốn làm việc song song.
Ví dụ,
• Lập trình viên phát triển mã trên hệ thống bản địa và phân phối container cho đội kiểm thử và QA.
• Đội kiểm thử kéo container và tìm một số vấn đề.
• Họ sửa lỗi và vấn đề và thực hiện kiểm tra verification và validation.
• Khi hoàn tất quy trình kiểm thử, cùng image được đẩy (push) trở lại môi trường production.
Một trong những lợi ích chính của dùng nền tảng container cho production ứng dụng là kiểm soát phiên bản (version-control). Container theo dõi thay đổi đối với mọi file hoặc tập file trong nó để người dùng có thể gọi lại phiên bản cụ thể sau.
Điều này giúp trong trường hợp cần nâng cấp sản phẩm giữa chu kỳ phát hành sản phẩm. Thay đổi cần thiết có thể làm cho docker container, kiểm tra chúng và triển khai trong container hiện có. Nếu nâng cấp làm hỏng toàn bộ môi trường, bạn có thể dễ dàng rollback (quay lại) phiên bản trước.
5. Giảm nhu cầu phần cứng chuyên dụng cho mỗi ứng dụng (Mitigating the need of a dedicated hardware for every application)
Docker container là nhẹ và nhanh - lựa chọn thay thế cho máy ảo dựa trên hypervisor. Máy ảo cần hypervisor như Virtualbox để chạy ứng dụng khác nhau trong khi nhiều container có thể lưu trữ trên một docker engine mà không cần hypervisor.
Container là lựa chọn thay thế tuyệt vời cho triển khai nhỏ và trung bình với ít tài nguyên.
6. Đa nền tảng (Multi-platform)
Docker container mã nguồn mở có tính di động cao. Gần như tất cả nhà cung cấp đám mây lớn như Amazon Web Services (AWS), Google Cloud Platform (GCP), Microsoft Azure và OpenStack đã nhúng hỗ trợ docker như chức năng tích hợp sẵn.
Docker ban đầu chỉ hướng tới Linux đến mùa thu 2016, sau đó được giới thiệu cho Windows. Ngay sau khi giới thiệu cho Windows, các nhà phát triển đã tổng quát hóa công cụ, API và định dạng image cho cả Linux và Windows để phát triển hétérogènes (heterogeneous development).
7. Hiệu quả chi phí cho tổ chức cấp doanh nghiệp (Cost-efficient for industry-level organizations)
Return-on-Investments (ROI - Tỷ suất hoàn vốn) là nguyên tắc quản trị quan trọng nhất cho mọi công ty thành lập. Giải pháp tối ưu nhất là cái giảm chi phí đồng thời tăng lợi nhuận. Tổ chức càng lớn, càng cần tài nguyên cơ sở hạ tầng cho production.
Docker tạo hiệu quả chi phí bằng cách giảm nhu cầu tài nguyên cơ sở hạ tầng cho production. Docker cũng giảm chi phí server và nhân lực bảo trì chúng. Nó giúp tổ chức tạo doanh thu ổn định lâu dài.
8. Bảo mật và Độ tin cậy (Security and Reliability)
Vì Docker container mã nguồn mở tách biệt khỏi nhau, nó cấp quyền kiểm soát hoàn toàn cho người dùng luồng traffic và quản lý. Một container không thể nhìn vào quy trình chạy trên container khác.
Bên cạnh cơ chế bảo mật mặc định, nhiều công cụ bảo mật và plugin có sẵn trên thị trường. Image scanner như Claire dùng để bảo vệ container image bên trong docker registries.
Cuộc cách mạng ảo hóa đã bùng nổ trong ngành doanh nghiệp. Nó có thể có nhược điểm khi chuyển sang môi trường ảo nhưng có lợi ích nhiều từ tiết kiệm tiền đến duy trì tính liên tục kinh doanh. Docker là một trong những phát minh tiên phong của cuộc cách mạng ảo hóa này.