Cách tôi di chuyển máy chủ Docker của mình sang hệ thống mới

Tác giả Starlink, T.Tám 25, 2025, 11:45:05 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Bạn đã bao giờ cân nhắc việc di chuyển các container Docker của mình từ máy chủ này sang máy chủ khác chưa? Gần đây tôi bỗng nảy ra ý định nâng cấp phòng thí nghiệm tại nhà, thay thế một máy chủ rack cũ bằng một hệ thống mới hơn, mạnh mẽ hơn—nhưng việc di chuyển các container Docker quả là một thử thách mà tôi không biết phải làm thế nào.


Thực ra, việc này không khó lắm, và tốn thời gian hơn là đáng sợ hay bực bội. Việc di chuyển chỉ cần vài lệnh và rất nhiều kiên nhẫn (tùy thuộc vào số lượng container Docker bạn đang chạy). Sau đây là cách tôi di chuyển máy chủ Docker của mình sang một hệ thống hoàn toàn mới (mà không cần di chuyển máy ảo).

1. Việc di chuyển máy chủ Docker không nhất thiết phải quá khó khăn

Tháng Một vừa rồi là lần đầu tiên tôi di chuyển container Docker. Tôi đã chuyển từ Unraid sang cài đặt Docker chuẩn trên máy ảo Ubuntu. Thành thật mà nói, đây là một bước khá đơn giản, và tôi đã sử dụng các phương pháp sao lưu tích hợp cho một số ứng dụng, và bắt đầu lại từ đầu các ứng dụng khác.

Tuy nhiên, gần đây tôi quyết định di chuyển máy chủ Docker ảo của mình từ máy chủ này sang máy chủ khác. Trong khi đang cân nhắc việc di chuyển máy ảo, tôi quyết định đi theo một hướng khác và di chuyển cài đặt Docker sang một máy ảo hoàn toàn mới.

Nghĩ đến điều này thật quá sức. Tôi sẽ phải tạm dừng các container Docker trong một thời gian khá dài để thực hiện việc di chuyển, và có rất nhiều vấn đề có thể xảy ra trong quá trình chuyển giao.

Tuy nhiên, khi đã tìm hiểu kỹ thì mọi chuyện thực sự không tệ như tôi nghĩ. Đúng là sẽ mất vài tiếng đồng hồ (và tôi chắc chắn đã gặp phải một vài trục trặc), nhưng nhìn chung thì khá dễ dàng và không quá khó khăn.

2. Đảm bảo hệ thống mới được chuẩn bị đúng cách

Tôi bắt đầu bằng cách đảm bảo máy ảo mới của mình đã sẵn sàng hoạt động. Trước tiên, tôi đảm bảo mình đang sử dụng cùng phiên bản Ubuntu: Server 24.04 LTS. Ubuntu Server đã là lựa chọn hàng đầu của tôi trong hơn một thập kỷ qua mỗi khi tôi cần một máy chủ Linux. Tôi hoàn toàn thoải mái với nó.

Sau khi cài đặt Ubuntu Server 24.04 trên máy chủ ảo mới, tôi đảm bảo Docker và mọi thành phần phụ thuộc khác cần được cấu hình và sẵn sàng hoạt động, bao gồm cả các trình điều khiển bổ sung cho NVIDIA hoặc Intel, và đảm bảo tất cả các đường dẫn thư mục cần thiết cho Docker đã được thiết lập.

Sau khi đã cấu hình xong mọi thứ, tôi dừng cả dịch vụ Docker và socket bằng các lệnh sau:

Mã nguồn [Chọn]
systemctl stop docker.socket
systemctl stop docker

Có thể bạn không cần chạy cả hai lệnh, nhưng tôi đã làm vậy. Về cơ bản, lệnh này tắt Docker để tôi có thể thay đổi hệ thống tệp Docker cốt lõi mà không làm hỏng bất cứ thứ gì.

Sau khi hoàn tất, tôi chạy chính xác các lệnh đó trên hệ thống cũ. Tôi phải đảm bảo Docker đã được tắt trên hệ thống cũ trước khi thu thập tệp, vì điều đó sẽ đảm bảo không có gì thay đổi từ khi tôi bắt đầu di chuyển cho đến khi hoàn tất.

Điều này cũng có nghĩa là tất cả các container Docker của tôi sẽ bị tắt. Thành thật mà nói, đây là phần tệ nhất đối với tôi. Phòng thí nghiệm tại nhà của tôi vận hành toàn bộ ngôi nhà bằng Docker, từ Home Assistant đến Audiobookshelf, Plex và nhiều dịch vụ khác. Tắt Docker đồng nghĩa với việc tắt các hệ thống này, vì vậy tôi phải đợi đến đúng thời điểm mới thực hiện.

Cuối cùng, tôi đã tìm ra thời điểm máy chủ nhàn rỗi và tôi có thể tiến hành bằng cách tắt Docker rồi chuyển sang bước tiếp theo: chuẩn bị tất cả các tệp để chuyển.

3. Thu thập tất cả các tệp Docker

Đây là phần mất nhiều thời gian nhất của quá trình đối với tôi. Cuối cùng, tôi đã phải xóa khá nhiều tệp và thư mục khỏi thư mục mà tôi bind mount các ổ đĩa Docker để cố gắng làm cho quá trình này nhanh nhất có thể, nhưng vẫn mất vài giờ.

Về cơ bản, bạn muốn tar thư mục Docker của mình và sau đó, nếu bạn sử dụng một vùng khác để mount ổ đĩa, thì thư mục đó cũng vậy. Nếu bạn chỉ sử dụng ổ đĩa Docker, chúng sẽ bị bắt bởi lệnh đầu tiên.

Để bắt đầu, tôi chạy lệnh sau trên máy chủ cũ của mình:

Mã nguồn [Chọn]
sudo tar -czvf docker-backup.tar.gz /var/lib/docker
Lệnh này sẽ sao lưu thư mục /var/lib/docker vào tệp tar.gz. Tùy thuộc vào số lượng container bạn đang chạy và việc bạn có sử dụng Docker Volumes hay không, quá trình này có thể mất một khoảng thời gian. Với tôi, mất khoảng 30 đến 45 phút.

Tiếp theo, tôi chạy lệnh sau trên máy chủ cũ của mình:

Mã nguồn [Chọn]
sudo tar -cvzf docker-files.tar.gz /portainer
Vì tôi chạy Portainer làm trình quản lý Docker, tôi chỉ cần đặt tất cả các tệp Docker của mình vào thư mục /portainer trên máy chủ. Vậy là tôi có /portainer/audiobookshelf, /portainer/plex, v.v. Lệnh trên sẽ lấy thư mục /portainer và nén nó thành một tệp nhỏ gọn, giúp việc di chuyển dễ dàng. Việc sao lưu này mất khoảng một giờ vì tôi có rất nhiều dữ liệu trong các thư mục Docker Volume.

Sau khi cả hai thư mục hoàn tất việc nén, tôi đã sẵn sàng chuyển sang bước tiếp theo: di chuyển các tệp nén sang máy chủ mới.

4. Việc di chuyển mọi thứ sang hệ thống mới thật đơn giản

Tôi có mạng 2,5 Gb/giây ở nhà, và tôi muốn tận dụng tối đa tốc độ này bất cứ khi nào có thể. Vì vậy, tôi đã tìm ra một lệnh để di chuyển tệp từ máy chủ này sang máy chủ khác, đồng thời hiển thị tốc độ truyền tải trong terminal:

Mã nguồn [Chọn]
rsync -ah --info=progress2 docker-backup.tar.gz user@remote-host:/destination/path/
Nhờ lệnh này, tôi có thể theo dõi quá trình chuyển dữ liệu và đảm bảo mọi thứ diễn ra theo đúng kế hoạch. May mắn thay, mọi thứ đã diễn ra đúng như dự định. Chỉ trong vài phút, các tệp đã được chuyển từ máy chủ cũ sang máy chủ mới và tôi đã sẵn sàng để tiếp tục.

Tất nhiên, nếu muốn, bạn có thể dùng USB để di chuyển tệp từ máy chủ này sang máy chủ khác. Máy chủ cũ của tôi (hệ thống Dell R720 gắn trên giá đỡ) chỉ có USB 2.0, nên việc di chuyển tệp qua mạng nhanh hơn nhiều.

Khi các tệp đã ở trên máy chủ mới, chỉ cần giải nén chúng vào đúng vị trí. Tôi bắt đầu với thư mục Docker:

Mã nguồn [Chọn]
sudo tar -xpf docker-backup.tar.gz -C /
Khi hoàn tất, tôi chạy:

Mã nguồn [Chọn]
sudo tar -xpf docker-files.tar.gz -C /
Thao tác này sẽ đưa tất cả các tệp Docker cũ và các ổ đĩa gắn kết của tôi trở lại đúng vị trí ban đầu và giữ nguyên các quyền được thiết lập đúng, đây là phần lớn quá trình di chuyển.

Thực sự thì việc tar hóa Docker, di chuyển các tệp tar, rồi giải nén các tệp là những việc chiếm phần lớn thời gian di chuyển. Tổng cộng, ba thao tác này mất khoảng ba đến bốn giờ để hoàn thành trên máy chủ của tôi.

Tuy nhiên, sau khi hoàn tất việc đó, tôi chỉ còn một bước nữa là hoàn tất việc di chuyển. Giờ đã đến lúc tôi phải khởi động Docker trên máy chủ mới.

5. Khởi động Docker trên hệ thống mới và các container của bạn sẽ hoạt động

Sau khi đã chuẩn bị xong tất cả các file, tôi đã bật Docker lần đầu tiên với tất cả các container đã được cài đặt. Việc này rất đơn giản và chỉ cần hai lệnh:

Mã nguồn [Chọn]
systemctl start docker
systemctl start docker.socket

Tôi đã nghĩ sẽ có rất nhiều thứ bị hỏng khi bật Docker sau khi chuyển máy. Nhưng thay vào đó, hầu hết mọi thứ đều hoạt động bình thường và sẵn sàng hoạt động. Thực ra, đó là tất cả những gì cần làm để khởi động Docker trên máy mới của bạn.

Nếu cấu hình giữa hệ thống cũ và mới của bạn không khác biệt nhiều thì mọi thứ sẽ hoạt động bình thường. Tuy nhiên, nếu bạn giống tôi, đã thay đổi nhiều giữa hai hệ thống, thì có một vài điều cần lưu ý.

6. Những điều cần lưu ý khi di chuyển

Một trong những điều đầu tiên tôi phải sửa là thay đổi một số container đang sử dụng NVIDIA runtime sang Intel runtime. Trên máy chủ cũ, tôi dùng card đồ họa GTX 1650 để hỗ trợ xử lý AI và chuyển mã. Máy chủ mới sử dụng i9-13900K với đồ họa tích hợp của Intel, có khả năng xử lý cùng khối lượng công việc.

Việc này mất một thời gian và tôi vẫn chưa chuyển đổi hoàn toàn (tôi đã từ bỏ Scrypted và để nó chạy trên bộ xử lý thay vì iGPU), nhưng nhìn chung thì đây là một sự chuyển đổi khá đơn giản.

Tôi cũng gặp phải một trục trặc khá lớn với Home Assistant. Vì lý do nào đó, Docker container của Home Assistant không di chuyển bất kỳ cài đặt nào sang đó. Có một số thông tin cấu hình mà tôi đã lưu trữ trong /portainer/homeassistant, nhưng nó lại khởi động như thể tôi chưa từng chạy Home Assistant trước đây.

Tuy nhiên, đây lại là một giải pháp dễ dàng. Tôi chỉ cần bật lại máy ảo cũ, nhập Home Assistant trên đó, tải xuống tệp sao lưu và khôi phục tệp đó trên máy ảo mới. Việc này giúp tôi khởi động lại máy ngay lập tức.

Một số mạng của Docker cũng có thể cần được xem xét lại. Ví dụ, với Scrypted, tôi đã phải chuyển lại sang mạng máy chủ từ một mạng mặc định scrypted mới được tạo ra vì lý do nào đó.

Tôi cũng phải thiết lập IP tĩnh trên máy ảo mới. Sau đó, tôi phải cập nhật một vài thứ lặt vặt khác trên máy chủ để mọi thứ hoạt động trơn tru với card đồ họa tích hợp mà tôi đang sử dụng.

Nhìn chung, việc chuyển đổi khá suôn sẻ và tôi rất hài lòng với máy chủ mới. Nó nhanh hơn, phản hồi nhanh hơn và có nhiều tính năng hơn so với máy chủ cũ - tất cả trong khi lại tiêu thụ ít điện năng hơn.

Việc di chuyển khá đơn giản, và tôi rất vui vì đã học được cách di chuyển container Docker từ hệ thống này sang hệ thống khác. Tôi chắc chắn rằng điều này sẽ hữu ích trong tương lai!

Nếu bạn chưa từng chạy container Docker trước đây hoặc mới bắt đầu, Docker là một công cụ tuyệt vời. Nó có thể tự mình chạy gần như toàn bộ phòng thí nghiệm tại nhà của tôi.

Dưới đây là một số container Docker yêu thích của tôi mà tôi nghĩ mọi người làm việc tại nhà nên chạy. Hầu hết đều dễ thiết lập và có thể tăng thêm rất nhiều giá trị cho hệ thống của bạn. Thực tế, phòng thí nghiệm tại nhà của tôi đã trở thành một trong những thứ hữu ích nhất trong nhà.