2015-02-18 17 views
22

Bu çok basit bir soru, ama biraz uğraşıyorum ve düzgün anladığımdan emin olmak isterim.Docker konteynırları dosya değişikliklerini koruyor mu?

Bir kapsayıcı bir görüntüden başlatıldıktan sonra ve içerisindeki dosyalarda bazı değişiklikler yapıldıktan sonra (örn: kapta çalışan bir Web Uygulamasının DB'sinde depolanan bazı veriler), kapsayıcıyla aynı tarihle çalışmaya devam etmenin uygun yolu nedir? dur ve yeniden başlat

Anlayışım, kap durdurulduğunda/bittiğinde (örn .: etkileşimli bir oturumdan sonra çıkış), bu kapsayıcının tüm dosya değişiklikleriyle birlikte gittiği konusunda doğru mu? Bazı dosya değişikliklerini saklamak istiyorsam kapsayıcının durumunu görüntünün yeni bir görüntüsüne/yeni sürümüne eklemem gerekiyor mu?

sayesinde Julian

cevap

37

benim anlayış konteyner (interaktif seanstan sonra yani .: çıkış)/bitmiş durdurulur kez, o zaman bu kapsayıcı tüm dosya değişiklikleri ile birlikte gitmiş olduğu doğru mu? Çıkan sonra

Hayır, bir kap sen docker run için --rm argümanı kullanarak başlattı sürece, devam etmektedir. Biz exit bizim kabuk ed yana

, konteyner artık çalışmadığı
$ docker run -it busybox sh 
/# date > example_file 
/# exit 

: Bu düşünün

$ docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS     NAMES 

Ama biz -a seçeneği olsaydı, bunu görebilirsiniz:

CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS      PORTS     NAMES 
79aee3e2774e  busybox:latest  "sh"    About a minute ago Exited (0) 54 seconds ago       loving_fermat  

Ve biz yeniden başlatabilir ve yeniden ekleyebilirsiniz:

$ docker start 79aee3e2774e 
$ docker attach 79aee3e2774e 
<i press RETURN> 
/# 

Ve daha önce oluşturduğunuz dosyanın hâlâ orada olduğunu:

/ # cat example_file 
Wed Feb 18 01:51:38 UTC 2015 
/# 

Yeni ardından yeni kapları başlatmak için kullanabileceğiniz resim, veya paylaşımına kabın içeriğini kaydetmek için docker commit komutunu kullanabilirsiniz Bir başkasıyla, vb. Bununla birlikte, docker commit'u kullanarak kendinizi düzenli bulursanız, muhtemelen kendinize bir zarar vermektesiniz. Genel olarak, kapsayıcıların salt okunur olması ve Dockerfile ve docker build kullanarak yeni görüntüler oluşturması daha kolay yönetilebilir. Bu model, veri kullanılarak

tipik olarak ya ana birim bağlar yoluyla ya da bir veri tek bir kap kullanarak konteyner dışında tutulur.

+0

* facepalm * --rm (!!!) - çok fazla google-paste hatası kullanıyordum. Aptalca bir soru olduğunu biliyordum. –

+1

Her durumda, kapsamlı açıklama için çok teşekkür ederim. Bütün model şimdi bana çok daha mantıklı geliyor. Benim durumum için, kabın dışında olabildiğince fazla veriyi kullanıyorum ve ana bilgisayar biriminin yuvalarına takılıyorum. Sadece bazen bir şeyleri yüklemek için kapsayıcıyı değiştirmek zorundayım. Bu açıklama ile kapsayıcıyı sadece yeni bir görüntüye bırakabilirim ve diğer devlerle paylaşılmayı hak ettiğinde sadece bir kez olsun. Tekrar teşekkürler, harika cevap! –

+0

BTW, başlangıçta ironik yazım tarzını çok sevdim: "... bir konteyner var olduktan sonra devam eder ...". Kulağa sert bir kap gibi geliyor. –

9

Sen docker commit container_name new_image_name

Ayrıca ile bitmiş kaptan veri dosyalarını ayıklamak görüntüye, dosya sistemi değişiklikleri ile, bitmiş bir konteyner kaydedebilirsiniz docker ps -a

ile bitmiş konteyner görebilirsiniz: docker cp containerID:/path/to/find/files /path/to/put/copy

Ayrıca, "ileriyi planlayabilirsiniz" ve kapsayıcıyı ana bilgisayardan bir dizini takarak geçici bir kapsayıcıda kalıcı olarak gerek duyacağınız verileri yakalamamanız gerektiğini unutmayın.

docker run -v /dir/on/host:/dir/on/container -it ubuntu:14.04 
İlgili konular