Docker đáng dùng khi phân tích phụ thuộc thư viện hệ thống khó cài, cần chạy y hệt trên máy chủ tính toán, hoặc tạp chí đòi gói tái lập chặt. Với đa số đề tài chỉ dùng gói R hay Python thông dụng, khoá môi trường bằng renv hoặc conda kèm README rõ ràng đã đủ; Docker khi đó là quá tay.
Container là một gói chứa hệ điều hành thu gọn, phiên bản ngôn ngữ, các gói và mã phân tích, chạy tách biệt khỏi máy chủ. Ai có Docker đều chạy được gói đó với kết quả như nhau, bất kể máy họ cài gì. Nghe hấp dẫn, nhưng Docker có chi phí học và chi phí duy trì thật. Bài này giúp bạn quyết định có nên dùng, và nếu dùng thì bắt đầu với một tệp mô tả tối thiểu.
Các mức tái lập: chọn mức vừa đủ
Mỗi mức cao hơn khoá chặt thêm một tầng, đổi lại tốn công hơn.
| Mức | Gồm những gì | Khoá được | Phù hợp |
|---|---|---|---|
| 1. Mã và README | Mã phân tích, hướng dẫn chạy, danh sách gói | Logic phân tích | Mọi đề tài, mức tối thiểu |
| 2. Tệp khoá gói | Thêm renv.lock hoặc environment.yml | Phiên bản gói | Đa số luận văn, bài báo |
| 3. Container | Thêm Dockerfile hoặc ảnh dựng sẵn | Hệ điều hành, thư viện hệ thống, ngôn ngữ | Phụ thuộc phức tạp, máy chủ tính toán, yêu cầu chặt |
| 4. Ảnh lưu trữ | Lưu bản ảnh đã dựng vào kho dữ liệu | Cả khi nguồn tải gói biến mất | Kết quả phải chạy lại được sau nhiều năm |
Ý tưởng container trong ba khái niệm
Dockerfile là tệp văn bản mô tả cách dựng môi trường: bắt đầu từ ảnh nền nào, cài gì, chép tệp nào vào. Ảnh (image) là kết quả dựng từ Dockerfile, một gói đóng băng chứa mọi thứ. Container là một lần chạy của ảnh: khởi động, thực thi phân tích, rồi tắt. Bạn có thể chạy cùng một ảnh nhiều lần, mỗi lần một container mới sạch sẽ.
Điểm mấu chốt cho tái lập: Dockerfile là văn bản, đưa vào Git được, ai cũng đọc được môi trường gồm những gì. Còn ảnh là thứ chạy thật, có thể đẩy lên kho ảnh như Docker Hub hoặc lưu thành tệp bằng docker save để cất cùng bộ dữ liệu.
Container khác máy ảo ở chỗ không chứa cả một hệ điều hành đầy đủ với nhân riêng, mà dùng chung nhân của máy chủ. Nhờ vậy container khởi động trong vài giây và nhẹ hơn nhiều. Trên Windows và macOS, Docker Desktop phải chạy một máy ảo Linux nhỏ ở nền để có nhân Linux, đó là lý do nó tốn tài nguyên hơn trên hai hệ này so với trên Linux.
Một Dockerfile tối thiểu
Cho phân tích R
Cộng đồng Rocker duy trì các ảnh nền R có gắn phiên bản. Một Dockerfile bốn dòng:
FROM rocker/r-ver:4.4.1 chọn ảnh nền có R 4.4.1. Ảnh có phiên bản cụ thể của dòng r-ver được cấu hình cài gói từ một ảnh chụp kho CRAN theo ngày, nên gói cài sau này vẫn ra cùng phiên bản.
RUN install2.r --error dplyr fixest cài gói bằng công cụ có sẵn trong ảnh Rocker; tuỳ chọn --error làm quá trình dựng dừng nếu cài lỗi.
COPY . /work và WORKDIR /work chép mã vào ảnh và đặt thư mục làm việc.
CMD Rscript ma/chay_tat_ca.R lệnh chạy mặc định khi khởi động container.
Nếu dự án đã có renv.lock, thay dòng cài gói bằng việc chép tệp khoá vào ảnh và chạy renv::restore() trong bước dựng; khi đó nguồn sự thật về phiên bản gói vẫn là tệp khoá.
Cho phân tích Python
FROM python:3.11-slim chọn ảnh nền chính thức có Python 3.11 bản gọn.
WORKDIR /work, rồi COPY requirements.txt . và RUN pip install --no-cache-dir -r requirements.txt cài gói theo danh sách đã ghi phiên bản.
COPY . . chép phần còn lại của dự án.
CMD python ma/phan_tich.py lệnh chạy mặc định.
Thứ tự chép tệp danh sách gói trước, mã sau là có chủ đích: khi chỉ sửa mã, Docker dùng lại lớp đã cài gói, dựng lại nhanh hơn nhiều.
Dựng và chạy
Cài Docker Desktop trên Windows, macOS hoặc Docker Engine trên Linux, rồi trong thư mục dự án:
docker build -t phantich-khaosat .dựng ảnh và đặt tên. Dấu chấm cuối là thư mục chứa Dockerfile.docker run --rm -v $(pwd)/ket_qua:/work/ket_qua phantich-khaosatchạy phân tích; tuỳ chọn-vnối thư mụcket_quatrên máy vào container để kết quả ghi ra máy thật,--rmxoá container sau khi chạy xong. Trong PowerShell, thay$(pwd)bằng${PWD}.- Nếu dữ liệu không được đưa vào ảnh vì lý do bảo mật hay dung lượng, nối thư mục dữ liệu theo cùng cách bằng một tuỳ chọn
-vnữa, ở chế độ chỉ đọc bằng hậu tố:ro. docker save phantich-khaosat -o phantich-khaosat.tarlưu ảnh thành tệp để cất vào kho dữ liệu khi cần mức tái lập cao nhất.
Chi phí thật của Docker
Thời gian học. Hiểu ảnh, container, lớp, cách nối thư mục, cách đọc lỗi khi dựng thường mất vài ngày làm thật, chưa kể khi gặp lỗi mạng hay quyền truy cập tệp.
Máy và dung lượng. Docker Desktop chạy một máy ảo nhẹ trên Windows và macOS, tốn RAM. Ảnh có R và vài gói không gian địa lý dễ vượt vài gigabyte.
Ảnh nền vẫn trôi. Nhãn như python:3.11-slim được cập nhật theo thời gian, nên dựng lại năm sau có thể khác. Muốn chặt tuyệt đối, ghim ảnh nền theo mã băm dạng @sha256: hoặc lưu ảnh đã dựng.
Giấy phép và môi trường máy chủ. Docker Desktop miễn phí cho cá nhân, giáo dục và tổ chức nhỏ; tổ chức lớn cần xem điều khoản thuê bao hiện hành. Nhiều cụm máy tính hiệu năng cao không cho chạy Docker vì lý do quyền, mà dùng Apptainer, công cụ đọc được ảnh Docker. Podman là lựa chọn mã nguồn mở khác, cú pháp lệnh gần giống.
Lỗi hay gặp ở lần dựng đầu tiên
Dựng lại toàn bộ mỗi khi sửa một dòng mã
Nguyên nhân là lệnh COPY . . đặt trước bước cài gói, nên mọi thay đổi trong mã làm mất lớp đệm của bước cài. Đưa bước chép danh sách gói và cài gói lên trước, chép mã sau cùng.
Ảnh nặng bất thường
Thư mục dự án chứa dữ liệu, kết quả cũ, thư mục .git đều bị chép vào ảnh. Tạo tệp .dockerignore cùng cú pháp với .gitignore để loại chúng khỏi bước chép.
Kết quả không thấy trên máy thật
Container ghi kết quả vào hệ tệp của chính nó và mất khi container bị xoá. Phải nối thư mục kết quả bằng tuỳ chọn -v như phần trên.
Tệp kết quả thuộc quyền root trên Linux
Container mặc định chạy bằng người dùng root nên tệp ghi ra thư mục nối thuộc root. Thêm tuỳ chọn --user $(id -u):$(id -g) khi chạy để tệp mang quyền của bạn.
Gói R cài thất bại vì thiếu thư viện hệ thống
Ảnh r-ver là bản gọn; gói như sf cần GDAL, PROJ, GEOS. Thêm một dòng RUN apt-get update && apt-get install -y kèm tên các thư viện phát triển cần thiết, hoặc dùng ảnh Rocker dựng sẵn cho dữ liệu không gian là rocker/geospatial.
Khi nào nên dùng, khi nào là quá tay
Một vài dấu hiệu giúp quyết định nhanh:
- Nên dùng: phân tích cần thư viện hệ thống khó cài như GDAL, PROJ cho dữ liệu không gian, hoặc thư viện GPU.
- Nên dùng: phân tích chạy trên máy chủ chung của trường và bạn không có quyền cài phần mềm hệ thống.
- Nên dùng: tạp chí hoặc dự án yêu cầu gói tái lập đầy đủ, hay kết quả có thể bị kiểm tra lại sau nhiều năm.
- Quá tay: luận văn dùng vài chục gói R hoặc Python thông dụng, chạy trên máy cá nhân, nhóm chưa ai quen dòng lệnh.
- Quá tay: phân tích chủ yếu bằng phần mềm có giao diện như SPSS, NVivo; container không giải quyết được vấn đề tái lập của các thao tác bấm chuột.
Nếu không chắc, bắt đầu ở mức tệp khoá gói. Chuyển lên container sau vẫn dễ, vì Dockerfile có thể dựng lại môi trường từ chính tệp khoá đó.
Câu hỏi thường gặp
Docker có thay được renv hay conda không?
Không hẳn, chúng bổ sung nhau. Tệp khoá ghi phiên bản gói, Docker khoá thêm hệ điều hành và thư viện hệ thống. Dockerfile tốt thường dựng môi trường từ chính tệp khoá.
Máy Windows có chạy được Docker không?
Được, qua Docker Desktop dùng nền WSL 2. Máy cần bật ảo hoá trong BIOS và có đủ RAM. Với máy cấu hình yếu, việc chạy container có thể khá chậm.
Có nên đưa dữ liệu vào ảnh Docker không?
Dữ liệu nhỏ, công khai thì được. Dữ liệu nhạy cảm hay lớn nên để ngoài và nối vào lúc chạy bằng tùy chọn -v, vì ảnh có thể bị đẩy lên kho ảnh công khai.
Apptainer là gì?
Apptainer, trước đây là Singularity, là công cụ container phổ biến trên cụm máy tính hiệu năng cao vì không cần quyền quản trị. Nó chạy được ảnh dựng bằng Docker.
Binder có giúp gì cho tái lập không?
Binder dựng môi trường từ tệp như environment.yml trong kho GitHub công khai, cho người đọc chạy sổ tay ngay trên trình duyệt. Hợp cho minh hoạ, không hợp cho phân tích nặng hay dữ liệu nhạy cảm.