Làm cách nào để di chuyển vùng chứa Docker giữa các máy chủ khác nhau?


98

Tôi không thể tìm thấy cách di chuyển docker đang chạy các vùng chứa từ máy chủ này sang máy chủ khác.

Có cách nào tôi có thể đẩy vùng chứa của mình vào kho lưu trữ như cách chúng ta làm với hình ảnh không? Hiện tại, tôi không sử dụng khối lượng dữ liệu để lưu trữ dữ liệu được liên kết với các ứng dụng chạy bên trong vùng chứa. Vì vậy, một số dữ liệu nằm bên trong các vùng chứa, mà tôi muốn giữ nguyên trước khi thiết kế lại thiết lập.



Lưu ý rằng bạn có thể muốn sử dụng lưu / tải thay vì xuất / nhập, vì lưu giữ siêu dữ liệu và lịch sử.
Burstaholic

Đây có nên là một nhận xét cho câu trả lời của @ aholt không?
Martin Thompson

docker savelà để lưu hình ảnh, không phải vùng chứa. docs.docker.com/engine/reference/commandline/save
stmllr

Câu trả lời:


57

Bạn không thể di chuyển vùng chứa docker đang chạy từ máy chủ này sang máy chủ khác.

Bạn có thể cam kết các thay đổi trong vùng chứa của mình với một hình ảnh docker commit, di chuyển hình ảnh đó sang một máy chủ mới và sau đó bắt đầu một vùng chứa mới với docker run. Điều này sẽ bảo toàn mọi dữ liệu mà ứng dụng của bạn đã tạo bên trong vùng chứa.

Nb: Nó không bảo toàn dữ liệu được lưu trữ bên trong ổ đĩa; bạn cần di chuyển khối lượng dữ liệu theo cách thủ công sang máy chủ mới.


@larsks Không phải bước đầu tiên là dừng vùng chứa và sau đó thực hiện cam kết?
valentt

@valentt Cả hai là có thể, để thực hiện chạy và dừng lại chứa
crollywood

1
Câu trả lời này không thực sự giải thích chính xác các lệnh bạn cần phải sử dụng, mà làm cho nó khó khăn cho một Noob như tôi
Paul Kruger

docker-checkpoint có thể cho phép bạn di chuyển vùng chứa "đang chạy" giữa các máy chủ, nếu cả hai máy chủ đều hỗ trợ CRIU.
dGRAMOP

2
1. dừng thùng chứa docker stop x; 2. cam kết thay đổi ur docker commit -p x x; 3. lưu vùng chứa vào hình ảnh docker save -o x x; 4. di chuyển tệp x sang máy chủ mới và trong máy chủ mới tải hình ảnh mới dokcer load -i x(nếu bạn đã khởi động vùng chứa với -vtùy chọn, bạn cũng sẽ phải di chuyển các tệp này sang máy chủ mới); 5. chạy hình ảnh này vớidocker run (-v is required to mount these files if needed)
Lau Real

95

Ngoài ra, nếu bạn không muốn đẩy vào kho lưu trữ:

  1. Xuất vùng chứa sang tarball

    docker export <CONTAINER ID> > /home/export.tar
    
  2. Di chuyển tarball của bạn sang máy mới

  3. Nhập lại

    cat /home/export.tar | docker import - some-name:latest
    

8
Cũng không bảo tồn dữ liệu được lưu trữ bên trong ổ đĩa.
stmllr

1
Công việc này dự định làm như thế nào nhỉ? Sau khi nhập, tôi nhận được hình ảnh mới, và sau đó là gì? Chỉ cần thực hiện một lệnh chạy mới?
valentt

2
Đây thực sự là một gợi ý thực sự tồi, đặc biệt là đối với các vùng chứa đang chạy cơ sở dữ liệu. Tôi đã thử gợi ý này và nó không hoạt động. Nó có thể hoạt động với việc dừng container trước không?
valentt

2
Đề xuất này chỉ thực sự có nghĩa là một giải pháp thay thế. Nó có thể phù hợp với tình huống của bạn, nó có thể không. Đối với tôi, tôi đang thiết lập các bộ chứa docker nhân bản cơ sở dữ liệu vào thời điểm đó và đối với việc xuất / nhập, tôi không quan tâm đến việc bảo quản dữ liệu, vì tôi thường xuyên chạy các bản sao lưu dữ liệu cơ sở dữ liệu ra một tarball khác. Vì vậy, điều này đã hoạt động hoàn hảo.
aholt

32

Điều cuối cùng đã làm việc cho tôi, sau rất nhiều hướng dẫn sử dụng khó hiểu và các hướng dẫn khó hiểu, vì Docker rõ ràng là vào thời điểm tôi viết bài với những kỳ vọng tăng cao , là:

  1. Lưu hình ảnh docker vào kho lưu trữ:
    docker save image_name > image_name.tar
  2. sao chép trên một máy khác
  3. trên máy docker khác, chạy tải docker theo cách sau:
    cat image_name.tar | docker load

Xuất và nhập, như được đề xuất trong một câu trả lời khác không xuất các cổng và biến, có thể được yêu cầu để vùng chứa của bạn chạy. Và bạn có thể kết thúc với những thứ như "Không có lệnh nào được chỉ định", v.v ... Khi bạn cố gắng tải nó trên một máy khác.

Vì vậy, sự khác biệt giữa lưu và xuất là lệnh lưu lưu toàn bộ hình ảnh với lịch sử và siêu dữ liệu, trong khi lệnh xuất chỉ xuất cấu trúc tệp (không có lịch sử hoặc siêu dữ liệu).

Không cần phải nói rằng, nếu bạn đã có các cổng đó trên tấm che siêu che nắng của docker mà bạn đang nhập, bởi một số container khác của docker, bạn sẽ gặp xung đột và bạn sẽ phải định cấu hình lại các cổng tiếp xúc.


1
Vô cùng hữu ích. Thông báo "Không chỉ định lệnh" khiến tôi phát điên.
Rintoul

Thông báo "Không chỉ định lệnh" cũng khiến tôi phát điên. Tôi sử dụng docker commit <container-id> stackstorm-local: 2.9 và docker pull stackstorm-local: 2.9 từ một máy chủ khác.
Hua Zhang

18

Từ tài liệu Docker:

docker exportkhông xuất nội dung của khối lượng liên kết với vùng chứa. Nếu một ổ đĩa được gắn trên đầu một thư mục hiện có trong vùng chứa, docker exportsẽ xuất nội dung của thư mục bên dưới chứ không phải nội dung của ổ đĩa. Tham khảo Sao lưu, khôi phục hoặc di chuyển khối lượng dữ liệu trong hướng dẫn sử dụng để biết các ví dụ về cách xuất dữ liệu theo khối lượng.


cụm hq tắt máy ... và BTW để chứa Di chuyển container nên chạy trên ZFS / bất kỳ lun lưu trữ được hỗ trợ
asvignesh

6

Sử dụng tập lệnh này: https://github.com/ricardobranco777/docker-volumes.sh

Điều này không bảo toàn dữ liệu trong khối lượng.

Ví dụ sử dụng:

# Stop the container   
docker stop $CONTAINER

# Create a new image   
docker commit $CONTAINER $CONTAINER

# Save image
docker save -o $CONTAINER.tar $CONTAINER

# Save the volumes (use ".tar.gz" if you want compression)
docker-volumes.sh $CONTAINER save $CONTAINER-volumes.tar

# Copy image and volumes to another host
scp $CONTAINER.tar $CONTAINER-volumes.tar $USER@$HOST:

# On the other host:
docker load -i $CONTAINER.tar
docker create --name $CONTAINER [<PREVIOUS CONTAINER OPTIONS>] $CONTAINER

# Load the volumes
docker-volumes.sh $CONTAINER load $CONTAINER-volumes.tar

# Start container
docker start $CONTAINER

1
Không hoạt động với tôi trên AWS Linux (Centos). Cuối cùng, tôi đã áp dụng phương pháp công nghệ thấp là sử dụng thanh tra docker để tìm âm lượng, sau đó sao chép thủ công.
JasonPlutext

@JasonPlutext Có thể một cái gì đó liên quan đến SELinux? Bạn đã bật SELinux chưa?
Ricardo Branco

1

Tôi đã thử nhiều giải pháp cho vấn đề này và đây là giải pháp phù hợp với tôi:

1. gửi / lưu vùng chứa vào hình ảnh mới:

  1. ++ cam kết vùng chứa:
    # docker stop
    # docker commit CONTAINER_NAME
    # docker save --output IMAGE_NAME.tar IMAGE_NAME: TAG


ps: "Vùng chứa CONTAINER_NAME của chúng tôi có ổ đĩa được gắn tại '/ var / home'" (bạn phải kiểm tra vùng chứa của mình để chỉ định đường dẫn âm lượng của nó: # docker kiểm tra CONTAINER_NAME)

  1. ++ lưu khối lượng của nó: chúng tôi sẽ sử dụng một hình ảnh ubuntu để thực hiện điều này.
    # mkdir backup
    # docker run --rm --volumes-from CONTAINER_NAME -v $ {pwd} / backup: / backup ubuntu bash -c “cd / var / home && tar cvf /backup/volume_backup.tar.”

Bây giờ khi bạn nhìn vào $ {pwd} / backup, bạn sẽ thấy tập của chúng tôi ở định dạng tar.
Cho đến thời điểm hiện tại, chúng tôi có hình ảnh của người đồng giải mã 'IMAGE_NAME.tar' và âm lượng của nó 'volume_backup.tar'.

Bây giờ bạn có thể tạo lại cùng một vùng chứa cũ trên một máy chủ mới.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.