2015-02-12 29 views
24

Tôi có vùng chứa docker đang chạy. Tôi đã thực hiện một số công việc hữu ích trong vùng chứa docker đang chạy. Tôi đã thực hiện các tác phẩm này không phải là một phần của dockerfile, tôi đã thực hiện nó bên trong vùng chứa. [Ví dụ: Tôi đã cài đặt ping bên trong vùng chứa, không phải từ tệp docker]Sao lưu vùng chứa docker để gỡ lỗi

Bây giờ, tôi bị kẹt ở một nơi. Tôi không chắc chắn nếu tôi gỡ lỗi trong cùng một container, tôi có thể mất điều mà tôi đã làm cho đến nay bên trong container đó. Vì vậy, tôi muốn tạo một bản sao của nó với tất cả những thứ có sẵn trong container đang chạy [như tôi không muốn xây dựng một container từ hình ảnh và lặp lại tất cả các bước suucessful đạt được trong container đang chạy và sau đó bắt đầu quá trình gỡ lỗi của tôi. Tôi không muốn cài đặt lại ping trong vùng chứa thứ hai của mình].

Hoàn toàn, Làm cách nào để sao chép vùng chứa? Nếu không phải tất cả các khả năng là gì?

Trả lời

35
  1. Tạo một hình ảnh cơ bản và chạy nó

    docker run -it <base_image> /bin/bash 
    
  2. Thực hiện các thay đổi cần thiết

    yum install ping 
    
  3. Cam kết nó với một cái tên mới

    docker commit <hash tag of running container> new_image 
    

Bây giờ nếu bạn mở new_image bằng cách chạy

docker run -it new_image /bin/bash 

Bạn có thể thấy ping được cài đặt trong đó.

Mở base_image và không có ping được cài đặt trong đó.

Hy vọng nó đã trả lời câu hỏi của bạn.

+3

Chỉ cần làm rõ một chút: lệnh liên quan ở đây là 'docker commit'; phần còn lại là để tái tạo lại tình hình mà OP đã kết thúc. – Joost

1

Nếu bạn muốn lưu những thay đổi của bạn, bạn có thể sử dụng docker commit, xem doc http://docs.docker.com/reference/commandline/cli/#commit và bạn cũng có thể lưu một container, http://docs.docker.com/reference/commandline/cli/#save

+0

ok Tốt. Nếu tôi làm một cam kết hoặc lưu và sau đó tôi làm gỡ lỗi của tôi, tôi có thể trở lại trạng thái đã lưu của tôi. Không nên tôi sử dụng kéo một lần nữa vì nó được cam kết. –

+0

Nếu bạn cam kết, bạn sẽ gắn thẻ nó với tên khác, và tất nhiên bạn có thể quay lại statse đã lưu (đó là cam kết được thiết kế cho). Bạn sẽ có một hình ảnh khác, vì vậy bạn sẽ phải kéo nó nếu bạn muốn sử dụng nó. Kéo có thể gần như ngay lập tức nếu bạn có bộ nhớ cache hoặc đăng ký cục bộ. – user2915097

+0

Hãy để tôi kiểm tra điều này. Tôi sẽ tel cho bạn –

1

Khi triển khai docker 1.0.1 (Server/client API 1.12), chỉ hỗ trợ cho các hoạt động tạm dừng/tiếp tục.

Nhưng xa như snapshotting của các quá trình (trong cam kết + đẩy) đang lo ngại, những không làm việc (không được hỗ trợ, tài liệu mặc dù tôi đã không kiểm tra)

Nói tóm lại, 1) Bảo tồn trạng chạy các quy trình là không thể! 2) Mọi thay đổi được thực hiện đối với hệ thống tệp (lưu trữ liên tục) có thể được lưu (và có thể được cam kết + được đẩy vào kho lưu trữ).

0

hiện bị hỏng một lần nữa

dưới đây chỉ hoạt động với phiên bản từ khoảng ngày 20 tháng 12 năm 17.

docker commit là tốt để lưu thay đổi tệp vào một hình ảnh mới, nhưng nó sẽ không giữ lại các thay đổi trong bộ nhớ, quy trình mở vv Tương phản với ý kiến ​​phổ biến, điều sau là khả thi với docker checkpoint.Documentationexample.

Lưu ý: ngay bây giờ, tùy chọn --checkpoint-dir bị hỏng: issue, pull. Đó là lý do tại sao một workaround như checkpoint_dir (xem mã) là cần thiết ở đây. Câu trả lời này có thể sẽ được cập nhật sau vài tuần nữa.

Đó là not possible để kiểm tra điểm TTY. Đây là số might change. Tuy nhiên, bạn có thể đính kèm TTY mới sau quá trình khôi phục bằng cách sử dụng exec.

Bạn need to have criu installed. Sau đó, đầu tiên,

echo "{\"experimental\": true}" >> /etc/docker/daemon.json 
systemctl restart docker 

, sau đó

#!/bin/bash 

# tty (-t) not supported 
docker run -i -d --name sleeper\ 
    busybox sh -c 'sleep 10000' 

# Makes a snapshot and stops the container (except if --leave-running is active). --checkpoint-dir is broken. 
docker checkpoint create sleeper cp 
# sleeper container exited 

# Create the clone 
docker create -i --rm --name clone\ 
    busybox 

# Start the clone 
checkpoint_dir="/var/lib/docker/containers/$(docker ps -aq --no-trunc -f name=sleeper)/checkpoints" 
docker start --checkpoint-dir=$checkpoint_dir --checkpoint=cp clone 

# Attach new TTY 
docker exec -it clone sh 

Bây giờ trong tty, gõ ps -e và bạn sẽ thấy quá trình được bắt đầu vào sleeper container và bây giờ tiếp tục trong clone.

checkpoint tạo bản thiết kế hoàn chỉnh của vùng chứa tới ổ cứng, trao đổi giữa các máy. Tính năng này sử dụng criu và thử nghiệm. Criu không thể create a blueprint of X11 ứng dụng nguyên bản.

pause mặt khác chỉ đóng băng vùng chứa bên trong. Bạn không thể làm gì với vùng chứa bị tạm dừng ngoài việc hủy tạm dừng nó.

Các vấn đề liên quan