Hướng Dẫn Triển Khai Docker và Compose Trên Kiến Trúc ARM Trong Môi Trường Nội Mạng Cô Lập

Kiểm Tra Cấu Hình Phần Cứng Và Hệ Điều Hành

Trước khi tiến hành bất kỳ quy trình cài đặt nào trong môi trường không kết nối Internet, việc xác thực tính tương thích của phần cứng và phần mềm là bước bắt buộc. Mặc dù tất cả các máy chủ ARM đều chạy trên cùng kiến trúc nền tảng, nhưng các biến thể cụ thể có thể gây ra xung đột khi triển khai dịch vụ container.

Xác Nhận Loại Kiến Trúc CPU

Đừng chỉ tin tưởng vào nhãn "ARM server". Hãy sử dụng công cụ dòng lệnh để xác định chính xác bộ vi xử lý:

# Xem thông số kiến trúc chi tiết từ lscpu
lscpu | grep -E "Architecture|Model name"

# Hoặc phương pháp đơn giản hơn với uname
uname -m

Đầu ra thường thấy sẽ bao gồm các giá trị sau:

  • aarch64: Kiến trúc 64-bit tiêu chuẩn (Kunpeng, Ampere, Graviton).
  • armv7l: Kiến trúc 32-bit (thường gặp trên Raspberry Pi hoặc nhúng).

Chú ý rằng các bản phân phối Linux khác nhau có thể định danh arm64 tương đương với aarch64. Docker Engine chính thức ưu tiên dùng aarch64 cho đường dẫn tải xuống.

Rà Soát Phiên Bản Kernel Và Distro

Giới hạn về phiên bản nhân Linux là rào cản lớn nhất khi cài đặt offline vì không thể nhờ package manager giải quyết tự động.

# Kiểm tra kernel hiện hành
uname -r

# Lấy thông tin hệ điều hành từ file cấu hình
cat /etc/*release | head -n 10

Nên tạo một kịch bản kiểm toán nhanh để đảm bảo đủ tài nguyên trước khi truyền file binary lên máy đích:

#!/bin/bash
REPORT_FILE="/tmp/host_check_report.txt"

echo "=== REPORT KIỂM TRA HỆ THỐNG ===" > "$REPORT_FILE"
date >> "$REPORT_FILE"

echo "Architecture: $(uname -m)" >> "$REPORT_FILE"
echo "Kernel Ver: $(uname -r)" >> "$REPORT_FILE"

if [ -f /etc/os-release ]; then
    . /etc/os-release
    echo "OS Name: $NAME - $VERSION_ID" >> "$REPORT_FILE"
fi

free -mh | head -1 >> "$REPORT_FILE"

df -h / >> "$REPORT_FILE"

echo "File report đã lưu tại: $REPORT_FILE"

Danh Sách Các Gói Phụ Thuộc Cần Thiết

Trong môi trường online, apt/yum tự xử lý chuyện này. Khi offline, bạn cần đóng gói sẵn các thư viện sau từ máy chủ mẫu giống hệt máy đích:

Gói/Tính Năng Command Kiểm Tra Tầm Quan Trọng
iptables which iptables Mạng lưới container
cgroups mount | grep cgroup Quản lý tài nguyên
dm_mod lsmod | grep dm_mod Device Mapper storage
libseccomp ldconfig -p | grep seccomp Bảo mật syscall

Cài Đặt Docker Engine Dưới Dạng Binary

Phương án phổ biến nhất cho môi trường biệt lập là sử dụng gói tar.gz tĩnh (static build). Cách này loại bỏ sự phụ thuộc vào quản lý gói của hệ thống, tuy nhiên yêu cầu cấu hình dịch vụ cẩn thận hơn.

Tải Down File Triển Khai

Thực hiện lệnh tải trên máy có mạng, chọn phiên bản ổn định (stable release).

# Sử dụng curl để tải (khuyến nghị thay thế wget)
BASE_URL="https://download.docker.com/linux/static/stable/arm64"
DOCKER_VERSION="25.0.1"

curl -LO "${BASE_URL}/docker-${DOCKER_VERSION}.tgz"
curl -LO "${BASE_URL}/docker-${DOCKER_VERSION}.tgz.sha256sum"

# Xác minh checksum
sha256sum -c docker-${DOCKER_VERSION}.tgz.sha256sum

Giải Mã Và Di Chuyển File

Tương tự như Docker Daemon, hãy tránh đưa file nhị phân vào thư mục hệ thống mặc định ngay lập tức. Thay vào đó, tách chúng ra:

# Tạo thư mục dự án riêng biệt
mkdir -p /opt/container/runtime

# Giải nén vào thư mục tạm thời
tar -xzf docker-${DOCKER_VERSION}.tgz -C /opt/container/runtime

# Di chuyển các file cần thiết vào vị trí chung
mv /opt/container/runtime/docker /opt/container/runtime/dockerd
mv /opt/container/runtime/{containerd,ctr,runc} /usr/local/bin/

Thiết Lập Service Quản Lý Với Systemd

Để khởi động và quản lý vòng đời Docker, cần file định nghĩa unit đúng cách. Sau đây là mẫu file cấu hình tùy chỉnh cho tối ưu hóa hiệu năng:

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target firewalld.service containerd.service
Wants=network-online.target
Requires=containerd.service

[Service]
Type=notify
ExecStart=/opt/container/runtime/dockerd \
--storage-driver=overlay2 \
--exec-opt native.cgroupdriver=systemd
ExecReload=/bin/kill -s HUP \$MAINPID
TimeoutSec=0
Restart=always
LimitNOFILE=infinity
TasksMax=infinity

[Install]
WantedBy=multi-user.target

Yếu tố quan trọng trong đoạn mã trên:

  1. LimitNOFILE=infinity: Tránh lỗi "too many open files" khi chạy nhiều container nặng.
  2. --storage-driver=overlay2: Đảm bảo tính năng sao chép lớp thấp nhất cho ARM 64-bit.

Cấu Hình Daemon JSON

File cấu hình tại /etc/docker/daemon.json quyết định hành vi của engine.

{
  "data-root": "/var/lib/docker",
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "2"
  },
  "experimental": false,
  "storage-driver": "overlay2"
}

Khi áp dụng xong, nhớ khởi động lại systemd và kích hoạt dịch vụ:

systemctl daemon-reload
systemctl enable docker
systemctl start docker

# Kiểm tra trạng thái
systemctl status docker --no-pager

Triển Khai Docker Compose Độc Lập

Docker Compose hoạt động như một CLI tool riêng biệt và cũng cần phiên bản tương thích với kiến trúc arm64.

Thiết Lập Bản Nháp

Truy cập trang phát hành (Releases) của GitHub để lấy file binary chính xác. Tên file thường nằm dưới dạng docker-compose-linux-aarch64.

COMPOSE_VERSION="2.23.0"
COMPOSE_BIN="/usr/local/bin/docker-compose"

# Tải xuống từ repo chính thức
curl -L "https://github.com/docker/compose/releases/download/v${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o ${COMPOSE_BIN}

chmod +x ${COMPOSE_BIN}

Ma Trận Tương Thích Phiếu

Để đảm bảo hoạt động ổn định giữa Docker Engine và Compose, tham khảo bảng sau trước khi nâng cấp:

Docker Engine Version Tương Thích Compose Version Ghi Chú
20.x 1.29.x - 2.1.x Vòng đời cũ
23.x - 25.x 2.18.x - 2.24.x Vùng ổn định khuyến nghị
Beta Preview Latest v2 Khuyến cáo không dùng production

Khởi Động Test

Sau khi hoàn thành cài đặt cả hai thành phần, thử nghiệm bằng câu lệnh phiên bản:

docker --version
docker compose version

Thông thường, nếu gặp lỗi về quyền sở hữu thư mục hoặc thiếu thư viện libseccomp ở giai đoạn cuối, hãy kiểm tra lại các gói phụ thuộc đã liệt kê ở phần môi trường đầu tiên.

Thẻ: docker arm64 systemd OfflineDeployment LinuxServer

Đăng vào ngày 4 tháng 6 lúc 17:31