Vì container Docker là những hộp nhỏ phần mềm, nói cho dễ hiểu, bạn có thể sao chép và di chuyển chúng giữa các máy tính. Tuy nhiên, điều này không thường được thảo luận, có thể vì tổ chức lớn thiết lập kho riêng, nơi họ tùy chỉnh image riêng và phân phối trên server theo ý muốn. Nhưng bạn không nên phải qua phiền toái thiết lập dòng phân phối riêng nếu chỉ thỉnh thoảng cần di chuyển một hoặc vài container.
Có thể bạn đã làm việc trên instance Docker trên máy cục bộ và quyết định chuyển sang server mạnh hơn. Hoặc bạn chỉ muốn triển khai container tùy chỉnh trên nhiều máy, "copy paste" nó xung quanh. Lúc khác bạn không hài lòng nhà cung cấp cloud và muốn chuyển sang cái khác. Dù tình huống, có quy trình khá đơn giản làm điều này, chi tiết dưới đây.
Lưu image container từ host nguồn
Không bắt buộc dừng container trước, nhưng khuyến nghị cao bạn nên làm. Bạn sẽ chụp ảnh dữ liệu trong instance Docker. Nếu nó đang chạy khi bạn làm, có cơ hội nhỏ một số file có thể không hoàn chỉnh trong ảnh. Hãy tưởng tượng ai đó tải file 500MB. Khi 250MB đã tải, bạn chạy lệnh docker commit. Tải tiếp tục, nhưng khi khôi phục image Docker này trên host khác, chỉ 250/500MB có sẵn.
Vì vậy, nếu có thể, hãy dừng instance trước.
docker stop NAME_OF_INSTANCE
Container Docker được xây từ image gốc chung. Qua thời gian, bạn thêm thay đổi của mình vào image gốc này. Tiến trình chạy trong container cũng có thể lưu dữ liệu hoặc làm thay đổi khác. Để bảo toàn tất cả, bạn có thể commit trạng thái mới này vào image mới.
Lưu ý nếu instance đang chạy, hành động này sẽ tạm dừng nó trong khi nội dung được lưu. Nếu bạn thêm nhiều dữ liệu vào container, thao tác này sẽ mất thời gian lâu hơn. Nếu đây là vấn đề, bạn có thể tránh tạm dừng bằng docker commit -p=false NAME_OF_INSTANCE mycontainerimage thay vì lệnh sau. Tuy nhiên, đừng làm trừ khi thực sự cần. Khả năng tạo image với dữ liệu không nhất quán/bất hoàn chỉnh tăng lên.
Trong hướng dẫn, tên chung đã chọn cho image kết quả, mycontainerimage. Bạn có thể đổi tên nếu muốn. Nếu làm, nhớ thay thế trong tất cả lệnh sau nơi gặp nó.
docker commit NAME_OF_INSTANCE mycontainerimage
Bây giờ, lưu image này ra file và nén.
docker save mycontainerimage | gzip > mycontainerimage.tar.gz
Tiếp theo, dùng phương pháp chuyển file ưa thích và sao chép mycontainerimage.tar.gz đến host nơi bạn muốn di chuyển container.
Nạp image container trên host đích
Sau khi đăng nhập host nơi bạn chuyển image, nhập nó vào Docker.
gunzip -c mycontainerimage.tar.gz | docker load
Vì bạn chưa khởi tạo container ở đây, bạn không thể khởi động nó với docker start ngay. Thay vào đó, chạy cùng lệnh bạn dùng trước, khi lần đầu chạy instance Docker. Sự khác biệt duy nhất là bạn dùng "mycontainerimage" ở cuối thay vì image gì bạn dùng trước.
Lệnh sau chỉ ví dụ; đừng copy paste trừ khi áp dụng cho bạn. (Không tham số đặc biệt khi chạy image lần đầu)
docker run -d --name=PICK_NAME_FOR_CONTAINER mycontainerimage
Đối chiếu, sau là ví dụ lệnh cần tham số --publish chuyển tiếp cổng 80 trên host đến cổng 80 trên container:
docker run -d --name=http-server --publish 80:80 mycontainerimage
Sau đó, bạn có thể dừng và khởi động container bình thường, với lệnh docker stop và docker start.
Chuyển image không tạo file
Đôi khi bạn muốn bỏ qua tạo file mycontainerimage.tar.gz. Có thể bạn không đủ dung lượng đĩa vì container có nhiều dữ liệu. Bạn có thể lưu, nén, chuyển, giải nén và nạp image trên host đích trong một lệnh. Sau chạy lệnh docker commit thảo luận phần đầu, bạn dùng:
docker save mycontainerimage | gzip | ssh root@203.0.113.1 'gunzip | docker load'
Nó nên hoạt động từ Windows, vì Windows hiện có client SSH tích hợp (không cần PuTTY).
Sau đó, tiếp tục với lệnh docker run áp dụng cho tình huống của bạn.
Kết luận
docker save và docker load tuyệt vời như giải pháp ad hoc di chuyển container thỉnh thoảng. Nhưng nhớ, nếu bạn làm thường xuyên, bạn nên thiết lập kho riêng.
Image Credit: Air Force Medical Service