ฉันจะเริ่มด้วยการยอมรับว่าฉันค่อนข้างใหม่กับ Docker และฉันอาจกำลังเข้าใกล้ปัญหานี้จากข้อสันนิษฐานที่ไม่ถูกต้อง ... แจ้งให้เราทราบหากเป็นเช่นนั้น ฉันได้เห็นการถกเถียงกันมากมายเกี่ยวกับวิธีที่นักเทียบท่ามีประโยชน์สำหรับการปรับใช้ แต่ไม่มีตัวอย่างของวิธีการทำจริง
นี่คือวิธีที่ฉันคิดว่ามันใช้งานได้:
- สร้างที่เก็บข้อมูลเพื่อเก็บข้อมูลถาวรบางอย่างบนเครื่อง A
- สร้างแอปพลิเคชันคอนเทนเนอร์ซึ่งใช้โวลุ่มจากดาต้าคอนเทนเนอร์
- ทำงานบางอย่างอาจเปลี่ยนข้อมูลในที่เก็บข้อมูล
- หยุดคอนเทนเนอร์แอ็พพลิเคชัน
- กระทำ & ติดแท็กที่เก็บข้อมูล
- ผลักดันภาชนะบรรจุข้อมูลไปยังพื้นที่เก็บข้อมูล (ส่วนตัว)
- ดึงและเรียกใช้รูปภาพจากขั้นตอนที่ 6 บนเครื่อง B
- รับที่ที่คุณทิ้งไว้บนเครื่อง B
ขั้นตอนสำคัญที่นี่คือขั้นตอนที่ 5 ซึ่งฉันคิดว่าจะบันทึกสถานะปัจจุบัน (รวมถึงเนื้อหาของระบบไฟล์) จากนั้นคุณสามารถผลักดันสถานะนั้นไปยังที่เก็บและดึงมันจากที่อื่นเพื่อให้คุณมีคอนเทนเนอร์ใหม่ที่เหมือนกับต้นฉบับ
แต่ดูเหมือนว่าจะไม่ได้ผล สิ่งที่ฉันพบคือว่าขั้นตอนที่ 5 ไม่ได้ทำในสิ่งที่ฉันคิดหรือขั้นตอนที่ 7 (การดึงและเรียกใช้รูปภาพ) "รีเซ็ต" คอนเทนเนอร์เป็นสถานะเริ่มต้น
ฉันได้รวบรวมชุดของอิมเมจและคอนเทนเนอร์สามตัวเพื่อทดสอบสิ่งนี้: data container, นักเขียนที่เขียนสตริงสุ่มลงในไฟล์ใน data container ทุก 30 วินาทีและผู้อ่านที่เพียงแค่echo
ใส่ค่าในข้อมูล ไฟล์คอนเทนเนอร์และออก
ที่เก็บข้อมูล
สร้างด้วย
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
นักเขียน
สร้างด้วย
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"]
run.sh
#!/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
สคริปต์นี้เขียนสตริงแบบสุ่มและวันที่ / เวลาลง/datafolder/data.txt
ในที่เก็บข้อมูล
ผู้อ่าน
สร้างด้วย
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"]
run.sh:
#!/bin/bash
echo "reading..."
echo "-----"
cat /datafolder/data.txt
echo "-----"
เมื่อฉันสร้างและเรียกใช้คอนเทนเนอร์เหล่านี้พวกเขาจะทำงานได้ดีและทำงานอย่างที่ฉันคาดไว้:
หยุด & เริ่มบนเครื่องพัฒนา:
- สร้างที่เก็บข้อมูล
- เรียกใช้นักเขียน
- เรียกใช้ผู้อ่านทันทีดู "ไม่มีข้อมูลที่นี่!" ข่าวสาร
- รอสักครู่
- เรียกใช้ผู้อ่านดูสตริงแบบสุ่ม
- หยุดนักเขียน
- รีสตาร์ทตัวเขียน
- เรียกใช้ผู้อ่านดูสตริงสุ่มเดียวกัน
แต่การกระทำและการผลักดันอย่าทำสิ่งที่ฉันคาดหวัง
- สร้างที่เก็บข้อมูล
- เรียกใช้นักเขียน
- เรียกใช้ผู้อ่านทันทีดู "ไม่มีข้อมูลที่นี่!" ข่าวสาร
- รอสักครู่
- เรียกใช้ผู้อ่านดูสตริงแบบสุ่ม
- หยุดนักเขียน
- กระทำ & ติดแท็กคอนเทนเนอร์ข้อมูลด้วย
docker commit datatest_data myrepository:5000/datatest-data:latest
- ผลักดันไปยังพื้นที่เก็บข้อมูล
- ลบคอนเทนเนอร์ทั้งหมด & สร้างใหม่
ณ จุดนี้ฉันคาดว่าจะเรียกใช้ตัวอ่าน & ดูสตริงแบบสุ่มเดียวกันเนื่องจากมีการส่งข้อมูลไปยังที่เก็บข้อมูลผลักไปยังที่เก็บข้อมูลแล้วสร้างใหม่จากอิมเมจเดียวกันในที่เก็บ อย่างไรก็ตามสิ่งที่ฉันเห็นจริง ๆ คือ "ไม่มีข้อมูลที่นี่!" ข่าวสาร
บางคนสามารถอธิบายได้ว่าฉันผิดตรงไหนหรือไม่ หรืออีกวิธีหนึ่งคือชี้ให้ฉันเห็นตัวอย่างของวิธีการปรับใช้กับ Docker