Docker
Engineering · Lê Thành Chỉnh
# Bài học thực chiến: DOCKER --- ### 1. Phần Mở đầu: Bối cảnh & Nỗi đau **"Code chạy trên máy em ngon lành mà sao sang máy anh (hoặc lên server) lại...
Bài học thực chiến: DOCKER
1. Phần Mở đầu: Bối cảnh & Nỗi đau
"Code chạy trên máy em ngon lành mà sao sang máy anh (hoặc lên server) lại lỗi?"
Nếu bạn từng làm việc trong môi trường phần mềm, hoặc đơn giản là cài đặt một phần mềm/game phức tạp, bạn chắc chắn đã gặp "cơn ác mộng" này.
Hãy tưởng tượng: Bạn nấu một nồi phở cực ngon tại bếp nhà mình. Sếp bảo: "Mang nồi phở này sang bếp nhà khách hàng nấu lại y hệt nhé". Bạn xách nguyên liệu sang. Nhưng đến nơi thì: Bếp nhà khách dùng bếp từ (bạn dùng bếp gas), nồi của họ bé hơn, nước của họ nhiều Clo hơn... Kết quả: Nồi phở thất bại thảm hại dù công thức (code) vẫn thế.
Vấn đề ở đây là gì? Đó là sự thiếu đồng bộ về môi trường. Mỗi máy tính (của lập trình viên, của tester, server thật) đều có hệ điều hành, thư viện, và cấu hình khác nhau. Ngày xưa, để sửa việc này, đội kỹ thuật mất hàng giờ, thậm chí hàng ngày chỉ để "cài đặt môi trường" cho khớp nhau.
Tại sao bạn cần quan tâm đến Docker? Docker sinh ra để chấm dứt nỗi đau khổ này. Nó giúp bạn "đóng gói" cả cái bếp, nồi, nước, lửa cùng với công thức phở vào một cái hộp thần kỳ. Mang cái hộp đó đi đâu, mở ra là nấu được y hệt như ở nhà.
2. Phần Lý thuyết cốt lõi (20% Quan trọng nhất)
Định nghĩa đơn giản: Tư duy "Container Hàng Hóa"
Đừng nghĩ về công nghệ vội. Hãy nhìn ra cảng biển.
- Trước khi có Container: Người ta ném mọi thứ lên tàu: bao tải gạo, thùng rượu, xe hơi, đàn piano... Chúng va đập, khó xếp chồng, cái này đè bẹp cái kia. Việc bốc dỡ cực kỳ lâu.
- Sau khi có Container: Mọi thứ (dù là gạo hay xe hơi) đều được nhét vào các thùng sắt chữ nhật có kích thước chuẩn. Cần cẩu chỉ việc gắp thùng, tàu chỉ việc xếp thùng. Tàu không cần biết bên trong là gì, chỉ cần biết nó là cái thùng chuẩn.
Docker chính là công nghệ tạo ra các "Container" (thùng chứa) cho phần mềm. Thay vì cài phần mềm trực tiếp lên máy (như ném đồ lung tung lên tàu), Docker nhét phần mềm và tất cả những gì nó cần để chạy (thư viện, file cài đặt...) vào một cái Container cô lập.
[Image of shipping containers stacked on a cargo ship]
Nguyên lý hoạt động (Visual Thinking)
Hãy hình dung kiến trúc máy tính của bạn như một tòa nhà chung cư:
- Hạ tầng (Infrastructure): Là đất nền và móng nhà (Phần cứng máy tính).
- Hệ điều hành (Host OS): Là khung bê tông cốt thép của tòa nhà (Windows, MacOS, Linux).
- Docker Engine: Là người quản lý tòa nhà. Người này có nhiệm vụ chia nhỏ các phòng.
- Container: Là từng căn phòng khép kín.
- Trong phòng A (Container A) có thể đang mở tiệc nhạc Rock (Chạy ứng dụng Java).
- Trong phòng B (Container B) đang thiền (Chạy Database).
- Hai phòng này ở sát vách nhưng không ảnh hưởng gì đến nhau. Ông quản lý (Docker Engine) đảm bảo ông A không sang đập cửa ông B.
Các thuật ngữ "xương sống" (Phải nhớ)
Để làm việc với Docker, bạn chỉ cần hiểu đúng 3 khái niệm này thông qua phép ẩn dụ Nấu ăn:
| Thuật ngữ | Ẩn dụ đời thường | Giải thích kỹ thuật |
|---|---|---|
| Dockerfile | Tờ công thức nấu ăn | Một file văn bản chứa hướng dẫn từng bước để tạo ra một môi trường (Ví dụ: Bước 1: Lấy hệ điều hành Linux, Bước 2: Cài Python, Bước 3: Copy code vào...). |
| Docker Image | Cái khuôn đúc bánh | Là kết quả sau khi làm theo Dockerfile. Nó là một bản chụp (snapshot) tĩnh, không thay đổi. Bạn không thể "chạy" một cái Image, bạn chỉ dùng nó để đúc ra cái bánh. |
| Docker Container | Cái bánh thật (đang ăn) | Là phiên bản "sống" được tạo ra từ Image. Khi bạn ra lệnh "Chạy cái Image kia đi", bạn có một Container. Bạn có thể tạo ra 1000 cái Container giống hệt nhau từ 1 cái Image. |
| Docker Hub | Siêu thị / Chợ | Nơi mọi người chia sẻ các Image (khuôn bánh) của họ. Bạn lười tạo khuôn? Lên Docker Hub tải cái khuôn có sẵn của người khác về dùng. |
3. Phần Ứng dụng thực tế (80% Giá trị)
Docker không chỉ dành cho các kỹ sư cấp cao. Nó cực kỳ hữu dụng trong công việc hàng ngày.
Case Study 1: "Nhân viên mới" và ngày đầu tiên đi làm
- Bối cảnh: Nam là lập trình viên mới gia nhập công ty. Dự án của công ty rất lớn, dùng đủ thứ công nghệ: Database SQL, Web Server Nginx, Redis, Python 3.8...
- Nỗi đau (Cách cũ): Nam mất 3 ngày đầu tiên chỉ để cài đặt các phần mềm này lên máy cá nhân. Cài xong thì bị lỗi xung đột version (máy Nam có Python 3.9 nhưng dự án cần 3.8). Nam stress tột độ.
- Giải pháp Docker: Trưởng nhóm gửi cho Nam 1 file
docker-compose.yml. Nam chỉ cần gõ đúng 1 lệnh:docker-compose up. - Kết quả: Docker tự động tải và bật tất cả mọi thứ lên trong 15 phút. Nam bắt đầu code được ngay lập tức. Môi trường trên máy Nam giống hệt máy trưởng nhóm 100%.
Case Study 2: Dùng thử phần mềm mà không muốn làm "rác" máy
- Bối cảnh: Bạn là một Business Analyst (BA) hoặc Marketer. Bạn muốn dùng thử WordPress để làm web cá nhân, hoặc thử một công cụ quản lý dữ liệu mới.
- Nỗi đau: Bạn sợ cài vào máy làm nặng máy, cài xong không thích thì gỡ ra không sạch, để lại rác file hệ thống.
- Giải pháp Docker: Bạn lên Docker Hub, tìm Image của WordPress, gõ lệnh chạy.
- Kết quả: Bạn có một web WordPress chạy ngay lập tức. Dùng chán chê, bạn tắt Container và xóa nó đi. Máy tính của bạn sạch bong như chưa từng có gì xảy ra.
Case Study 3: Microservices (Chia nhỏ để trị)
- Bối cảnh: Một trang thương mại điện tử lớn (như Shopee/Lazada).
- Vấn đề: Nếu họ chạy tất cả trên một "cục" phần mềm khổng lồ. Khi tính năng "Giỏ hàng" bị lỗi, cả trang web sập, khách không xem hàng được luôn.
- Giải pháp Docker: Họ chia nhỏ web ra thành hàng nghìn Container: Container quản lý Giỏ hàng, Container quản lý Tìm kiếm, Container quản lý Thanh toán...
- Kết quả: Nếu Container "Giỏ hàng" bị lỗi, kỹ sư chỉ cần đập đi xây lại cái Container đó. Trong lúc đó, khách hàng vẫn tìm kiếm và xem sản phẩm bình thường (do Container Tìm kiếm vẫn sống).
Bảng Ưu/Nhược điểm thực chiến
| Đặc điểm | Ưu điểm (Lợi ích) | Nhược điểm (Thách thức) |
|---|---|---|
| Tốc độ | Khởi động trong vài giây (nhanh hơn máy ảo nhiều). | |
| Tính nhất quán | Chạy ở đâu cũng giống nhau (Dev = Test = Prod). | |
| Tiết kiệm | Tốn ít tài nguyên (RAM/CPU) hơn máy ảo truyền thống. | |
| Dữ liệu | Khó quản lý dữ liệu bền vững: Nếu lỡ tay xóa Container mà chưa cấu hình lưu trữ, dữ liệu bên trong mất sạch (như đập vỡ cái bánh thì nhân bánh cũng mất). | |
| Học tập | Cần thời gian để làm quen với các dòng lệnh (Command Line). |
4. Góc nhìn đa chiều
Hiểu lầm phổ biến
"Docker giống như máy ảo (Virtual Machine - VM) như VMware/VirtualBox?"
- Sai. Đây là hiểu lầm lớn nhất.
- Giải thích: Máy ảo (VM) giống như bạn xây một ngôi nhà hoàn chỉnh (có móng, tường riêng, điện nước riêng) trên một mảnh đất. Nó rất nặng nề (chiếm vài GB ổ cứng, khởi động lâu).
- Sự thật: Docker giống như bạn chia một căn hộ lớn thành nhiều phòng trọ vách ngăn thạch cao. Chung điện nước, chung móng (chung hệ điều hành máy chủ), nhưng vẫn riêng tư. Docker nhẹ hơn, nhanh hơn rất nhiều.
"Docker chỉ dành cho dân DevOps/System Admin?"
- Sai. Lập trình viên (Dev) dùng Docker hàng ngày để code. Tester dùng Docker để test. Thậm chí Data Analyst dùng Docker để chạy các môi trường phân tích dữ liệu phức tạp.
Cảnh báo (Lưu ý an toàn)
- Rủi ro bảo mật: Nếu bạn tải một Image lạ trên mạng về (từ nguồn không chính chủ trên Docker Hub), nó có thể chứa mã độc. Hãy tưởng tượng như bạn mua một lon đồ hộp không nhãn mác ngoài chợ đen về ăn vậy. -> Lời khuyên: Chỉ dùng Image có dán nhãn "Official" (Chính chủ) hoặc từ nguồn tin cậy.
- Đừng để Container "sinh sôi" vô tội vạ: Vì tạo Container quá dễ, đôi khi chúng ta tạo ra hàng trăm cái rồi quên tắt, khiến máy tính bị ngốn RAM kinh khủng.
5. Thực hành & Hành động (Làm ngay trong 30 phút)
Bạn không cần là coder siêu hạng để thử Docker. Hãy làm 3 bước sau để "sờ" vào công nghệ này:
- Cài đặt: Tải và cài đặt Docker Desktop (phiên bản cho Windows hoặc Mac). Đây là phần mềm có giao diện trực quan, rất dễ dùng.
- Chạy thử "Hello World":
- Mở Terminal (hoặc CMD/PowerShell).
- Gõ lệnh:
docker run hello-world - Hiện tượng: Docker sẽ tự tải image về và in ra dòng chữ chào mừng. Bạn đã chạy thành công Container đầu tiên!
- Thử một Web Server:
- Gõ lệnh:
docker run -d -p 8080:80 nginx - Mở trình duyệt web, vào địa chỉ:
localhost:8080. - Hiện tượng: Bạn sẽ thấy dòng chữ "Welcome to nginx!". Chúc mừng, bạn vừa biến máy tính mình thành một Web Server chỉ trong 1 dòng lệnh!
- Gõ lệnh:
6. Tổng kết & Kiểm tra
Tóm tắt 3 điểm cốt lõi (Take-away):
- Docker là "Cặp lồng cơm": Đóng gói đồ ăn (code) và thìa dĩa (thư viện) vào một hộp. Mang đi đâu ăn cũng ngon như ở nhà, không lo thiếu đồ.
- Khác biệt với Máy ảo: Docker nhẹ hơn, nhanh hơn vì dùng chung hệ điều hành (như chia phòng trọ thay vì xây nhà riêng).
- Lợi ích lớn nhất: Xóa bỏ câu nói "Tại máy em chạy được mà sang máy anh lại lỗi".
Câu hỏi kiểm tra tư duy:
- Tình huống: Bạn đang code một ứng dụng dùng Python 3. Sếp yêu cầu bạn test thử xem ứng dụng có chạy được trên Python 2 không. Nếu không dùng Docker, bạn phải làm gì? Nếu dùng Docker, bạn làm gì?
- So sánh: Tại sao nói Docker Image giống như "Khuôn bánh", còn Container giống như "Cái bánh"?
- Tư duy: Nếu máy tính của bạn (Host OS) bị hỏng/lỗi Win, các Container bên trong có chạy được không? Tại sao?
- Thực tế: Bạn xóa một Container đi, sau đó tạo lại một Container mới từ cùng một Image cũ. Dữ liệu bạn đã nhập trong Container cũ còn hay mất? (Gợi ý: Nhớ lại phần Nhược điểm).
- Ứng dụng: Theo bạn, một người làm nghề Phân tích dữ liệu (Data Analyst) thì dùng Docker để làm gì?
Bạn hãy để lại câu trả lời cho phần bài tập dưới phần bình luận nhé!