Docker için oldukça yeni olduğumu itiraf ederek başlayacağım ve bu soruna yanlış varsayımlardan yaklaşıyor olabilirim ... durumun bu olup olmadığını bana bildirin. Docker'ın dağıtım için nasıl yararlı olduğu konusunda birçok tartışma gördüm, ancak bunun gerçekte nasıl yapıldığına dair bir örnek yok.
İşte işe yarayacağını düşündüğüm yol :
- A makinesinde bazı kalıcı verileri tutmak için veri kabını oluşturma
- veri kapsayıcısından birimler kullanan uygulama kapsayıcısını oluşturma
- veri kapsayıcısındaki verileri potansiyel olarak değiştirerek biraz çalışma yapın
- uygulama kabını durdur
- veri taşıyıcısını taahhüt et ve etiketle
- veri kapsayıcısını (özel) bir depoya gönderme
- B makinesinde 6. adımdaki görüntüyü çekin ve çalıştırın
- B makinesinde kaldığınız yerden devam edin
Buradaki önemli adım, geçerli durumu (dosya sisteminin içeriği dahil) kaydedeceğini düşündüğüm adım 5'tir. Daha sonra bu durumu bir depoya aktarabilir ve başka bir yerden çekerek, orijinaliyle aynı olan yeni bir kap elde edebilirsiniz.
Ancak bu şekilde çalışmıyor gibi görünüyor. Bulduğum şey, ya adım 5'in düşündüğüm şeyi yapmaması ya da adım 7 (görüntüyü çekme ve çalıştırma) kapsayıcıyı ilk durumuna "sıfırlar".
Bunu test etmek için üç Docker görüntüsü ve kapsayıcısını bir araya getirdim: bir veri kabı, her 30 saniyede bir veri kabındaki bir dosyaya rastgele bir dize yazan bir yazar ve sadece echo
verilerdeki değeri es olan bir okuyucu konteyner dosyası ve çıkışları.
Veri taşıyıcısı
İle oluşturuldu
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
yazar
İle oluşturuldu
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
Bu komut dosyası /datafolder/data.txt
, veri taşıyıcısına rastgele bir dize ve tarih / saat yazar .
Okuyucu
İle oluşturuldu
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 "-----"
Bu kapları oluşturup çalıştırdığımda, iyi çalışıyorlar ve beklediğim gibi çalışıyorlar:
Geliştirme makinesinde Durdur ve Başlat:
- veri kabını oluştur
- yazarı çalıştır
- okuyucuyu hemen çalıştırın, "burada veri yok!" İleti
- Bir süre bekleyin
- okuyucuyu çalıştırın, rastgele dizeye bakın
- yazarı durdur
- yazarı yeniden başlat
- okuyucuyu çalıştırın, aynı rastgele dizeye bakın
Ama taahhüt ve itme beklediğim şeyi yapmaz:
- veri kabını oluştur
- yazarı çalıştır
- okuyucuyu hemen çalıştırın, "burada veri yok!" İleti
- Bir süre bekleyin
- okuyucuyu çalıştırın, rastgele dizeye bakın
- yazarı durdur
- veri kapsayıcısını taahhüt ve etiketle
docker commit datatest_data myrepository:5000/datatest-data:latest
- depoya zorla
- tüm kapları sil ve yeniden oluştur
Bu noktada, veri kabı işlendiğinden, havuza itildiğinden ve daha sonra havuzdaki aynı görüntüden yeniden oluşturulduğundan okuyucuyu çalıştırmayı ve aynı rastgele dizeyi görmeyi beklerdim. Ancak, aslında gördüğüm "burada veri yok!" İleti.
Birisi nerede yanlış gittiğimi açıklayabilir mi? Ya da, alternatif olarak, beni Docker ile dağıtımın nasıl yapıldığına dair bir örneğe yönlendirin?