Nội dung container Mount Docker trong hệ thống tập tin máy chủ


24

Tôi muốn có thể kiểm tra nội dung của một Docker container (chỉ đọc). Một cách thanh lịch để làm điều này sẽ là gắn nội dung của container trong một thư mục. Tôi đang nói về việc gắn nội dung của một container trên máy chủ, không phải về việc gắn một thư mục trên máy chủ bên trong một container.

Tôi có thể thấy rằng có hai trình điều khiển lưu trữ trong Docker ngay bây giờ: aufs và btrfs. Cài đặt Docker của riêng tôi sử dụng btrfs và duyệt đến / var / lib / docker / btrfs / subvolume hiển thị cho tôi một thư mục trên mỗi container Docker trên hệ thống. Tuy nhiên, đây là một chi tiết triển khai của Docker và cảm thấy sai khi gắn kết - gắn các thư mục này ở một nơi khác.

Có một cách thích hợp để làm điều này, hoặc tôi cần phải vá Docker để hỗ trợ các loại gắn kết này?


Tại sao nó lại sai khi gắn kết những thứ này ở nơi khác?
Michael Hampton

1
Bởi vì vị trí lưu trữ là một chi tiết thực hiện. Docker ngày thêm một trình điều khiển lưu trữ, vị trí sẽ di chuyển. Tôi cần phải thực hiện bán tự động này và thật tuyệt khi sử dụng API công khai vì lý do đó.
dflemstr

2
Có thể đáng để xem xét làm việc trên nsenter (hoặc docker-enter) để đạt được mục tiêu của bạn; tất nhiên có sự hạn chế của việc phải kiểm tra mã / công cụ kiểm tra bên trong container.
VladFr

Có cách nào để hướng dẫn Linux gắn kết qua biên giới container không?
dflemstr

@dflemstr vâng, có, --volume-từ kinda làm điều đó, nó dường như gắn kết một liên kết của thư mục từ hình ảnh cơ sở của người chứa khác và âm lượng, nhưng hành vi này không được ghi lại trong afaik
Tarnay Kálmán

Câu trả lời:


10

Hãy nhìn vào docker export.

Để nhanh chóng liệt kê các tệp trong vùng chứa của bạn:

docker export CONTAINER|tar -t

Xuất khẩu:

docker export CONTAINER>snapshot.tar
docker export CONTAINER|tar x PATH-IN-CONTAINER

Hoặc để xem một tập tin:

docker export CONTAINER|tar x --to-stdout PATH-IN-CONTAINER
# e.g. 
docker export consul|tar x --to-stdout etc/profile

Docker 1.8 hỗ trợ cp :

https://docs.docker.com/reference/commandline/cp/

Usage:  docker cp [options] CONTAINER:PATH LOCALPATH|-
        docker cp [options] LOCALPATH|- CONTAINER:PATH

cập nhật: bạn nên ssh vào máy docker của bạn khi bạn chạy này.


2
Hình ảnh của tôi khá lớn (hàng trăm MiB) vì vậy làm điều này để tìm nạp các tệp riêng lẻ là quá nhiều chi phí. Nó sẽ tạo tập tin nhiều trăm megabyte mỗi lần.
dflemstr

@dflemstr sử dụng dòng với tar x PATH-IN-CONTAINER, nó sẽ chỉ trích xuất các tập tin bạn cần.
laktak

... nhưng toàn bộ tarkho lưu trữ vẫn được tạo trong daemon Docker và phải mất nhiều phút để tạo ...
dflemstr

@dflemstr không chắc thiết lập của bạn là gì nhưng vd docker export ubuntu|tar -t|grep etc/networkmất 3 giây cho tôi.
laktak

Có lẽ bạn đang chạy trên cùng một máy với trình nền Docker nên bạn không cần thực hiện chuyển mạng và ubuntuhình ảnh thực sự rất nhỏ ...
dflemstr

3

Bạn có thể sử dụng cam kết docker để duy trì trạng thái hiện tại của thùng chứa của bạn trong một hình ảnh mới và bắt đầu một thùng chứa tương tác từ hình ảnh này để kiểm tra nội dung.

Từ tài liệu:

Nó có thể hữu ích để cam kết các thay đổi hoặc cài đặt tệp của người chứa thành một hình ảnh mới. Điều này cho phép bạn gỡ lỗi một container bằng cách chạy shell tương tác hoặc xuất dữ liệu đang hoạt động sang máy chủ khác.

Hi vọng điêu nay co ich.


2

Bạn có thể sử dụng nsenter để chạy chương trình kiểm tra của mình (có lẽ phải được bao gồm trong vùng chứa) trong một vùng chứa / không gian tên. Nhưng để gắn kết hệ thống tập tin chứa như nhìn thấy bên trong nó, bạn phải gắn hình ảnh gốc và tất cả các lớp nếu là aufs, hoặc hành động tương đương cho trình ánh xạ thiết bị, btrfs và các công cụ lưu trữ (tương lai) khác được sử dụng, khác nhau trong từng trường hợp. Có lẽ sẽ hiệu quả hơn khi để docker thực hiện công việc cho bạn, chính xác như được yêu cầu và sử dụng nsenter để thực hiện kiểm tra bên trong container.

Có những cách tiếp cận khác. docker diff sẽ hiển thị những tập tin đã thay đổi trong container đó, nếu bạn muốn xem những gì đã thay đổi thay vì những gì trong hình ảnh gốc.

Và đối với dữ liệu phải liên tục và có thể kiểm tra được, có lẽ một mô hình tốt hơn sẽ là đưa nó vào một khối trong bộ chứa và để nó được gắn trên hệ thống tệp thực, hoặc trong một thùng chứa dữ liệu thuần túy, hoặc trong cùng một thùng chứa, nhưng rằng bạn có thể khởi chạy một container khác với chương trình kiểm tra gắn các khối lượng đó từ nó.


1

EDIT: Tôi đã thử giải pháp dưới đây và thật không may, nó không hoạt động tốt trong thực tế. Hệ thống tập tin được gắn kết không phản ánh chính xác hệ thống tập tin chứa (ngay cả với cache=no). Tôi không chắc đây là vấn đề cơ bản hay tôi đang làm gì đó sai.

Bạn có thể cài đặt sshd trong hình ảnh docker và sử dụng docker execđể chạy dịch vụ ssh ( /usr/sbin/sshd -D) trên bộ chứa docker (lưu ý rằng cổng SSH 22 của bộ chứa docker cần phải được hiển thị).

Sau đó, sử dụng docker cpđể sao chép khóa ssh công khai của bạn vào /root/.ssh/authorized_keysthư mục của bộ chứa docker.

Cuối cùng, sử dụng docker inspectđể tìm địa chỉ IP của bộ chứa và gắn kết hệ thống tập tin của bộ chứa bằng cách sử dụng

sudo sshfs -o allow_other,default_permissions,IdentityFile=/path/to/identityfile  root@xxx.xx.x.x:/ /mnt/my_container

Bạn sẽ phải viết một kịch bản để thực hiện công việc này một cách thoải mái trong thực tế.

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.