Đóng gói và chạy ứng dụng

Docker

Chấm dứt câu "máy tôi chạy được mà" giữa các thành viên trong đội

Trên máy tôi vẫn chạy bình thường mà — câu than quen thuộc này là bài toán mà Docker sinh ra để xoá bỏ hoàn toàn.

Chuẩn của ngànhChạy giống nhau ở mọi máyDoanh nghiệp lớn phải trả phí
9
ĐIỂM TOPỨNGDỤNG
Hạng #4 trong nhóm Developer & lập trình
Nhà phát triển
Docker
Nền tảng
Windows · macOS · Linux
Giá
Miễn phí cho cá nhân, giáo dục và doanh nghiệp nhỏ · Doanh nghiệp lớn cần gói trả phí · Windows, macOS, Linux
Ngôn ngữ
English
NGƯỜI DÙNG CHẤM

Bạn đánh giá Docker thế nào?

Điểm này độc lập với điểm của ban biên tập và quyết định thứ hạng ở tab “Người dùng bình chọn”.

Chưa có bình chọn
Bạn thấy sao?
Không cần đăng nhập. Mỗi người một phiếu, đổi lại được.
CHẤM ĐIỂM

Điểm từng tiêu chí

Điểm tổng là trung bình có trọng số của các tiêu chí bên dưới.

Nhất quán giữa các môi trường
9.8
Dựng môi trường cho người mới
9.6
Chạy nhiều dịch vụ cùng lúc
9.3
Dễ với người bắt đầu
6
Hiệu năng ngoài Linux
6.5
REVIEW

Đánh giá chi tiết Docker

Trả lời ngắn: Docker giải quyết đúng một vấn đề kinh điển — mã chạy tốt trên máy bạn nhưng hỏng trên máy chủ — bằng cách đóng gói cả môi trường chạy chứ không chỉ mã.

Điều cần biết trước: nó không làm ứng dụng của bạn nhanh hơn, chỉ làm việc triển khai đoán trước được.

Vấn đề nó giải quyết là gì?

Có một câu than quen thuộc trong mọi đội phát triển phần mềm: trên máy tôi vẫn chạy bình thường mà.

Nguyên nhân là chương trình không sống một mình. Nó phụ thuộc vào phiên bản ngôn ngữ, vào hàng chục thư viện hệ thống, vào biến môi trường, vào cấu hình mạng. Máy của bạn và máy chủ khác nhau ở vài chi tiết trong số đó, và thế là hỏng.

Cách xử lý cũ là viết tài liệu hướng dẫn dựng máy chủ thật chi tiết, rồi hy vọng ai đó làm đúng từng bước.

Cách của công cụ này là đóng gói toàn bộ môi trường cùng với mã vào một khối duy nhất. Khối đó chạy giống hệt nhau ở mọi nơi, vì nó mang theo tất cả những gì nó cần.

Docker làm được gì?

ViệcMức độGhi chú
Đảm bảo chạy giống nhau ở mọi môi trườngTốt nhấtLý do nó trở thành tiêu chuẩn ngành
Dựng môi trường cho người mới vào nhómTốt nhấtTừ vài ngày xuống còn một câu lệnh
Chạy nhiều dịch vụ phụ thuộc nhau bằng một tệp cấu hìnhRất tốtCơ sở dữ liệu, bộ đệm, hàng đợi cùng lúc
Cách ly các dự án dùng phiên bản khác nhauRất tốtKhông còn xung đột thư viện trên cùng máy
Nền tảng cho việc triển khai tự độngRất tốtHầu hết hệ thống hiện đại đều dựa trên nó
Kho khối dựng sẵn rất phong phúTốtNhưng phải chọn nguồn đáng tin
Đường học với người mớiKémNhiều khái niệm mới cùng lúc
Hiệu năng trên máy không phải LinuxKháChậm hơn vì phải chạy qua lớp trung gian
Dung lượng ổ đĩa tiêu thụKháPhình rất nhanh nếu không dọn định kỳ

Ai nên học Docker?

  • Người phát triển ứng dụng web phía máy chủ — gần như bắt buộc trong tuyển dụng hiện nay.
  • Đội có nhiều người cùng dựng môi trường phát triển — tiết kiệm rất nhiều ngày công.
  • Ai vận hành hạ tầng và triển khai phần mềm — đây là nền của mọi thứ hiện đại.
  • Người muốn thử phần mềm mà không làm bẩn máy — chạy xong xoá sạch.

Chưa cần nếu bạn chỉ làm ứng dụng máy tính chạy trên Windows — Visual Studio đã lo phần đóng gói cho bạn.

Những sai lầm thường gặp khi mới dùng

Phần lớn rắc rối của người mới đến từ vài hiểu lầm giống nhau.

Sai lầmHậu quả
Lưu dữ liệu bên trong khối chạyMất sạch dữ liệu khi khối bị tạo lại
Ghi mật khẩu thẳng vào tệp cấu hình dựngAi lấy được khối là có mật khẩu
Dùng khối dựng sẵn từ nguồn không rõRủi ro mã độc chạy ngay trong hệ thống
Không bao giờ dọn khối và ảnh cũỔ đĩa đầy sau vài tháng
Nhồi mọi dịch vụ vào chung một khốiMất hết lợi ích về cách ly và mở rộng
Không ghi rõ phiên bản của khối nềnDựng lại sau vài tháng ra kết quả khác
Sai lầm nguy hiểm nhất là lưu dữ liệu bên trong khối chạy. Rất nhiều người dựng cơ sở dữ liệu bằng công cụ này, nhập dữ liệu vào, làm việc mấy tuần, rồi một hôm cần cập nhật cấu hình nên tạo lại khối — và toàn bộ dữ liệu biến mất. Đây không phải lỗi phần mềm mà là thiết kế: khối chạy vốn được coi là thứ dùng xong vứt đi. Dữ liệu cần tồn tại lâu phải được đặt ở một vùng lưu trữ khai báo riêng, nằm ngoài vòng đời của khối. Hãy học điều này trước khi bạn đưa bất cứ dữ liệu thật nào vào.

Lộ trình học từ đầu

  1. Hiểu khác nhau giữa ảnh và khối đang chạy (2 giờ) — Khái niệm nền tảng nhất.
  2. Chạy thử một dịch vụ có sẵn như cơ sở dữ liệu (2 giờ) — Thấy ngay lợi ích.
  3. Viết tệp mô tả cách dựng cho dự án của bạn (1 ngày) — Bắt đầu từ dự án nhỏ.
  4. Học cách khai báo vùng lưu trữ dữ liệu bền (3 giờ) — Trước khi có dữ liệu thật.
  5. Dùng tệp cấu hình gộp nhiều dịch vụ (1 ngày) — Đây là lúc nó thật sự hữu ích.
  6. Đặt lịch dọn ảnh và khối không dùng (30 phút) — Tránh đầy ổ đĩa.

Vì sao phải ghi rõ phiên bản của khối nền?

Đây là thói quen nhỏ nhưng bảo vệ bạn khỏi một loại lỗi rất khó chẩn đoán.

Khi viết tệp mô tả cách dựng, bạn khai báo mình xuất phát từ một khối nền có sẵn — ví dụ một bản Linux tối giản kèm sẵn ngôn ngữ bạn dùng. Nếu chỉ ghi tên mà không ghi phiên bản, bạn ngầm nói rằng hãy lấy bản mới nhất.

Hôm nay bản mới nhất là một phiên bản nào đó và mọi thứ chạy tốt. Sáu tháng sau, khi bạn dựng lại đúng tệp mô tả không sửa một chữ, bạn nhận về một bản nền đã khác — có thể đã đổi phiên bản ngôn ngữ, đã bỏ một thư viện.

Kết quả là dự án dựng lại từ chính tệp cũ mà lại hỏng, và bạn mất cả ngày tìm nguyên nhân trong khi mã nguồn không hề thay đổi. Ghi rõ phiên bản ngay từ đầu khiến việc dựng lại cho ra kết quả giống nhau ở mọi thời điểm.

Hạn chế cần biết

Nhiều khái niệm mới cùng lúc với người bắt đầu

Ảnh, khối, lớp, vùng lưu trữ, mạng nội bộ.

Chạy chậm hơn trên máy không dùng Linux

Phải qua một lớp trung gian nên hao tài nguyên.

Chiếm dung lượng ổ đĩa rất nhanh

Cần dọn dẹp định kỳ nếu không sẽ đầy.

Khối dựng sẵn từ nguồn lạ tiềm ẩn rủi ro

Nên ưu tiên khối chính thức của nhà phát triển.

Không tự làm ứng dụng chạy nhanh hơn

Nó giải bài toán nhất quán chứ không phải hiệu năng.

Docker so với các cách khác

Tiêu chíDockerMáy ảo truyền thốngCài trực tiếp lên máy
Nhất quán giữa các môi trườngTốt nhấtRất tốtKém
Tốc độ khởi độngTốt nhấtKémRất tốt
Tài nguyên tiêu thụVừaRất caoThấp
Dễ với người mớiKháTốtTốt nhất
Dựng lại môi trường từ đầuTốt nhấtTốtKém
Cách ly giữa các dự ánRất tốtTốt nhấtKém

Xem thêm đánh giá GitLab, đánh giá DBeaver, đánh giá Git, hoặc duyệt nhóm công cụ lập trình.

Kết luận

Docker là kỹ năng gần như bắt buộc với người làm phần mềm phía máy chủ ở thời điểm hiện tại.

Giá trị lớn nhất không phải các tính năng cao cấp mà là việc nó xoá bỏ được cả một loại rắc rối: sự khác biệt âm thầm giữa máy phát triển và máy chạy thật.

Hãy học cách khai báo vùng lưu trữ dữ liệu bền trước khi đưa dữ liệu thật vào. Đó là bài học mà nếu bỏ qua, bạn sẽ học bằng cách mất dữ liệu.

Về bài đánh giá này: Điều kiện sử dụng miễn phí của Docker cho doanh nghiệp đã thay đổi vài lần. Kiểm tra thông tin hiện hành tại trang chủ Docker.
ĐÁNH GIÁ

Điểm mạnh & điểm yếu

Điểm mạnh

  • Khối đã đóng gói chạy giống hệt nhau trên máy cá nhân lẫn máy chủ thật
  • Người mới vào nhóm dựng xong môi trường bằng một câu lệnh
  • Một tệp cấu hình dựng cùng lúc cơ sở dữ liệu, bộ đệm và hàng đợi
  • Hai dự án dùng phiên bản ngôn ngữ khác nhau chạy song song không xung đột
  • Là nền tảng của hầu hết hệ thống triển khai tự động hiện nay

Điểm yếu

  • Người bắt đầu phải nuốt nhiều khái niệm mới cùng lúc
  • Chạy qua lớp trung gian trên máy không dùng Linux nên hao hiệu năng
  • Ảnh và khối cũ tích tụ làm đầy ổ đĩa nếu không dọn định kỳ
  • Khối dựng sẵn từ nguồn không rõ tiềm ẩn rủi ro mã độc
  • Không giúp ứng dụng chạy nhanh hơn, chỉ giúp triển khai đoán trước được
Phù hợp nhất với
Người phát triển ứng dụng web phía máy chủĐội có nhiều người cùng dựng môi trường phát triểnNgười vận hành hạ tầng và triển khai phần mềmNgười muốn thử phần mềm mà không làm bẩn máy
HỎI ĐÁP

Câu hỏi thường gặp

Docker giải quyết vấn đề gì?

Chương trình phụ thuộc vào phiên bản ngôn ngữ, hàng chục thư viện hệ thống, biến môi trường và cấu hình mạng — máy bạn và máy chủ khác nhau ở vài chi tiết là hỏng.

Cách xử lý trước đây là gì?

Viết tài liệu hướng dẫn dựng máy chủ thật chi tiết rồi hy vọng ai đó làm đúng từng bước.

Sai lầm nguy hiểm nhất của người mới là gì?

Lưu dữ liệu bên trong khối chạy, vì khối vốn được thiết kế như thứ dùng xong vứt đi.

Hậu quả cụ thể ra sao?

Dựng cơ sở dữ liệu, nhập dữ liệu, làm mấy tuần, rồi tạo lại khối để đổi cấu hình và toàn bộ dữ liệu biến mất.

Vậy dữ liệu lâu dài phải để đâu?

Ở một vùng lưu trữ khai báo riêng, nằm ngoài vòng đời của khối chạy.

Vì sao phải ghi rõ phiên bản của khối nền?

Vì chỉ ghi tên là ngầm yêu cầu lấy bản mới nhất, và bản mới nhất của sáu tháng sau đã khác.

Điều đó gây ra lỗi kiểu gì?

Dựng lại từ chính tệp mô tả không sửa một chữ mà dự án lại hỏng, trong khi mã nguồn không hề thay đổi.

Vì sao không nên nhồi mọi dịch vụ vào một khối?

Vì bạn mất hết lợi ích về cách ly và về khả năng mở rộng riêng từng phần.

Người làm ứng dụng máy tính Windows có cần không?

Chưa cần, vì bộ công cụ phát triển của nền tảng đó đã lo phần đóng gói.

KẾT LUẬN

Học cách khai báo vùng lưu trữ dữ liệu bền trước khi đưa dữ liệu thật vào — nếu bỏ qua, bạn sẽ học bài này bằng cách mất dữ liệu.