Tại sao docker-machine xóa dữ liệu khi khởi động lại?


9

Tôi đang sử dụng Docker Toolbox trên OSX.

Tôi đã tạo một thùng chứa dữ liệu để lưu trữ dữ liệu liên tục: https://docs.docker.com/userguide/dockervolume/#creating-and-mounting-a-data-volume-container .

Tôi đã kiểm tra rằng dữ liệu này thực sự được lưu trữ trên VM boot2docker (được tạo bởi docker-machine) chứ không phải trên container, do đó nó sẽ tồn tại. Tuy nhiên, "docker-machine restart" sẽ xóa dữ liệu tùy chỉnh này trên vm.

Tôi không thể tìm thấy tài liệu về những gì đang xảy ra. Tôi tìm thấy một bài đăng trên diễn đàn đề cập rằng dữ liệu trong / var / lib / docker sẽ được lưu giữ, nhưng tôi không thể tìm thấy bất kỳ tài liệu chính thức nào nêu rõ điều đó và cũng có vẻ lạ khi xem hướng dẫn lưu trữ liên tục ở trên không sử dụng đường dẫn này hoặc thậm chí đề cập rằng dữ liệu của bạn sẽ bị xóa.

Điều này có được mong đợi không và nếu có thì có tài liệu chính thức nào về đường dẫn chính xác để lưu trữ dữ liệu liên tục không?


Chỉnh sửa: Thêm ví dụ về thất bại senario

$ docker-machine ssh alt
docker@alt:~$ docker run -v /data:/var/lib/mysql --name mydata busybox sh -c "echo 'hello' > /var/lib/mysql/hello"
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
hello
docker@alt:~$ exit
$ docker-machine restart alt
Starting VM...
$ docker-machine ssh alt
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
cat: can't open '/var/lib/mysql/hello': No such file or directory

Câu trả lời:


8

Điều này chắc chắn nên hoạt động:

$ docker-machine ssh default
docker@default:~$ docker run -v /data --name mydata busybox true
docker@default:~$ docker run --volumes-from mydata busybox sh -c "echo hello >/data/hello"
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello
docker@default:~$ exit
$ docker-machine restart default
Starting VM...
$ docker-machine ssh default
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello

Bạn có thể giải thích thêm về các bước để tái tạo vấn đề của bạn?

boot2docker có hệ thống tập tin chỉ đọc (sẽ bị xóa khi khởi động lại) ngoại trừ:

  1. Các thùng chứa và dữ liệu của chúng (khối lượng) - đây là những gì bạn đọc về /var/lib/docker
  2. Docker hình ảnh
  3. Cấu hình Docker (ví dụ: /var/lib/boot2docker/profilenơi các cờ daemon có thể được điều chỉnh)

Xin chào, tôi vừa đề nghị chỉnh sửa phản hồi của bạn. Ý của bạn là chỉ định hình ảnh busybox trong các lệnh chạy thứ 2 và 4? Không làm như vậy docker cố tải xuống hình ảnh gọi là "sh" và "cat" mà tôi nghi ngờ không phải là những gì bạn dự định. Tôi sẽ thêm một ví dụ thất bại ở trên.
Gerry

Cảm ơn sự giúp đỡ của bạn. Cả bạn và @ mc0e đều giúp với cái này vì vậy tôi đã cho bạn đánh dấu và anh ta tiền thưởng (cũng như +1 cho cả hai). Tôi hy vọng bạn xem xét công bằng này.
Gerry

1
À đúng rồi, gõ sai. Xin lỗi vì lỗi đánh máy.
nathanleclaire

Không cần xin lỗi. Tôi chỉ kiểm tra hai lần để chắc chắn rằng tôi đã không hiểu lầm. Chúc mừng cho tất cả sự giúp đỡ của bạn với điều này.
Gerry

6

Tôi không sử dụng boot2docker, nhưng nếu / dữ liệu bị xóa khi khởi động lại, đó là nơi khối lượng của bạn đang được lưu trữ ( docker run -v /data:/var/lib/mysql), vì vậy nó sẽ bị mất.

Những gì bạn đang làm cũng là kết hợp hai mẫu khác nhau để xử lý lưu lượng lớn. Để có được sự bền bỉ, các container có thể gắn kết các khối lượng từ một vị trí được chỉ định trên hệ thống máy chủ (được coi là tồn tại lâu dài) hoặc chúng có thể được liên kết với một thùng chứa dữ liệu và được gắn với --volumes-from. Có vẻ như cách tiếp cận hệ thống tập tin máy chủ không phù hợp với boot2docker và bạn chỉ nên sử dụng mẫu khối lượng dữ liệu (chỉ).

Có lẽ bạn nên tạo bộ chứa dữ liệu của mình -v /var/lib/mysql, chứ không phải -v /data:/var/lib/mysql.


Tạo một ổ đĩa bằng cách sử dụng cờ -v và sau đó sử dụng các ổ đĩa từ thùng chứa đó trong các thùng chứa khác bằng cách sử dụng --volume-from chính xác là những gì tài liệu hiển thị mặc dù: docs.docker.com/userguide/dockervolume/. Tôi sẽ mong rằng nếu -v / location biết rằng nó phải liên quan đến / var / lib / docker / volume sau đó thêm dấu hai chấm không nên thay đổi điều đó. Ít nhất điều này là không trực quan. -v / var / lib / mysql! = -v / var / lib / mysql: / var / lib / mysql Cũng có vẻ như các tài liệu mysql- docker
Gerry

Cảm ơn sự giúp đỡ của bạn. Cả bạn và @nathanleclaire đều giúp đỡ điều này vì vậy tôi đã đưa cho bạn tiền thưởng (vì nó đáng giá hơn) và tôi đã đánh dấu vào nathanleclaire (cũng như +1 cho cả hai). Tôi hy vọng bạn nghĩ rằng điều này là công bằng.
Gerry

@Gerry Chắc chắn tạo một khối lượng và sau đó sử dụng nó thông qua --volume-from được khuyên dùng. Gắn kết phù du / dữ liệu trên container của bạn thì không.
mc0e

Vâng, rắc rối là tôi không biết / dữ liệu là phù du cho đến khi tôi khởi động lại.
Gerry

0

Lưu ý rằng tôi đang sử dụng docker cho mac beta đang sử dụng xhyve vm.

Nội dung của / var / lib / boot2docker sẽ được duy trì giữa các lần khởi động lại máy. Vì vậy, nếu bạn muốn một số tập tin có sẵn trên vm của bạn, hãy đặt chúng vào thư mục này.

Nếu bạn muốn chúng có thể truy cập được ở một vị trí khác để chạy các container docker thì bạn có thể thêm phần sau vào / var / lib / boot2docker / profile:

mkdir -p /desired/path
ln -s /var/lib/boot2docker/your.file /desire/path/your.file

Nếu bạn muốn thêm cấu hình khác vào các tệp hệ thống sẽ tồn tại giữa các lần khởi động lại vm, chẳng hạn như các giá trị bổ sung trong tệp máy chủ của bạn thì bạn có thể thêm một lệnh như lệnh bên dưới vào / var / lib / boot2docker / profile:

echo '127.0.0.1 your.domain.com' >> /etc/hosts

Hy vọng nó giú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.