Làm cách nào để triển khai bộ chứa docker và bộ chứa dữ liệu liên quan, bao gồm cả nội dung?


18

Tôi sẽ bắt đầu bằng cách thừa nhận tôi khá mới đối với Docker và tôi có thể đang tiếp cận vấn đề này từ các giả định sai lầm ... hãy cho tôi biết nếu đó là trường hợp. Tôi đã thấy rất nhiều cuộc thảo luận về cách Docker hữu ích cho việc triển khai nhưng không có ví dụ nào về cách thực sự được thực hiện.

Đây là cách tôi nghĩ nó sẽ hoạt động:

  1. tạo bộ chứa dữ liệu để giữ một số dữ liệu liên tục trên máy A
  2. tạo bộ chứa ứng dụng sử dụng các khối từ bộ chứa dữ liệu
  3. làm một số công việc, có khả năng thay đổi dữ liệu trong bộ chứa dữ liệu
  4. dừng thùng chứa ứng dụng
  5. cam kết và gắn thẻ bộ chứa dữ liệu
  6. đẩy bộ chứa dữ liệu đến một kho lưu trữ (riêng tư)
  7. kéo và chạy hình ảnh từ bước 6 trên máy B
  8. chọn nơi bạn rời khỏi máy B

Bước quan trọng ở đây là bước 5, mà tôi nghĩ sẽ lưu trạng thái hiện tại (bao gồm cả nội dung của hệ thống tệp). Sau đó, bạn có thể đẩy trạng thái đó đến một kho lưu trữ và kéo nó từ một nơi khác, cung cấp cho bạn một thùng chứa mới về cơ bản giống hệt với bản gốc.

Nhưng nó dường như không hoạt động theo cách đó. Những gì tôi tìm thấy là bước 5 không làm những gì tôi nghĩ hoặc bước 7 (kéo và chạy hình ảnh) "đặt lại" vùng chứa về trạng thái ban đầu.

Tôi đã tập hợp một bộ ba hình ảnh và bộ chứa Docker để kiểm tra điều này: một bộ chứa dữ liệu, một nhà văn viết một chuỗi ngẫu nhiên vào một tệp trong bộ chứa dữ liệu cứ sau 30 giây và một bộ đọc chỉ đơn giản là echogiá trị trong dữ liệu tập tin container và thoát.

Kho chứa dữ liệu

Được tạo nên bởi

docker run \
    --name datatest_data \
    -v /datafolder \
    myrepository:5000/datatest-data:latest

Dockerfile:

FROM ubuntu:trusty

# make the data folder
#
RUN mkdir /datafolder

# write something to the data file
#
RUN echo "no data here!" > /datafolder/data.txt

# expose the data folder
#
VOLUME /datafolder

nhà văn

Được tạo nên bởi

docker run \
    --rm \
    --name datatest_write \
    --volumes-from datatest_data \
    myrepository:5000/datatest-write:latest

Dockerfile:

FROM ubuntu:trusty

# Add script
#
ADD run.sh /usr/local/sbin/run.sh
RUN chmod 755 /usr/local/sbin/*.sh

CMD ["/usr/local/sbin/run.sh"]

chạy

#!/bin/bash

while :
do
    sleep 30s

    NEW_STRING=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)

    echo "$NEW_STRING" >> /datafolder/data.txt

    date >> /datafolder/data.txt

    echo "wrote '$NEW_STRING' to file"
done

Kịch bản lệnh này viết một chuỗi ngẫu nhiên và ngày / giờ vào /datafolder/data.txttrong thùng chứa dữ liệu.

Người đọc

Được tạo nên bởi

docker run \
    --rm \
    --name datatest_read \
    --volumes-from datatest_data \
    myrepository:5000/datatest-read:latest

Dockerfile:

FROM ubuntu:trusty

# Add scripts
ADD run.sh /run.sh
RUN chmod 0777 /run.sh

CMD ["/run.sh"]

chạy.sh:

#!/bin/bash

echo "reading..."

echo "-----"

cat /datafolder/data.txt

echo "-----"

Khi tôi xây dựng và chạy các container này, chúng chạy tốt và hoạt động theo cách tôi mong đợi:

Dừng và bắt đầu trên máy phát triển:

  1. tạo bộ chứa dữ liệu
  2. điều hành nhà văn
  3. chạy trình đọc ngay lập tức, xem "không có dữ liệu ở đây!" thông điệp
  4. chờ một lúc
  5. chạy trình đọc, xem chuỗi ngẫu nhiên
  6. dừng nhà văn
  7. khởi động lại nhà văn
  8. chạy trình đọc, xem chuỗi ngẫu nhiên tương tự

Nhưng cam kết và thúc đẩy không làm những gì tôi mong đợi:

  1. tạo bộ chứa dữ liệu
  2. điều hành nhà văn
  3. chạy trình đọc ngay lập tức, xem "không có dữ liệu ở đây!" thông điệp
  4. chờ một lúc
  5. chạy trình đọc, xem chuỗi ngẫu nhiên
  6. dừng nhà văn
  7. cam kết và gắn thẻ bộ chứa dữ liệu với docker commit datatest_data myrepository:5000/datatest-data:latest
  8. đẩy đến kho lưu trữ
  9. xóa tất cả các container và tạo lại chúng

Tại thời điểm này, tôi sẽ chạy trình đọc và xem cùng một chuỗi ngẫu nhiên, vì bộ chứa dữ liệu đã được cam kết, được đẩy vào kho lưu trữ và sau đó được tạo lại từ cùng một hình ảnh trong kho lưu trữ. Tuy nhiên, những gì tôi thực sự thấy là "không có dữ liệu ở đây!" thông điệp.

Ai đó có thể giải thích nơi tôi sẽ sai ở đây? Hoặc, thay vào đó, chỉ cho tôi một ví dụ về cách triển khai được thực hiện với Docker?

Câu trả lời:


22

Bạn có một giả định sai về cách khối lượng làm việc trong docker. Tôi sẽ cố gắng giải thích khối lượng liên quan đến bộ chứa docker và hình ảnh docker và hy vọng sự khác biệt giữa khối lượng dữ liệu và bộ chứa khối lượng dữ liệu sẽ trở nên rõ ràng.

Trước tiên hãy nhớ lại một vài định nghĩa

Docker hình ảnh

Hình ảnh Docker về cơ bản là một hệ thống tập tin + siêu dữ liệu công đoàn. Bạn có thể kiểm tra nội dung của hệ thống tập tin hình ảnh docker bằng docker exportlệnh và bạn có thể kiểm tra siêu dữ liệu hình ảnh docker bằng docker inspectlệnh.

Khối lượng dữ liệu

từ hướng dẫn sử dụng Docker :

Khối lượng dữ liệu là một thư mục được chỉ định đặc biệt trong một hoặc nhiều vùng chứa bỏ qua Hệ thống tệp Liên minh để cung cấp một số tính năng hữu ích cho dữ liệu được chia sẻ hoặc liên tục.

Điều quan trọng cần lưu ý ở đây là một ổ đĩa nhất định (như thư mục hoặc tệp chứa dữ liệu) chỉ có thể được sử dụng lại nếu nó tồn tại ít nhất một thùng chứa docker sử dụng nó. Hình ảnh Docker không có khối lượng, chúng chỉ có siêu dữ liệu mà cuối cùng sẽ cho biết khối lượng sẽ được gắn trên hệ thống tập tin công đoàn. Khối lượng dữ liệu không phải là một phần của hệ thống tập tin container docker, vậy chúng ở đâu? bên dưới /var/lib/docker/volumesmáy chủ docker (trong khi container được lưu trữ bên dưới /var/lib/docker/containers).

Container khối lượng dữ liệu

Đó là loại container đặc biệt không có gì đặc biệt. Chúng chỉ dừng các container sử dụng một khối lượng dữ liệu với mục tiêu duy nhất và duy nhất là có ít nhất một container sử dụng khối lượng dữ liệu đó. Hãy nhớ rằng, ngay khi bộ chứa cuối cùng (đang chạy hoặc dừng) sử dụng một khối dữ liệu đã cho sẽ bị xóa, âm lượng đó sẽ không thể truy cập được thông qua tùy chọn chạy docker --volumes-from .

Làm việc với các thùng chứa dữ liệu

Cách tạo một thùng chứa dữ liệu

Hình ảnh được sử dụng để tạo một bộ chứa khối lượng dữ liệu không có tầm quan trọng vì một bộ chứa như vậy có thể vẫn dừng và vẫn hoàn thành mục đích của nó. Vì vậy, để tạo một thùng chứa dữ liệu có tên datatest_datacho một ổ đĩa, /datafolderbạn chỉ cần chạy:

docker run --name datatest_data --volume /datafolder busybox true

Đây baselà tên hình ảnh (một cái nhỏ tiện lợi) và truelà một lệnh chúng tôi cung cấp chỉ để tránh nhìn thấy daemon docker phàn nàn về một lệnh bị thiếu. Dù sao sau khi bạn có một container dừng được đặt tên datatest_datavới mục đích duy nhất là cho phép bạn đạt được âm lượng đó với --volumes-fromtùy chọn của docker runlệnh.

Cách đọc từ một thùng chứa dữ liệu

Tôi biết hai cách đọc một khối lượng dữ liệu: cách thứ nhất là thông qua một container. Nếu bạn không thể có một vỏ vào một thùng chứa hiện có để truy cập vào khối lượng dữ liệu đó, bạn có thể chạy một thùng chứa mới với --volumes-fromtùy chọn cho mục đích duy nhất là đọc dữ liệu đó.

Ví dụ:

docker run --rm --volumes-from datatest_data busybox cat /datafolder/data.txt

Cách khác là sao chép âm lượng từ /var/lib/docker/volumesthư mục. Bạn có thể khám phá tên của ổ đĩa trong thư mục đó bằng cách kiểm tra siêu dữ liệu của một trong các thùng chứa bằng cách sử dụng ổ đĩa. Xem câu trả lời này để biết chi tiết.

Làm việc với khối lượng (kể từ Docker 1.9.0)

Cách tạo âm lượng (kể từ Docker 1.9.0)

Docker 1.9.0 đã giới thiệu một lệnh mới docker volumecho phép tạo khối lượng:

docker volume create --name hello

Cách đọc từ một ổ đĩa (kể từ Docker 1.9.0)

Hãy nói rằng bạn tạo ra một khối lượng được đặt tên hellovới docker volume create --name hello, bạn có thể gắn nó vào một container với -vtùy chọn:

docker run -v hello:/data busybox ls /data

Về cam kết và đẩy container

Bây giờ, rõ ràng là vì khối lượng dữ liệu không phải là một phần của bộ chứa (hệ thống tập tin liên kết), việc cam kết một bộ chứa để tạo ra một hình ảnh docker mới sẽ không tồn tại bất kỳ dữ liệu nào có trong một khối dữ liệu.

Tạo bản sao lưu khối lượng dữ liệu

Hướng dẫn sử dụng docker có một bài viết hay về cách sao lưu khối lượng dữ liệu .


Bài viết kiểm tra số lượng tốt bài viết: http://container42.com/2014/11/03/docker-indepth-volume/


Có vẻ như "Hình ảnh được sử dụng để tạo một thùng chứa dữ liệu không có tầm quan trọng" không hoàn toàn chính xác. Chỉ cần thử với một hình ảnh "cào" sẽ cung cấp cho bạn "exec:" true ": không tìm thấy tệp thực thi"
tcurdt

Mặc dù có lỗi này, container của bạn sẽ được tạo ra để hoàn thành vai trò là người giữ âm lượng
Thomasleveil

1
Hừm - có lẽ đáng để mở một vấn đề cho điều đó sau đó.
tcurdt

không, hành vi đó được mong đợi vì hình ảnh đầu là hình ảnh trống không thể có /bin/truenhị phân (hoặc bất kỳ hình thức nào khác)
Thomasleveil

1
Một điều nữa thôi. Bạn đã nói rằng "ngay khi bộ chứa cuối cùng (đang chạy hoặc dừng) sử dụng một khối lượng dữ liệu nhất định bị xóa, docker sẽ hủy khối lượng dữ liệu đó từ / var / lib / docker / volume.", Nhưng điều đó không thực sự đúng: chỉ cần xem: docs.docker.com/userguide/dockervolume (Khối lượng dữ liệu vẫn tồn tại ngay cả khi chính bộ chứa bị xóa. Bạn phải chỉ định docker rm -vlệnh chống lại bộ chứa cuối cùng để xóa một ổ đĩa)
juanra

1

Bạn cũng có thể sử dụng bộ chứa dữ liệu docker để triển khai mã

Tôi không biết nếu đó là một thực hành tốt, nhưng tôi làm như vậy:

FROM ubuntu:trusty

# make the data folder
#
RUN mkdir /data-image

# in my case, I have a 
# ADD dest.tar /data-image/
#
# but to follow your example :
# write something to the data file
RUN echo "no data here!" > /data-image/data.txt

# expose the data folder 
#
VOLUME /datafolder

ENTRYPOINT cp -r /data-image/* /datafolder/

Bây giờ bạn có thể đẩy hình ảnh của mình và sử dụng âm lượng từ, v.v ...


Đây là những gì tôi đang tìm kiếm, nhưng câu trả lời được chấp nhận đề cập rõ ràng điều này không thể được thực hiện. Gonna thử nó ngay bây giờ.
andho

1
Ở cái nhìn thứ hai, câu trả lời được chấp nhận cho biết các khối lượng (hoặc dữ liệu trong đó) sẽ không được cam kết, nhưng bạn có thể thêm dữ liệu vào vùng chứa bằng cách sử dụng COPYhoặc ADDtạo âm lượng bằng cách sử dụng VOLUMEtrong Dockerfile.
andho
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.