Vài tuần trước, tôi đã chuyển từ Docker sang Podman vì Podman cung cấp một số tính năng bổ sung phù hợp với nhu cầu container hóa của mình. Dù vậy, Docker vẫn là một môi trường chạy container tuyệt vời bất chấp những hạn chế, và tôi vẫn sẽ giới thiệu nó cho bất kỳ ai muốn làm quen với những điều cơ bản của container hóa. Thậm chí, tôi còn có một máy ảo Proxmox chuyên dụng hoàn toàn cho Docker để có thể mày mò trong thời gian rảnh rỗi. Nhưng giờ đây, khi bắt đầu biến những chiếc laptop cũ thành các node Proxmox VE (PVE), tôi đã trang bị cho mỗi chiếc một Docker LXC. Trước khi bạn chỉ trích ý tưởng kỳ lạ về việc chạy Docker bên trong một container thay vì máy ảo, tôi phải thừa nhận rằng thiết lập độc đáo này có những ưu điểm riêng đáng kể.
Lý Do Tôi Bắt Đầu Chạy Docker Trong LXC
Hiệu quả cho các thiết bị cấu hình yếu
Khi bắt đầu hành trình hồi sinh phần cứng lỗi thời và máy móc cấu hình thấp thành các máy chủ Proxmox, tài nguyên hạn chế của chúng nhanh chóng trở thành một nút thắt cổ chai lớn cho các thử nghiệm của tôi. Chạy nhiều hơn vài máy ảo (và trong một số trường hợp, chỉ hơn một máy ảo) gần như là không thể trên các hệ thống ngốn CPU và RAM của tôi. Đây là một vấn đề lớn, vì tôi chạy cả ứng dụng tự lưu trữ và các thử nghiệm máy ảo của mình song song, và việc triển khai Docker bên trong một máy ảo riêng sẽ tiêu tốn quá nhiều tài nguyên trên chiếc máy tính “đói” của tôi.
Hóa ra, LXC là giải pháp thay thế hoàn hảo cho vấn đề hiệu suất này. Chắc chắn, container có thể không cung cấp những lợi thế bảo mật tương tự như máy ảo, nhưng LXC nhẹ hơn rất nhiều, khiến chúng phù hợp hơn cho các hệ thống cũ. Để dễ hình dung, chiếc laptop giá rẻ hơn chục năm tuổi của tôi hầu như không thể chạy một máy ảo với giao diện đồ họa, nhưng nó có thể xử lý hàng tá container một cách mượt mà. Do đó, thiết lập Docker-dựa trên LXC là lý tưởng cho các thiết bị công suất thấp của tôi, đặc biệt là ở những hệ thống mà tôi muốn giữ mức sử dụng tài nguyên ở mức tối thiểu tuyệt đối.
Triển Khai Docker Trong LXC Trên Proxmox
Có cách dễ và cách tùy chỉnh
Giống như mọi dự án homelab, có nhiều hơn một phương pháp để tạo một LXC chạy Docker trên Proxmox. Cách dễ hơn là sử dụng kho lưu trữ Proxmox VE Helper-Scripts – cụ thể là script Docker – để khởi tạo một LXC dành riêng cho môi trường chạy container này. Việc chạy script rất đơn giản, chỉ cần thực thi lệnh bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/docker.sh)"
trong tab Shell của máy chủ Proxmox. Tuy nhiên, tôi khuyên bạn nên cấu hình LXC thủ công bằng cách chọn tùy chọn Advanced options.
Việc chọn Default options sẽ cấp phát 2 v-core, 2GB bộ nhớ và 4GB dung lượng lưu trữ cho LXC. Tùy thuộc vào khối lượng công việc của bạn, bạn sẽ nhanh chóng nhận thấy mình đang thiếu tài nguyên hệ thống, đặc biệt là dung lượng đĩa. Vì vậy, tốt hơn hết bạn nên điều chỉnh tài nguyên được gán cho LXC của mình. Ngoài ra còn có sự lựa chọn giữa container đặc quyền (privileged) và không đặc quyền (unprivileged), tôi sẽ đề cập chi tiết hơn sau. Tôi khuyến nghị nên bật Portainer trong quá trình thiết lập LXC, vì nó giúp việc quản lý container trở nên cực kỳ dễ dàng.
Danh sách các image Docker trên giao diện Portainer, minh họa việc quản lý container hiệu quả trên Proxmox LXC.
Ngoài ra, nếu bạn muốn có trải nghiệm tùy chỉnh hơn, bạn có thể tự xây dựng Docker LXC từ đầu. Tôi thường thích sử dụng template Debian TurnKey, nhưng bạn cũng sẽ tìm thấy các gói Ubuntu, Alpine, Fedora, Arch Linux và các gói tzst dựng sẵn khác trong tab CT Templates trong volume local. Khi bạn tạo một container thông qua trình hướng dẫn tạo LXC, hãy nhớ gán DHCP (hoặc IP tĩnh, nếu bạn thích) cho nó.
Sau khi node Proxmox của bạn đã triển khai LXC, bạn có thể thực thi lệnh apt update && apt upgrade -y
trước khi cài đặt tiện ích curl bằng cách chạy apt install curl -y
trong tab Console. Để thiết lập Docker, chỉ cần dán đoạn mã sau vào terminal và đợi script cài đặt môi trường container cùng các gói cần thiết:
-
curl -fsSL https://get.docker.sh -o get-docker.sh
-
sh get-docker.sh
LXC Đặc quyền (Privileged) hay Không đặc quyền (Unprivileged): Chọn lựa của bạn
Giao diện tạo LXC đặc quyền (privileged) cho Docker trên Proxmox, minh họa bước cấu hình quan trọng.
Bất kể phương pháp bạn đã sử dụng để triển khai LXC, bạn sẽ phải quyết định liệu đó là một container đặc quyền hay không đặc quyền. Loại không đặc quyền là lựa chọn an toàn hơn, vì UID 0 (root) của container được ánh xạ tới một người dùng không đặc quyền trên node PVE. Bằng cách đó, bạn sẽ không phải lo lắng về việc leo thang đặc quyền.
Thật không may, việc thiết lập các chia sẻ mạng bên trong các LXC không đặc quyền có thể là một vấn đề. Nếu bạn đang có kế hoạch kết nối các volume CIFS/NFS vào Docker LXC của mình, bạn có thể muốn chọn một container đặc quyền. Nhưng vì các LXC này ánh xạ UID 0 của container tới UID 0 của máy chủ Proxmox, bạn sẽ phải đối mặt với rủi ro bảo mật cao hơn.
Tuy nhiên, thiết lập này vẫn có một vài hạn chế
Không mấy hữu ích trên các máy chủ mạnh
Cài đặt Proxmox trên máy tính cũ, minh họa bối cảnh sử dụng của giải pháp LXC Docker.
Mặc dù cấu hình Docker dựa trên LXC rất tốt cho các hệ thống vốn đã phải “oằn mình” dưới gánh nặng của máy ảo, nhưng thiết lập “container trong container” này cũng có những vấn đề riêng. Trước hết, các bản cập nhật Proxmox có thể làm hỏng các Docker LXC. Chúng cũng không an toàn bằng máy ảo, và mặc dù tôi chưa từng gặp sự cố về độ ổn định, nhưng tôi đã nghe nhiều câu chuyện đáng sợ về việc các Docker LXC gặp trục trặc bất ngờ.
Vì vậy, nếu bạn đang sử dụng một máy chủ cao cấp, tốt hơn hết là nên chạy Docker bên trong một máy ảo. Nhưng đối với những người có thiết bị yếu, không có hại gì khi duy trì thiết lập dựa trên LXC.
Kết luận
Việc triển khai Docker trong LXC trên Proxmox là một chiến lược hiệu quả để tận dụng tối đa các thiết bị phần cứng cũ hoặc có cấu hình yếu trong môi trường homelab. Mặc dù mang lại lợi ích đáng kể về hiệu suất và tiết kiệm tài nguyên so với máy ảo truyền thống, người dùng cần cân nhắc kỹ lưỡng về các khía cạnh bảo mật (giữa LXC đặc quyền và không đặc quyền) cũng như tiềm ẩn rủi ro về độ ổn định khi cập nhật hệ thống. Đối với những ai ưu tiên hiệu quả tài nguyên trên phần cứng hạn chế, đây chắc chắn là một giải pháp đáng để thử.
Bạn đã từng thử chạy Docker trong LXC chưa? Hãy chia sẻ kinh nghiệm và ý kiến của bạn trong phần bình luận bên dưới nhé!