2015-02-18 29 views
22

Đây là một câu hỏi rất cơ bản, nhưng tôi đang đấu tranh một chút và muốn chắc chắn rằng tôi hiểu đúng.Các thùng chứa docker có giữ lại các thay đổi của tập tin không?

Sau khi vùng chứa được bắt đầu từ một hình ảnh và một số thay đổi được thực hiện cho tệp bên trong (ví dụ: một số dữ liệu được lưu trữ trong DB của WebApp đang chạy trên vùng chứa), cách thích hợp để tiếp tục làm việc với cùng ngày giữa vùng chứa dừng lại và khởi động lại?

Sự hiểu biết của tôi có chính xác rằng khi vùng chứa bị dừng/kết thúc (tức là: thoát sau một phiên tương tác), thì vùng chứa đó sẽ biến mất cùng với tất cả thay đổi tệp? Vì vậy, nếu tôi muốn giữ một số thay đổi tệp, tôi phải cam kết trạng thái của vùng chứa thành hình ảnh mới/phiên bản mới của hình ảnh?

Cảm ơn, Julian

Trả lời

37

là hiểu biết của tôi đúng rằng một khi container được dừng lại/thành (nghĩa là .: thoát sau khi một phiên tương tác), sau đó container mà đã biến mất cùng với tất cả những thay đổi tập tin?

Không, thùng chứa vẫn tồn tại sau khi thoát, trừ khi bạn bắt đầu sử dụng đối số --rm cho docker run. Xem xét việc này:

$ docker run -it busybox sh 
/# date > example_file 
/# exit 

Vì chúng ta exit ed vỏ của chúng tôi, các container là không còn chạy nữa:

$ docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS     NAMES 

Nhưng nếu chúng ta đã có tùy chọn -a, chúng ta có thể nhìn thấy nó:

CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS      PORTS     NAMES 
79aee3e2774e  busybox:latest  "sh"    About a minute ago Exited (0) 54 seconds ago       loving_fermat  

Và chúng tôi có thể khởi động lại và đính kèm lại nó:

$ docker start 79aee3e2774e 
$ docker attach 79aee3e2774e 
<i press RETURN> 
/# 

Và các tập tin chúng tôi đã tạo trước đó vẫn còn đó:

/ # cat example_file 
Wed Feb 18 01:51:38 UTC 2015 
/# 

Bạn có thể sử dụng lệnh docker commit để lưu nội dung của container thành một hình ảnh mới, sau đó bạn có thể sử dụng để bắt đầu container mới, hoặc chia sẻ với người khác, v.v. Lưu ý, tuy nhiên, nếu bạn thấy mình thường xuyên sử dụng docker commit, bạn có thể tự làm hại mình. Nói chung, có thể quản lý các vùng chứa để chỉ đọc và tạo hình ảnh mới bằng Dockerfile và docker build.

Sử dụng mô hình này, dữ liệu thường được giữ bên ngoài vùng chứa, hoặc thông qua khối lượng máy chủ gắn kết hoặc sử dụng vùng chứa chỉ dữ liệu.

+0

* facepalm * Tôi đã sử dụng --rm (!!!) - quá nhiều lỗi google-paste. Tôi biết đó là một câu hỏi ngu ngốc. –

+1

Trong mọi trường hợp, cảm ơn bạn rất nhiều vì đã giải thích kỹ lưỡng. Toàn bộ mô hình giờ đây có ý nghĩa hơn với tôi. Đối với trường hợp của tôi, tôi đang di chuyển để sử dụng càng nhiều dữ liệu càng tốt bên ngoài vùng chứa và được gắn kết thông qua khối lượng máy chủ gắn kết. Chỉ thỉnh thoảng tôi phải sửa đổi container để cài đặt cái gì đó. Với việc làm rõ này, bây giờ tôi có thể đơn giản cho phép thùng chứa được và cam kết nó vào một hình ảnh mới chỉ một lần trong một thời gian khi nó đáng được chia sẻ với các nhà phát triển khác. Cảm ơn một lần nữa, câu trả lời tuyệt vời! –

+0

BTW, tôi yêu thích lỗi đánh máy lúc đầu: "... một container tồn tại sau khi nó tồn tại ...". Âm thanh như một thùng chứa cứng. –

9

Bạn có thể thấy container thành với docker ps -a

Bạn có thể tiết kiệm một container đã hoàn thành, với những thay đổi hệ thống tập tin, vào một hình ảnh sử dụng docker commit container_name new_image_name

Bạn cũng có thể trích xuất các file dữ liệu từ container thành với: docker cp containerID:/path/to/find/files /path/to/put/copy

Lưu ý rằng bạn cũng có thể "lập kế hoạch trước" và tránh bẫy dữ liệu bạn sẽ cần vĩnh viễn trong vùng chứa tạm thời bằng cách chứa vùng chứa gắn kết thư mục từ máy chủ, ví dụ:

docker run -v /dir/on/host:/dir/on/container -it ubuntu:14.04 
Các vấn đề liên quan