Docker là một trong những requirement xuất hiện liên tục trong những JD tuyển dụng backend developer trong những năm gần đây. Rồi nào là DevOps rồi SRE, CI/CD đều cần phải biết Docker. Qua bài viết này mình hy vọng sẽ giúp các bạn hiểu được một chút về Docker và lý do tại sao lại cần nó như thế.
Docker là gì?
Docker là một nền tảng mở để phát triển và triển khai ứng dụng dễ dàng hơn bằng cách sử dụng các “container”. Qua đó, Docker giúp các nhà phát triển có thể dễ dàng phân tách được ứng dụng khỏi sự lệ thuộc với hạ tầng (phần cứng máy chủ, mạng, ổ đĩa,…)
Docker hiện tại là mã nguồn mở với Golang là ngôn ngữ chính. Chi tiết tại: https://github.com/docker
Khi chưa có Docker
Thay vì cứ đi tìm hiểu Docker thì có lẽ mình sẽ kể các bạn nghe từ khá lâu rồi, khi Docker chưa thịnh hành và phổ biến. Lúc đó, mình còn là sinh viên ngành IT, cứ mỗi một môn là mình sẽ theo chỉ dẫn của các thầy cô cài đặt các phần mềm vào máy tính cá nhân. Có cái phù hợp có cái không phù hợp, thậm chí có cái các bạn phải cài thêm cả OS mới vào, có cái thì lại cần format lại ổ cứng.
Có khá nhiều cách để chúng ta giải quyết chuyện này. Hoặc tạo hẳn phân vùng ổ cứng mới rồi cài OS cần thiết cùng các phần mềm hoặc dùng qua một hệ thống ảo hoá (VMWare hoặc Virtual Box).
Nhưng dù có dùng cách nào thì mình cũng mất rất nhiều thời gian để nghĩ xem là cấp bao nhiêu RAM, số core CPU và ổ cứng. Cấp ít quá thì nó không đủ dùng mà cấp nhiều quá thì lãng phí.
Các công cụ ảo hoá giúp mình làm tốt hơn vì có thể dễ dàng cấu hình lại mà không cần cài đặt lại từ đầu. Nhưng nhìn chung thì chúng đều mất thời gian để setup, cấu hình và tinh chỉnh. Ước gì mọi thứ có thể tự động thì tốt quá.
Docker thời đó xuất hiện như một vị thần! Đó là lời giải không thể tuyệt vời hơn.
Docker hoạt động ra sao?
Docker nổi tiếng với việc điều hành và quản lý “ảo hoá” các Container. Nhưng thực tế là công nghệ container đã có từ khá lâu, nổi tiếng có LinuX Containers (Docker sử dụng trong giai đoạn đầu).
Sau đó Docker đã phát triển và tách hẳn phần lõi container là containerd. Điều khiến Docker phát triển rực rỡ là các thành phần và công cụ hỗ trợ để giúp các nhà phát triển sử dụng Container nhanh chóng, dễ dàng và an toàn hơn.
Nói ngắn gọn thì Container là tất cả những gì cần thiết để một ứng dụng, một service có thể chạy lên được mà chúng không cần phải lo lắng về hệ điều hành (OS), loại ổ đĩa (disk) và những thư viện có liên quan. Khi không còn nhu cầu sử dụng, ta có thể “bứng” cái container đó đi là xong.
- Docker Engine : là thành phần chính của Docker, đây có thể được xem là một “công xưởng” để hỗ trợ đóng gói và vận hành các ứng dụng thông qua các container.
- Docker Hub : là một cái… hub, chuyên chứa tất cả các images Docker. Các image này được build và đóng gói sẵn bởi rất nhiều nhà phát triển trên thế giới.
- Images: là một khuôn mẫu để chạy lên thành container. Có thể hình dung image như một cái đĩa game, bạn muốn cài đặt thì phải có cái đĩa này, thậm chí chia sẻ cho nhiều máy khác cài đặt nữa.
- Container: image khi run lên sẽ là container, chúng ta có thể có nhiều container chạy cùng lúc từ một image.
- Docker Client: là nơi chúng ta có thể giao tiếp với Docker thông qua các câu lệnh (Docker CLI).
- Docker Daemon: là một service chạy ngầm, tiếp nhận tất cả yêu cầu từ Docker Client để quản lý các đối tượng như Container, Image, Network và Volumes. Các Docker Daemon cũng giao tiếp với nhau để quản lý các Docker Service.
- Dockerfile: là một file bao gồm các chỉ dẫn để build một image.
- Volumes: là cơ chế lưu trữ dữ liệu khi các container vận hành.
Mình sẽ bổ sung thêm các bài viết về các thành phần chi tiết Docker sau nhé. Ở trên chỉ giới thiệu đại khái chức năng của chúng nhé.
Nên dùng Docker khi nào?
- Phát triển các ứng dụng, dịch vụ yêu cầu cài đặt quá nhiều thứ liên quan, hoặc có version không tương thích với máy chủ hiện tại.
- Khi có nhu cầu scale, mở rộng linh hoạt để đáp ứng nhanh. VD như bật/tắt nhanh các container để hỗ trợ tăng tải cho hệ thống của bạn.
- Rất phù hợp với Microservices. Mình chắc chắn rằng bạn sẽ không muốn chạy từng service nhỏ lên và cấu hình chúng bằng tay.
- Tăng tốc, hỗ trợ CI/CD tốt hơn. Vì lúc này automation server chỉ cần quan tâm Docker thay vì lại phải cài đặt đủ thứ vào.
- Dễ thay đổi, di chuyển hơn vì mọi thứ ở trong container. Bản thân Docker vẫn có version control cho các Image, từ đó dễ dàng up/down version ứng dụng hơn.
- An toàn hơn vì mỗi container là một môi trường hoàn toàn độc lập với bên ngoài.
Lời kết
Mình hy vọng đã giúp các bạn hiểu hơn phần nào về Docker và cách chạy container cơ bản. Những bài viết sau mình sẽ hướng dẫn những thứ hay ho hơn về Docker nhé!
Khóa học Docker chi tiết và miễn phí tại đây : https://freestudy247.com/courses/docker-from-zero-to-hero-become-a-devops-docker-master/