Một phần mềm chạy hoàn hảo trên máy người lập trình, nhưng đưa sang máy chủ lại lỗi hàng loạt. Đây là tình huống kinh điển trong ngành phần mềm, và nguyên nhân gần như luôn là sự chênh lệch môi trường: hai máy cài phiên bản khác nhau, hoặc một máy thiếu thành phần mà máy kia có. Vấn đề không nằm ở code, mà ở chỗ code được mang đi mà không mang theo môi trường nó cần.
Docker giải quyết tận gốc vấn đề này. Vậy chính xác thì Docker là gì? Đó là một nền tảng đóng gói phần mềm cùng toàn bộ môi trường chạy của nó vào một đơn vị khép kín gọi là container, để phần mềm hoạt động giống hệt nhau ở mọi nơi. Bài viết này giải thích Docker là gì và hoạt động ra sao theo cách dễ hình dung, đồng thời chỉ rõ khi nào nên dùng và khi nào không.
Contents
Để hiểu Docker, bạn cần hiểu container trước. Container là một gói chứa phần mềm cùng mọi thứ phần mềm đó cần để chạy: thư viện, công cụ đi kèm và các thiết lập cấu hình. Bình thường, một phần mềm khi chuyển sang máy khác có thể lỗi vì máy đó thiếu thư viện hoặc cài sai phiên bản. Container gộp sẵn tất cả những thứ đó vào một gói, nên phần mềm bên trong chạy giống hệt nhau trên mọi máy, miễn máy đó có cài Docker.
Docker đơn giản là nền tảng để tạo ra và chạy các container.
Cách hình dung dễ nhất là mượn đúng hình ảnh ngành vận tải biển, nơi Docker lấy cảm hứng cho cái tên và logo con cá voi chở thùng hàng. Trong ngành đó, người ta đóng mọi loại hàng vào những thùng container tiêu chuẩn giống nhau, để bất kỳ con tàu, cần cẩu hay xe tải nào cũng xử lý được mà không cần quan tâm bên trong là gì. Docker làm đúng vậy với phần mềm: đóng gói nó theo một chuẩn chung để mọi máy chủ đều chạy được như nhau.
Nhiều người liên tưởng container với máy ảo, vì cả hai đều tạo ra một môi trường riêng. Khác biệt cốt lõi nằm ở độ nặng. Máy ảo phải cài và chạy nguyên một hệ điều hành riêng cho mỗi phần mềm, nên chiếm hàng gigabyte và mất vài phút mới khởi động. Container thì dùng chung phần lõi hệ điều hành (kernel) của máy chủ thay vì dựng lại từ đầu, chỉ đóng gói đúng phần thuộc về phần mềm (Wiz). Kết quả: nó đo dung lượng bằng megabyte, khởi động trong vài giây, và một máy chủ chứa được hàng chục container ở chỗ chỉ đủ cho vài máy ảo.
Ở chỗ này có một điểm người mới hay hiểu sai: trên Mac và Windows, container không chạy trực tiếp trên máy bạn, vì cơ chế của nó vốn dành cho Linux. Docker tự chạy ngầm một máy ảo Linux gọn nhẹ bên dưới (trên Windows là WSL 2, lý do bạn được yêu cầu bật nó khi cài). Bạn không cần đụng tới lớp này, chỉ cần biết nó tồn tại.
Sự gọn nhẹ này có cái giá của nó. Vì dùng chung kernel, các container cô lập không kín bằng máy ảo, vốn tách biệt hoàn toàn ở tầng phần cứng (Northflank). Với phần mềm bạn tự kiểm soát thì đủ; nhưng khi phải chạy mã nguồn lạ không tin tưởng được, máy ảo vẫn an toàn hơn.
Bảng dưới tóm tắt khác biệt theo từng tiêu chí:


Khi làm việc với Docker, bạn sẽ gặp vài thuật ngữ, nhưng tất cả đều nằm trong một quy trình duy nhất: tạo ra container rồi chạy nó. Bạn không cần thuộc lòng, chỉ cần nắm vai trò từng cái.
Năm thành phần quan trọng nhất bao gồm:

Docker đưa phần mềm từ công thức đến lúc chạy thật qua ba bước: build, push/pull và run, cụ thể như sau:
Đầu tiên, lập trình viên viết Dockerfile (công thức), rồi ra lệnh cho Docker “build”. Docker thực thi từng bước trong công thức và đóng gói kết quả thành một image, chứa sẵn toàn bộ phần mềm cùng môi trường, không thiếu thành phần nào.
Giá trị của image nằm ở tính cố định của nó. Build lại từ cùng một Dockerfile hôm nay hay một năm sau, bạn vẫn nhận đúng một kết quả. Chính sự bất biến này là nền tảng cho lời hứa “chạy ở đâu cũng giống nhau” của Docker.
Có image rồi, bạn “push” (đẩy) nó lên một kho lưu trữ như Docker Hub, và bất kỳ ai được cấp quyền đều “pull” (kéo) về máy họ. Đây là cách cả nhóm dùng chung đúng một image.
Nhờ vậy, đồng nghiệp ở xa hay máy chủ phục vụ khách đều nhận đúng image bạn đã build, không phải tự dựng lại môi trường. Một bản cập nhật đẩy lên là cả nhóm có ngay, thay vì kèm theo hướng dẫn cài đặt dài dòng. Với image nội bộ cần bảo mật, bạn dùng kho riêng (private registry) thay cho kho công khai – một cách bảo vệ dữ liệu tương tự lý do nhiều nhóm chọn VPN cho hệ thống nội bộ.
Cuối cùng, bạn ra lệnh “run” để Docker biến image thành một container đang chạy, thường chỉ mất vài giây. Lúc này phần mềm mới thực sự hoạt động và phục vụ người dùng.
Một sản phẩm thực tế thường gồm nhiều thành phần chạy song song: giao diện, cơ sở dữ liệu, bộ nhớ đệm. Khởi chạy từng cái thủ công vừa mất thời gian vừa dễ sai sót. Đây chính là lúc Docker Compose phát huy, gom toàn bộ cấu hình vào một tập tin và bật cả cụm bằng một lệnh duy nhất, với đúng kết nối giữa các thành phần – bao gồm cả cách các container giao tiếp qua network nội bộ.

Docker phổ biến vì giải quyết đúng ba bài toán mà tốc độ phát triển phần mềm hiện đại đòi hỏi, và cả ba đều bắt nguồn từ một đặc tính: container vừa nhẹ vừa bất biến.
Ba giá trị cốt lõi:
Cộng lại, Docker thay đổi cách cả nhóm làm việc: thay vì mất nhiều ngày dựng và sửa môi trường, họ dồn thời gian vào việc thực sự tạo ra sản phẩm.
Trên Windows và macOS, bạn cài Docker Desktop, ứng dụng có giao diện đồ họa trực quan để quản lý container. Các bước như sau:
Trên máy chủ Linux, cách nhanh nhất là cài qua dòng lệnh, thường dưới năm phút. Đây cũng là cách phổ biến nhất cho máy chủ vận hành thực tế:
Cài xong, dù ở nền tảng nào, hãy chạy lệnh docker run hello-world để kiểm tra. Nếu nó hiện ra thông báo chào, nghĩa là Docker đã sẵn sàng.
Một lưu ý về chi phí trước khi triển khai diện rộng: Docker Desktop miễn phí cho cá nhân, dự án mã nguồn mở, và công ty dưới 250 nhân viên kèm dưới 10 triệu USD doanh thu/năm; vượt ngưỡng đó phải mua gói trả phí (Docker). Bản thân Docker Engine trên Linux thì miễn phí, nên nhiều server production dùng thẳng Engine mà không cần Desktop.
Khi đã quen, bạn sẽ làm việc với Docker chủ yếu qua vài câu lệnh ngắn. Bảng dưới là những lệnh hay dùng nhất, để bạn tham khảo khi cần. Người mới chưa cần nhớ hết, cứ xem nó như một bảng tra cứu:
|
Nhóm |
Lệnh mẫu |
Tác dụng |
|
Image |
docker pull [tên_image] |
Tải một image từ kho về máy |
|
Image |
docker build -t [tên] . |
Build code hiện tại thành một image mới |
|
Image |
docker images |
Liệt kê các image đang lưu trên máy |
|
Container |
docker run [tên_image] |
Khởi tạo và chạy container từ một image |
|
Container |
docker ps |
Liệt kê các container đang chạy |
|
Container |
docker stop [id] |
Dừng an toàn một container |
|
Container |
docker rm [id] |
Xóa một container đã dừng |
|
Container |
docker exec -it [id] bash |
Vào bên trong một container đang chạy |
|
Container |
docker logs [id] |
Xem log hoạt động và lỗi để gỡ rối |
|
Dọn dẹp |
docker system prune |
Xóa file rác và container không dùng để giải phóng ổ cứng |
|
Compose |
docker compose up |
Khởi động cả cụm container theo file cấu hình |
|
Compose |
docker compose down |
Tắt và gỡ toàn bộ cụm container |
Khi một container chạy sai, hai lệnh bạn sẽ dùng nhiều nhất là docker logs và docker exec. docker logs cho bạn xem nhật ký lỗi container ghi lại, còn docker exec đưa bạn vào bên trong container đang chạy để kiểm tra trực tiếp. Quen hai lệnh này trước, phần còn lại tra bảng khi cần.
Ban đầu bạn thử Docker trên máy cá nhân, nhưng để phục vụ người dùng thật, bạn cần một máy chủ chạy liên tục, tức là cần một dịch vụ hosting hoặc máy chủ ảo (VPS) thực sự. Có hai hướng, tùy vào việc nhóm bạn có sẵn kỹ năng quản trị máy chủ hay không:
Docker rất mạnh nhưng không phải giải pháp cho mọi bài toán, và dùng sai chỗ chỉ tốn công thiết lập. Quy tắc đơn giản: nó phù hợp nhất với phần mềm chạy nền (website, dịch vụ mạng) và cần vận hành đồng nhất ở nhiều nơi.
Nên dùng Docker khi:
Nên chọn giải pháp khác khi:
Lời khuyên thẳng: nếu lý do bạn cân nhắc Docker là đồng nhất môi trường hoặc mở rộng nhanh, gần như chắc chắn nên dùng. Nếu lý do là cô lập bảo mật để chạy mã nguồn lạ, hãy cân nhắc máy ảo trước.
Tóm lại, điều Docker thay đổi rất đơn giản mà có sức ảnh hưởng lớn: thay vì phải dựng lại môi trường trên mỗi máy, giờ cả môi trường được đóng gói đi cùng phần mềm. Nhờ đó nỗi ám ảnh “máy tôi chạy được mà” chấm dứt, và thời gian trước đây tiêu tốn vào việc dựng và sửa môi trường được dồn cho việc tạo ra sản phẩm. Đây chính là lý do container trở thành tiêu chuẩn phân phối phần mềm hiện nay.
Docker Engine và phiên bản Docker Personal miễn phí cho cá nhân, dự án mã nguồn mở, và công ty dưới 250 nhân viên kèm dưới 10 triệu USD doanh thu/năm. Vượt ngưỡng đó, bạn cần gói trả phí (Pro, Team hoặc Business) để dùng Docker Desktop.
Có. Bạn cài ứng dụng Docker Desktop và bật một thành phần tên WSL 2 trong lần đầu (chỉ cần làm theo lời nhắc). Sau đó Docker chạy mượt trên Windows, dùng hằng ngày không vướng gì.
Khác biệt cốt lõi là cách dùng hệ điều hành. Máy ảo chạy một hệ điều hành riêng đầy đủ cho mỗi phần mềm, nên nặng và khởi động chậm. Container dùng chung lõi hệ điều hành (kernel) của máy chủ, nên nhẹ và khởi động trong vài giây. Đổi lại, container cô lập không kín bằng máy ảo.
Phần cơ bản khá dễ tiếp cận, bạn chỉ cần vài buổi để quen với vài thao tác chính. Nếu đã có chút kiến thức về máy tính và máy chủ thì học nhanh hơn, nhưng không bắt buộc phải biết trước gì nhiều để bắt đầu.
Học Docker trước. Bạn phải biết đóng gói và chạy một container đã, rồi mới điều phối được hàng trăm container. Kubernetes là công cụ điều phối nâng cao, dùng khi hệ thống lớn vượt khả năng quản lý thủ công của Docker Compose.
Dùng được cho production, và đang là chuẩn phổ biến. Rất nhiều công ty công nghệ lớn chạy container trên hệ thống thật mỗi ngày, với khả năng tự khởi động lại khi gặp lỗi. Môi trường dev chỉ là bước đầu trong toàn bộ vòng đời sản phẩm.
Image là bản đóng gói cố định, chứa sẵn phần mềm và môi trường nhưng nằm yên, chưa chạy. Container là một image đang chạy thực tế. Từ một image, bạn tạo ra được nhiều container giống hệt nhau, mỗi cái xử lý dữ liệu riêng mà không ảnh hưởng nhau.