كيف يمكنني نشر حاوية عامل ميناء وحاوية البيانات المرتبطة بها, بما في ذلك محتويات?

سأبدأ بالاعتراف بأنني جديد جدا على عامل الإرساء وقد أقترب من هذه المشكلة من مجموعة الافتراضات الخاطئة... اسمحوا لي أن أعرف إذا كان هذا هو الحال. لقد رأيت الكثير من النقاش حول مدى فائدة عامل الإرساء للنشر ولكن لا توجد أمثلة على كيفية القيام بذلك بالفعل.

ها هي الطريقة التي الفكر انها ستعمل:

  1. إنشاء حاوية البيانات لعقد بعض البيانات المستمرة على الجهاز أ
  2. قم بإنشاء حاوية التطبيق التي تستخدم وحدات التخزين من حاوية البيانات
  3. القيام ببعض الأعمال ، يحتمل تغيير البيانات في حاوية البيانات
  4. أوقف حاوية التطبيق
  5. ارتكاب وعلامة حاوية البيانات
  6. ادفع حاوية البيانات إلى مستودع (خاص)
  7. سحب وتشغيل الصورة من الخطوة 6 على الجهاز ب
  8. التقاط المكان الذي تركته على الجهاز ب

الخطوة الرئيسية هنا هي الخطوة 5 ، والتي اعتقدت أنها ستوفر الحالة الحالية (بما في ذلك محتويات نظام الملفات). هل يمكن بعد ذلك دفع تلك الدولة إلى مستودع & أمبير; تسحبه من مكان آخر, مما يتيح لك حاوية جديدة التي هي متطابقة أساسا إلى الأصل.

ولكن لا يبدو أن العمل بهذه الطريقة. ما أجده هو أن الخطوة 5 لا تفعل ما أعتقد أنه يفعل أو الخطوة 7 (سحب وتشغيل الصورة) "إعادة تعيين" الحاوية إلى حالتها الأولية.

لقد وضعت مجموعة من ثلاث صور وحاويات لعامل الميناء لاختبار هذا: حاوية بيانات ، كاتب يكتب سلسلة عشوائية في ملف في حاوية البيانات كل 30 ثانية ، وقارئ ببساطة echoوفاق القيمة في ملف حاوية البيانات ومخارج.

حاوية البيانات

تم إنشاؤها باستخدام

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

دوكيرفيل:

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

الكاتب

تم إنشاؤها باستخدام

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

دوكيرفيل:

FROM ubuntu:trusty# Add script#ADD run.sh /usr/local/sbin/run.shRUN chmod 755 /usr/local/sbin/*.shCMD ["/usr/local/sbin/run.sh"]

run.sh

#!/bin/bashwhile :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

هذا البرنامج النصي يكتب سلسلة عشوائية والتاريخ / الوقت ل /datafolder/data.txt في حاوية البيانات.

القارئ

تم إنشاؤها باستخدام

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

دوكيرفيل:

FROM ubuntu:trusty# Add scriptsADD run.sh /run.shRUN chmod 0777 /run.shCMD ["/run.sh"]

run.sh:

#!/bin/bashecho "reading..."echo "-----"cat /datafolder/data.txtecho "-----"

عندما أقوم ببناء وتشغيل هذه الحاويات ، فإنها تعمل بشكل جيد وتعمل بالطريقة التي أتوقعها:

توقف & أمبير; بدء على الجهاز التنمية:

  1. إنشاء حاوية البيانات
  2. تشغيل الكاتب
  3. قم بتشغيل القارئ على الفور ، راجع " لا توجد بيانات هنا!"الرسالة
  4. انتظر قليلا
  5. تشغيل القارئ ، انظر سلسلة عشوائية
  6. أوقف الكاتب
  7. أعد تشغيل الكاتب
  8. تشغيل القارئ ، انظر نفس سلسلة عشوائية

ولكن ارتكاب ودفع لا تفعل ما أتوقع:

  1. إنشاء حاوية البيانات
  2. تشغيل الكاتب
  3. قم بتشغيل القارئ على الفور ، راجع " لا توجد بيانات هنا!"الرسالة
  4. انتظر قليلا
  5. تشغيل القارئ ، انظر سلسلة عشوائية
  6. أوقف الكاتب
  7. ارتكاب وعلامة حاوية البيانات مع docker commit datatest_data myrepository:5000/datatest-data:latest
  8. ادفع إلى المستودع
  9. حذف جميع الحاويات وإعادة إنشائها

في هذه المرحلة ، أتوقع تشغيل القارئ ورؤية نفس السلسلة العشوائية ، حيث تم الالتزام بحاوية البيانات ، ودفعها إلى المستودع ، ثم إعادة إنشائها من نفس الصورة في المستودع. ومع ذلك, ما أراه بالفعل هو "لا توجد بيانات هنا!"رسالة.

يمكن للشخص أن يفسر أين أنا ذاهب الخطأ هنا? أو, بدلا من ذلك, يشير لي إلى مثال على كيفية نشر يتم مع عامل الميناء?

كنت حصلت على افتراض خاطئ حول كيفية عمل وحدات التخزين في عامل الميناء. سأحاول شرح كيفية ارتباط وحدات التخزين بحاويات عامل الإرساء وصور عامل الإرساء ونأمل أن تكون الاختلافات بين أحجام البيانات و حاويات حجم البيانات سوف تصبح واضحة.

أولا دعونا نتذكر بعض التعريفات

صور عامل الميناء

صور عامل الميناء هي في الأساس نظام ملفات الاتحاد + البيانات الوصفية. يمكنك فحص محتوى نظام ملفات اتحاد صورة عامل الميناء باستخدام docker export الأمر ، ويمكنك فحص البيانات الوصفية صورة عامل الميناء مع docker inspect الأمر.

أحجام البيانات

من ال دليل مستخدم عامل الميناء:

وحدة تخزين البيانات عبارة عن دليل مخصص خصيصا داخل حاوية واحدة أو أكثر يتجاوز نظام ملفات الاتحاد لتوفير العديد من الميزات المفيدة للبيانات المستمرة أو المشتركة.

من المهم أن نلاحظ هنا أن وحدة تخزين معينة (مثل الدليل أو الملف الذي يحتوي على بيانات) قابلة لإعادة الاستخدام فقط إذا كانت موجودة على الأقل حاوية عامل ميناء واحدة تستخدمها. لا تحتوي صور عامل الإرساء على وحدات تخزين ، بل تحتوي فقط على بيانات وصفية تخبرنا في النهاية بمكان تركيب وحدات التخزين على نظام ملفات الاتحاد. أحجام البيانات ليست جزءا من نظام ملفات اتحاد حاويات عامل الميناء, فأين هم? تحت /var/lib/docker/volumes على مضيف عامل الميناء (بينما يتم تخزين الحاويات تحت /var/lib/docker/containers).

حاويات حجم البيانات

هذا النوع الخاص من الحاويات ليس له شيء خاص. إنها مجرد حاويات متوقفة باستخدام حجم بيانات بهدف وحيد وفريد من نوعه يتمثل في وجود حاوية واحدة على الأقل باستخدام حجم البيانات هذا. تذكر ، بمجرد حذف الحاوية الأخيرة (قيد التشغيل أو التوقف) باستخدام وحدة تخزين بيانات معينة، سيصبح هذا الحجم غير قابل للوصول من خلال عامل الميناء تشغيل --volumes-from الخيار.

العمل مع حاويات حجم البيانات

كيفية إنشاء حاوية حجم البيانات

الصورة المستخدمة لإنشاء حاوية حجم البيانات ليس لها أهمية لأن هذه الحاوية يمكن أن تظل متوقفة ولا تزال تملأ الغرض منها. لذلك لإنشاء حاوية بيانات اسمه datatest_data للحصول على وحدة تخزين في /datafolder تحتاج فقط لتشغيل:

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

هنا base هو اسم الصورة (واحد صغير مريح) و true هو أمر نقدمه فقط لتجنب رؤية شيطان عامل الميناء يشكو من أمر مفقود. على أي حال بعد أن يكون لديك حاوية توقف اسمه datatest_data لغرض وحيد هو السماح لك للوصول إلى هذا الحجم مع --volumes-from خيار docker run الأمر.

كيف تقرأ من حاوية حجم البيانات

أنا أعرف طريقتين لقراءة حجم البيانات: أول واحد هو من خلال حاوية. إذا لم يكن لديك غلاف في حاوية موجودة للوصول إلى حجم البيانات هذا ، فيمكنك تشغيل حاوية جديدة باستخدام --volumes-from الخيار لغرض وحيد هو قراءة تلك البيانات.

على سبيل المثال:

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

الطريقة الأخرى هي نسخ وحدة التخزين من /var/lib/docker/volumes مجلد. يمكنك اكتشاف اسم وحدة التخزين في هذا المجلد عن طريق فحص البيانات الوصفية لإحدى الحاوية باستخدام وحدة التخزين. انظر هذه الإجابة لمزيد من التفاصيل.

العمل مع وحدات التخزين (منذ عامل الميناء 1.9.0)

كيفية إنشاء وحدة تخزين (منذ عامل الميناء 1.9.0)

قدم عامل الميناء 1.9.0 أمرا جديدا docker volume مما يسمح بإنشاء وحدات تخزين :

docker volume create --name hello

كيف تقرأ من وحدة تخزين (منذ عامل الميناء 1.9.0)

لنفترض أنك قمت بإنشاء وحدة تخزين باسم hello مع docker volume create --name hello، يمكنك تركيبه في حاوية مع -v الخيار :

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

حول ارتكاب ودفع الحاويات

يجب أن يكون من الواضح الآن أنه نظرا لأن أحجام البيانات ليست جزءا من حاوية (نظام ملفات الاتحاد) ، فإن الالتزام بحاوية لإنتاج صورة عامل ميناء جديدة لن يستمر في أي بيانات قد تكون في حجم بيانات.

عمل نسخ احتياطية من أحجام البيانات

دليل المستخدم عامل الميناء لديه مادة لطيفة حول عمل نسخ احتياطية من أحجام البيانات.


مجلدات كاشف المادة الجيدة: http://container42.com/2014/11/03/docker-indepth-volumes/

يمكنك أيضا استخدام حاوية بيانات عامل الميناء لنشر التعليمات البرمجية

لا أعرف ما إذا كانت ممارسة جيدة ، لكنني أفعل ذلك على هذا النحو :

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 fileRUN echo "no data here!" > /data-image/data.txt# expose the data folder #VOLUME /datafolderENTRYPOINT cp -r /data-image/* /datafolder/

يمكنك الآن دفع صورتك واستخدام وحدات التخزين-من ، إلخ ...