Sự khác biệt giữa lưu và xuất trong Docker là gì?


157

Tôi đang chơi xung quanh với Docker trong một vài ngày và tôi đã tạo ra một số hình ảnh (điều đó thực sự thú vị!). Bây giờ tôi muốn tiếp tục công việc của mình và tìm đến saveexportra lệnh, nhưng tôi không hiểu hết về chúng.

Sự khác biệt giữa saveexporttrong Docker là gì?


4
Tôi cũng đã viết một bài đăng trên blog về điều này tại tuhrig.de/difference-b between
Thomas Uhrig

Câu trả lời:


169

Câu trả lời ngắn gọn là:

  • savesẽ tìm nạp hình ảnh: cho VM hoặc máy chủ vật lý, đó sẽ là cài đặt .ISO hình ảnh hoặc đĩa. Hệ điều hành cơ sở.

    Nó sẽ đóng gói các lớp và siêu dữ liệu của tất cả các chuỗi cần thiết để xây dựng hình ảnh. Sau đó, bạn có thể tải chuỗi hình ảnh "đã lưu" này vào một phiên bản docker khác và tạo các thùng chứa từ những hình ảnh này.

  • exportsẽ tìm nạp toàn bộ vùng chứa: như ảnh chụp nhanh của máy ảo thông thường. Tất nhiên, lưu hệ điều hành, nhưng cũng có bất kỳ thay đổi nào bạn đã thực hiện, bất kỳ tệp dữ liệu nào được ghi trong thời gian chứa. Điều này giống như một bản sao lưu truyền thống.

    Nó sẽ cung cấp cho bạn một kho lưu trữ .tar phẳng chứa hệ thống tập tin của container của bạn.

Chỉnh sửa: vì lời giải thích của tôi vẫn có thể dẫn đến nhầm lẫn, tôi nghĩ rằng điều quan trọng là phải hiểu rằng một trong những lệnh này hoạt động với các thùng chứa, trong khi các lệnh khác hoạt động với hình ảnh.

  • Một hình ảnh phải được coi là 'chết' hoặc không thay đổi, bắt đầu 0 hoặc 1000 container từ nó sẽ không thay đổi một byte đơn. Đó là lý do tại sao tôi đã so sánh với hệ thống cài đặt ISO trước đó. Nó thậm chí có thể gần hơn với một đĩa CD trực tiếp.

  • Một thùng chứa "khởi động" hình ảnh và thêm một lớp bổ sung trên đầu nó. Lớp này lưu trữ bất kỳ thay đổi nào trên vùng chứa (tệp được tạo / thay đổi / xóa ...).


2
Chỉ để tôi làm rõ: giả sử tôi có một container đang chạy, nơi tôi đã thực hiện một số thay đổi (ví dụ: tôi đã tạo một thư mục mới). Bây giờ tôi có thể tạo một hình ảnh của container này (với docker commit). Tôi có thể sau đó savehình ảnh. Hoặc tôi có thể exportcontainer trực tiếp. Và cả hai cách ( savehình ảnh và exportcontainer) sẽ có kết quả như nhau?
Thomas Uhrig

2
Có và không. Các exportsẽ cung cấp cho bạn một căn hộ .tar lưu trữ có chứa hệ thống tập tin chứa của bạn. savesẽ đóng gói các lớp và siêu dữ liệu của tất cả các chuỗi cần thiết để xây dựng hình ảnh. Sau đó, bạn có thể tải savedchuỗi hình ảnh "" này vào một phiên bản docker khác và tạo các thùng chứa từ những hình ảnh này.
mbarthelemy

7
@ThomasUhrig Bạn có thể sử dụng xuất để "làm phẳng" container thành một lớp / hình ảnh cơ sở. Ngoài ra, bạn có thể sử dụng nó để sao lưu container (container dữ liệu). Nhưng điều này có thể được thực hiện mà không có exportchức năng quá.
Jiri

9
Ngoài ra, với exporttất cả các siêu dữ liệu sẽ bị mất, vì vậy trong trường hợp bạn cố gắng chạy container với hình ảnh đó, bạn đã đánh giá được CMD và các siêu dữ liệu khác. savelàm việc tốt với tôi nhưng xuất khẩu là nỗi đau
Mirage

1
Tôi muốn cập nhật hình ảnh của tôi lên phiên bản mới nhất. Container hiện đang chạy đã thực hiện một số thay đổi cho hệ thống tệp nội bộ. Sau khi nâng cấp, tôi muốn những thay đổi này được khôi phục. Theo tôi hiểu, cả lưu / tải và xuất / nhập sẽ tạo ra một hình ảnh mới cho tôi, đó không phải là điều tôi muốn. Tôi muốn sử dụng phiên bản mới của hình ảnh từ dockerhub, nhưng khôi phục dữ liệu từ vùng chứa hiện có. Quá trình hành động tốt nhất là gì?
Dmitry z

20

Có hai sự khác biệt chính giữa saveexportcác lệnh.

  1. savelệnh lưu toàn bộ hình ảnh với lịch sử và siêu dữ liệu nhưng exportlệnh chỉ xuất cấu trúc tệp (không có lịch sử và siêu dữ liệu). Vì vậy, tệp tar đã xuất sẽ nhỏ hơn tệp đã lưu.

  2. Khi bạn sử dụng hệ thống tập tin xuất khẩu để tạo ra một hình ảnh mới sau đó hình ảnh mới này sẽ không chứa bất kỳ USER, EXPOSE, RUN, vv lệnh từ Dockerfile của bạn. Chỉ cấu trúc tập tin sẽ được chuyển. Vì vậy, khi bạn đang sử dụng các từ khóa được đề cập trong Dockerfile thì bạn không thể sử dụng lệnh xuất để chuyển hình ảnh sang máy khác - bạn luôn cần sử dụng lệnh save.


4

Hình ảnh được xuất sẽ không lưu bất kỳ thông tin lịch sử hoặc lớp nào, vì vậy nó sẽ nhỏ hơn và bạn sẽ không thể quay lại.

Hình ảnh được lưu sẽ có thông tin lớp và lịch sử, vì vậy lớn hơn.

Nếu đưa cái này cho khách hàng, Q có muốn giữ những lớp đó hay không?


Vì vậy, xuất khẩu tương tự như một tệp txt không có gì được viết trên đó phải không ?? @neil
AATHITH RAJENDRAN

4
nó giống như một tệp văn bản không có bộ đệm hoàn tác 8)
Neil McGill

2

Về mặt kỹ thuật, lưu / tải hoạt động với các kho lưu trữ có thể là một hoặc nhiều hình ảnh, còn được gọi là các lớp. Một hình ảnh là một lớp duy nhất trong một repo. Cuối cùng, một container là một hình ảnh khởi tạo (chạy hay không).


1

Docker save Tạo một repo tệp tar chứa tất cả các lớp cha và tất cả các thẻ + phiên bản hoặc thẻ repo: được chỉ định cho mỗi đối số được cung cấp từ hình ảnh .

Xuất Docker Tạo tệp được chỉ định (có thể là tar hoặc tgz) với nội dung phẳng không có nội dung của khối lượng được chỉ định từ Container .

Docker lưu cần sử dụng trên hình ảnh docker trong khi xuất docker cần sử dụng trên container (giống như chạy hình ảnh)

Lưu sử dụng

docker lưu [TÙY CHỌN] IMAGE [IMAGE ...]

Lưu (các) hình ảnh vào kho lưu trữ tar (được truyền trực tiếp đến STDOUT)

--help = false In sử dụng -o, --output = "" Ghi vào tệp, thay vì STDOUT

sử dụng xuất khẩu

xuất docker [TÙY CHỌN] CONTAINER

Xuất nội dung của hệ thống tập tin chứa dưới dạng lưu trữ tar

--help = false In sử dụng -o, --output = "" Ghi vào tệp, thay vì STDOUT


1
Câu hỏi là về sự khác biệt giữa hai lệnh không phải về định nghĩa và cách sử dụng khái quát!
Abu Shumon

0

export: container (filesystem)-> image tar.
import: exported image tar->image . Chỉ có một lớp.

save: image-> image tar.
load: saved image tar-> image. Tất cả các lớp sẽ được phục hồi.

Từ Docker in Action, Ấn bản thứ hai p190.

Hình ảnh được xếp lớp duy trì lịch sử của hình ảnh, siêu dữ liệu tạo vùng chứa và các tệp cũ có thể đã bị xóa hoặc ghi đè.

Hình ảnh dẹt chỉ chứa tập hợp tệp hiện tại trên hệ thống tệp.

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.