Docker görüntüsü ile konteyner arasındaki fark nedir?

Docker kullanırken, bir temel imaj ile başlarız. Onu başlatırız, değişiklikler yaparız ve bu değişiklikler başka bir imaj oluşturan katmanlara kaydedilir.

Sonuçta PostgreSQL örneğim için bir imajım ve web uygulamam için bir imajım var ve bunlardaki değişiklikler kalıcı hale getirilmeye devam ediyor.

Konteyner nedir?

Çözüm

Bir imaj örneğine konteyner denir. Tanımladığınız gibi bir katmanlar kümesi olan bir imajınız var. Bu imajı başlatırsanız, bu imajın çalışan bir konteynerine sahip olursunuz. Aynı imajın çalışan birçok konteynerine sahip olabilirsiniz.

Tüm imajlarınızı docker images ile, çalışan konteynerlerinizi ise docker ps ile görebilirsiniz (ve tüm konteynerleri docker ps -a ile görebilirsiniz).

Yani bir imajın çalışan bir örneği bir konteynerdir.

Yorumlar (14)

Docker Dağıtımlarını Otomatikleştirme]1 başlıklı makalemden:

Docker Görüntüleri vs Konteynerler

Dockerland'de images ve containers vardır. İkisi yakından ilişkilidir, ancak farklıdır. Benim için bu ikiliği kavramak Docker'ı son derece netleştirdi.

İmaj nedir?

İmaj, esasen bir konteynerin anlık görüntüsü olan atıl, değişmez bir dosyadır. İmajlar build komutu ile oluşturulur ve run ile başlatıldığında bir konteyner üretirler. Görüntüler registry.hub.docker.com gibi bir Docker kayıt defterinde saklanır. Oldukça büyük olabildikleri için, imajlar diğer imajların katmanlarından oluşacak şekilde tasarlanmıştır ve imajları ağ üzerinden aktarırken minimum miktarda veri gönderilmesine izin verir.

Yerel görüntüler docker images çalıştırılarak listelenebilir:

REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu                    13.10               5e019ab7bf6d        2 months ago        180 MB
ubuntu                    14.04               99ec81b80c55        2 months ago        266 MB
ubuntu                    latest              99ec81b80c55        2 months ago        266 MB
ubuntu                    trusty              99ec81b80c55        2 months ago        266 MB
                                  4ab0d9120985        3 months ago        486.5 MB

Not edilmesi gereken bazı şeyler:__

  1. GÖRÜNTÜ KİMLİĞİ, bir görüntü için gerçek tanımlayıcının ilk 12 karakteridir. Belirli bir görüntü için çok sayıda etiket oluşturabilirsiniz, ancak hepsinin kimliği aynı olacaktır (yukarıdaki gibi).
  2. SANAL BOYUT sanaldır çünkü altta yatan tüm farklı katmanların boyutlarını toplar. Bu, bu sütundaki tüm değerlerin toplamının muhtemelen tüm bu görüntüler tarafından kullanılan disk alanından çok daha büyük olduğu anlamına gelir.
  3. REPOSITORY sütunundaki değer, docker build komutunun -t bayrağından veya mevcut bir görüntünün docker taglenmesinden gelir. Görüntüleri sizin için anlamlı olan bir isimlendirme kullanarak etiketlemekte özgürsünüz, ancak docker'ın bir docker push' veyadocker pull' işleminde etiketi kayıt yeri olarak kullanacağını bilin.
  4. Bir etiketin tam biçimi [REGISTRYHOST/][USERNAME/]NAME[:TAG] şeklindedir. Yukarıdaki ubuntu için, REGISTRYHOST registry.hub.docker.com olarak çıkarılır. Dolayısıyla, my-application adlı görüntünüzü docker.example.com adresindeki bir kayıt defterinde depolamayı planlıyorsanız, bu görüntüyü docker.example.com/my-application olarak etiketlemelisiniz.
  5. TAG sütunu sadece full etiketinin [:TAG] kısmıdır. Bu talihsiz bir terminolojidir.
  6. En son etiketi sihirli değildir, sadece bir etiket belirtmediğinizde varsayılan etikettir.
  7. Sadece IMAGE ID'leri ile tanımlanabilen etiketsiz görüntülere sahip olabilirsiniz. Bunlar `` TAG ve REPOSITORY alacaklardır. Bunları unutmak kolaydır.

Görüntüler hakkında daha fazla bilgi Docker belgeleri ve sözlük'dan edinilebilir.

Konteyner nedir?

Bir programlama metaforu kullanmak gerekirse, eğer bir görüntü bir sınıfsa, bir konteyner de bir sınıfın örneğidir - bir çalışma zamanı nesnesi. Konteynerler umarım Docker'ı kullanmanızın nedenidir; uygulamaları çalıştırmak için bir ortamın hafif ve taşınabilir kapsülleridir.

Docker ps` ile yerel çalışan konteynerleri görüntüleyin:

CONTAINER ID        IMAGE                               COMMAND                CREATED             STATUS              PORTS                    NAMES
f2ff1af05450        samalba/docker-registry:latest      /bin/sh -c 'exec doc   4 months ago        Up 12 weeks         0.0.0.0:5000->5000/tcp   docker-registry

Burada docker kayıt defterinin dockerize edilmiş bir versiyonunu çalıştırıyorum, böylece görüntülerimi saklamak için özel bir yerim var. Yine, dikkat edilmesi gereken bazı şeyler var:

  1. IMAGE ID gibi CONTAINER ID de konteyner için gerçek tanımlayıcıdır. Aynı biçime sahiptir, ancak farklı bir nesne türünü tanımlar.
  2. docker pssadece _çalışan_ konteynerlerin çıktısını verir. Tüm konteynerleri (_running_ veya _stopped_)docker ps -a` ile görüntüleyebilirsiniz.
  3. NAMES, --name bayrağı aracılığıyla başlatılan bir konteyneri tanımlamak için kullanılabilir.

Görüntü ve konteyner birikimi nasıl önlenir

Docker ile yaşadığım ilk hayal kırıklıklarından biri, etiketlenmemiş imajların ve durdurulmuş konteynerlerin görünüşte sürekli birikmesiydi. Birkaç kez bu birikim, sabit disklerin maksimuma çıkmasına, dizüstü bilgisayarımın yavaşlamasına veya otomatik derleme hattımın durmasına neden oldu. Konteynerler her yerde" hakkında konuşun!

Etiketlenmemiş tüm görüntüleri docker rmi ile son dangling=true sorgusunu birleştirerek kaldırabiliriz:

docker images -q --filter "dangling=true" | xargs docker rmi

Docker, mevcut konteynerlerin arkasındaki görüntüleri kaldıramayacaktır, bu nedenle önce docker rm ile durdurulmuş konteynerleri kaldırmanız gerekebilir:

docker rm `docker ps --no-trunc -aq`

Bunlar Docker ile ilgili bilinen sorunlu noktalar ve gelecekteki sürümlerde ele alınabilir. Ancak, imajların ve konteynerlerin net bir şekilde anlaşılmasıyla, bu durumlardan birkaç uygulama ile kaçınılabilir:

  1. İşe yaramayan, durdurulmuş bir konteyneri her zaman docker rm [CONTAINER_ID] ile kaldırın.
  2. Her zaman docker rmi [IMAGE_ID] ile işe yaramaz, durdurulmuş bir konteynerin arkasındaki görüntüyü kaldırın.
Yorumlar (11)

Bir konteyneri çalışan bir imaj olarak düşünmek en basit yol olsa da, bu tam olarak doğru değildir.

Bir resim gerçekten de bir konteynere dönüştürülebilen bir şablondur. Bir imajı konteynere dönüştürmek için Docker motoru imajı alır, üstüne bir okuma-yazma dosya sistemi ekler ve ağ bağlantı noktaları, konteyner adı, kimliği ve kaynak sınırları gibi çeşitli ayarları başlatır. Çalışan bir konteynerin o anda yürütülmekte olan bir süreci vardır, ancak bir konteyner de durdurulabilir (veya Docker terminolojisinde exited). Çıkmış bir konteyner, yeniden başlatılabildiği ve ayarlarını ve tüm dosya sistemi değişikliklerini koruyacağı için bir imajla aynı değildir.

Yorumlar (5)