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:
- tạo bộ chứa dữ liệu để giữ một số dữ liệu liên tục trên máy A
- tạo bộ chứa ứng dụng sử dụng các khối từ bộ chứa dữ liệu
- 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
- dừng thùng chứa ứng dụng
- cam kết và gắn thẻ bộ chứa dữ liệu
- đẩy bộ chứa dữ liệu đến một kho lưu trữ (riêng tư)
- kéo và chạy hình ảnh từ bước 6 trên máy B
- 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à echo
giá 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.txt
trong 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:
- tạo bộ chứa dữ liệu
- điều hành nhà văn
- chạy trình đọc ngay lập tức, xem "không có dữ liệu ở đây!" thông điệp
- chờ một lúc
- chạy trình đọc, xem chuỗi ngẫu nhiên
- dừng nhà văn
- khởi động lại nhà văn
- 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:
- tạo bộ chứa dữ liệu
- điều hành nhà văn
- chạy trình đọc ngay lập tức, xem "không có dữ liệu ở đây!" thông điệp
- chờ một lúc
- chạy trình đọc, xem chuỗi ngẫu nhiên
- dừng nhà văn
- cam kết và gắn thẻ bộ chứa dữ liệu với
docker commit datatest_data myrepository:5000/datatest-data:latest
- đẩy đến kho lưu trữ
- 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?