Với vai trò là một người say mê “distro-hopping” trong nhiều năm, tôi đã trải nghiệm từ Debian, DietPi đến Arch, Slackware và nhiều hệ điều hành khác. Nhưng khi nói đến những bản phân phối Linux vừa kỳ lạ vừa hoạt động hiệu quả, ít có cái tên nào sánh kịp với sự độc đáo của NixOS. Nó là sự kết hợp tài tình giữa tính sáng tạo, giàu tính năng và độ phức tạp đáng kinh ngạc – chính “bộ ba” này đã thu hút tôi đến với hệ sinh thái NixOS.
Trong những thử nghiệm gần đây với máy ảo NixOS, tôi đã cố gắng chạy một Docker image thông qua module oci-container
. Sau một vài tìm kiếm, tôi đã khám phá ra module container của NixOS, cho phép chạy container tương tự như Docker nhưng tích hợp chặt chẽ hơn với môi trường NixOS bên dưới. Giờ đây, sau khi dành nhiều giờ trải nghiệm NixOS Containers, tôi phải thừa nhận rằng mình khá ấn tượng với những khả năng mà chúng mang lại.
Minh họa giao diện quản lý các container đang chạy
NixOS Containers là gì và chúng hoạt động như thế nào?
Bản chất và cơ chế hoạt động
Tương tự như Docker và Podman, NixOS Containers là những môi trường nhẹ, được cô lập (ở một mức độ nhất định) cho phép bạn triển khai ứng dụng mà không chịu thêm tải xử lý nặng nề như máy ảo truyền thống. Tuy nhiên, thay vì dựa vào một runtime container riêng biệt, NixOS Containers tận dụng dịch vụ systemd-nspawn và tích hợp chặt chẽ với bản chất độc đáo của hệ điều hành này để giúp bạn tự host các dịch vụ của mình.
Điểm khác biệt nữa là thay vì sử dụng các file cấu hình Dockerfile, NixOS Containers có thể được khai báo trực tiếp trong file /etc/nixos/configuration.nix. Một khi bạn đã thêm mã cấu hình container vào file này, việc chạy lệnh nixos-rebuild switch
sẽ khiến hệ điều hành tự động tải các gói Nix cần thiết và triển khai chúng vào một môi trường container hóa.
Ví dụ, tôi đã chỉnh sửa đoạn mã sau từ wiki chính thức để khai báo một phiên bản Nextcloud dưới dạng NixOS Container:
networking.nat = {
enable = true;
internalInterfaces = ["ve-+"];
externalInterface = "ens18";
enableIPv6 = false;
};
containers.nextcloud = {
autoStart = true;
privateNetwork = false;
config = { config, pkgs, lib, ... }: {
services.nextcloud = {
enable = true;
package = pkgs.nextcloud31;
hostName = "localhost";
config.dbtype = "sqlite";
config.adminpassFile = "${pkgs.writeText "adminpass" "myrandomepassword"}";
};
system.stateVersion = "23.11";
networking = {
firewall = {
enable = true;
allowedTCPPorts = [ 80 ];
};
# Use systemd-resolved inside the container
useHostResolvConf = lib.mkForce false;
};
services.resolved.enable = true;
};
};
Đối với những người dùng thích cách thiết lập “mệnh lệnh” truyền thống (dựa trên lệnh), bạn vẫn có thể sử dụng lệnh nixos-container để quản lý đội ngũ dịch vụ container hóa dựa trên NixOS của mình – tương tự như cách bạn sử dụng từ khóa docker
.
Màn hình cấu hình một container Nextcloud trong NixOS
Vì sao NixOS Containers nổi bật hơn Docker (trong một số khía cạnh)?
Tương thích hoàn hảo với triết lý khai báo của NixOS
Là một fan hâm mộ của NixOS, cách tiếp cận khai báo đối với cài đặt gói và cấu hình hệ thống là khía cạnh yêu thích của tôi. Đối với những người chưa quen, NixOS sử dụng một file cấu hình trung tâm chứa mọi thứ từ ứng dụng, cài đặt cho đến người dùng và cấp độ đặc quyền của họ, và bạn hoàn toàn có thể tùy chỉnh nó theo ý muốn.
Do đó, thay vì thực hiện nhiều lệnh chỉ để chạy một ứng dụng, tôi có thể thêm phiên bản nixpkg
và các cài đặt dành riêng cho ứng dụng vào file configuration.nix
. Sau đó, tôi có thể “xây dựng lại” (rebuild) bản phân phối để áp dụng các thay đổi. NixOS Containers cũng hoạt động theo cách tương tự, cho phép tôi tạo một “đế chế” container hóa ngay trong cùng một file cấu hình, thay vì phải chuyển đổi giữa các file docker-compose.yml
khác nhau.
Giao diện trình soạn thảo file cấu hình configuration.nix trên NixOS
Ngoài ra, việc này còn mang lại lợi ích về sao lưu. Thay vì phải tìm hiểu về Ansible playbooks hoặc tự host các dịch vụ snapshot chuyên dụng, tôi chỉ cần sao lưu file configuration.nix
trung tâm và sử dụng nó để xây dựng lại bản phân phối NixOS của mình bao nhiêu lần tùy thích. Hơn nữa, cấu hình này không chỉ giới hạn ở một phiên bản NixOS duy nhất; tôi có thể di chuyển nó sang một thiết lập bare-metal hoặc VM khác để tái tạo lại toàn bộ “kho vũ khí” container của mình từ đầu.
Tận dụng thư viện nixpkg khổng lồ
Các trình quản lý gói apt
và yum
truyền thống chắc chắn rất tuyệt vời cho đa số người dùng Linux, nhưng kho lưu trữ nixpkg
vượt trội hơn hẳn về số lượng gói. Điều tuyệt vời nhất là gì? NixOS Containers chia sẻ kho lưu trữ Nix (Nix store) với máy chủ chính, cho phép truy cập vào thư viện nixpkg
khổng lồ.
Chắc chắn, Docker có các image dễ triển khai, nhưng Nix Containers lại dễ cập nhật hơn nhiều. Tôi chỉ cần trỏ đến phiên bản cập nhật của kho lưu trữ và xây dựng lại môi trường NixOS của mình để phù hợp với phiên bản gói mới nhất.
Hình ảnh minh họa việc sử dụng kho gói nixpkgs trên NixOS
Quản lý dễ dàng nhờ systemd-nspawn
Một lợi ích tiềm ẩn khác của NixOS Containers là sự phụ thuộc vào systemd-nspawn, cho phép tôi quản lý chúng thông qua các lệnh systemctl
và machinectl
. Ngoài việc kiểm tra trạng thái chi tiết của container, tôi còn có thể sửa đổi file cấu hình của chúng để thiết lập tự động khởi động lại. Sau đó là toàn bộ dịch vụ phân bổ tài nguyên và ghi log tích hợp do systemd
cung cấp, giúp đơn giản hóa việc quản lý container hơn nữa.
Màn hình terminal minh họa lệnh systemctl để quản lý container trên NixOS
Tuy nhiên, NixOS Containers vẫn còn những hạn chế
Đường cong học tập cực kỳ dốc
Với bộ sưu tập image tương thích OCI và vô số hướng dẫn, Docker là một trong những runtime container dễ tiếp cận nhất hiện có. Đây cũng là phương pháp lý tưởng để những người mới bắt đầu dấn thân vào thế giới tự host.
Ngược lại, NixOS Containers có một đường cong học tập cực kỳ dốc, đến mức tôi sẽ không tiếp cận chúng nếu tôi không quen thuộc với bản phân phối kỳ lạ này. Đó là bởi vì cách tiếp cận khai báo, điểm nhấn chính của thiết lập này, đòi hỏi một mức độ quen thuộc nhất định với ngôn ngữ Nix. Thậm chí, dù đã chạy thiết lập NixOS trong một thời gian dài, tôi vẫn gặp khó khăn trong việc thiết lập môi trường container hoạt động trong những lần đầu tiên.
Quá trình xây dựng các gói phần mềm NixOS trên terminal
Vấn đề bảo mật tiềm ẩn nghiêm trọng
Nếu bạn có ý định công khai các dịch vụ của mình ra Internet, các đặc quyền root mặc định của NixOS Containers là một lỗ hổng bảo mật nghiêm trọng. Về mặt kỹ thuật, có thể triển khai các container không đặc quyền (unprivileged containers), nhưng chúng lại có những vấn đề riêng. Tham số bindMounts
không hoạt động trên một NixOS Container không đặc quyền. Tương tự, bạn không thể sử dụng đối số root-login
với lệnh nixos-container
cho một phiên bản không đặc quyền.
Xem xét nội dung file cấu hình chính của NixOS để điều chỉnh bảo mật
Hạn chế trong hệ sinh thái NixOS
Như bạn có thể đoán từ cái tên, nhược điểm lớn nhất của NixOS Containers là chúng bị giới hạn trong bản phân phối độc đáo này. Không giống như Docker, Podman và các runtime container khác, bạn không thể triển khai các dịch vụ dựa trên NixOS trên một bản phân phối khác. Vì vậy, nếu bạn là một người yêu thích Debian/Arch Linux và không có kế hoạch sử dụng NixOS ngoài một vài thử nghiệm không thường xuyên, việc dành hàng giờ để làm quen với ngôn ngữ Nix sẽ không mấy ý nghĩa khi bạn sẽ từ bỏ bản phân phối này.
Tổng kết: NixOS Containers – Một trải nghiệm self-host thú vị nhưng đầy thách thức
Mặc dù tôi rất yêu thích NixOS Containers, nhưng rõ ràng chúng không dành cho tất cả mọi người. Nếu bạn là một người đam mê tự host thông thường, tốt hơn hết là nên gắn bó với Docker hoặc (tốt hơn nữa) một nền tảng containerization chuyên nghiệp. Tôi dựa vào sự kết hợp của Arch Linux, NixOS và các môi trường phát triển Windows 11 cho các dự án code của mình. Do đó, tôi có đủ động lực để tìm hiểu sâu về NixOS Containers và (hy vọng) có thêm nhiều hiểu biết sâu sắc về những chi tiết phức tạp của bản phân phối kỳ lạ này sau khi dành hàng giờ khắc phục sự cố với một file cấu hình bị hỏng.
Giao diện tổng quan của hệ điều hành NixOS
NixOS Containers mang đến một phương pháp tiếp cận độc đáo và mạnh mẽ cho việc tự host dịch vụ, đặc biệt phù hợp với triết lý khai báo của NixOS. Tuy nhiên, đường cong học tập dốc và các cân nhắc về bảo mật khiến chúng trở thành lựa chọn lý tưởng hơn cho những người dùng đã có kinh nghiệm với NixOS và mong muốn kiểm soát sâu hơn hệ thống của mình. Đối với người mới bắt đầu, các giải pháp container hóa phổ biến như Docker vẫn là lựa chọn thân thiện và dễ tiếp cận hơn. Bạn nghĩ sao về NixOS Containers? Liệu bạn có sẵn sàng dấn thân vào thế giới đầy thử thách này? Hãy để lại bình luận bên dưới!