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?
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.
Docker Dağıtımlarını Otomatikleştirme]1 başlıklı makalemden:
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, 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
<none> <none> 4ab0d9120985 3 months ago 486.5 MB
Not edilmesi gereken bazı şeyler:__
docker build
komutunun -t
bayrağından veya mevcut bir görüntünün docker tag
lenmesinden gelir. Görüntüleri sizin için anlamlı olan bir isimlendirme kullanarak etiketlemekte özgürsünüz, ancak docker'ın bir docker push' veya
docker pull' işleminde etiketi kayıt yeri olarak kullanacağını bilin.[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.<none>
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.
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:
sadece _çalışan_ konteynerlerin çıktısını verir. Tüm konteynerleri (_running_ veya _stopped_)
docker ps -a` ile görüntüleyebilirsiniz.--name
bayrağı aracılığıyla başlatılan bir konteyneri tanımlamak için kullanılabilir.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:
docker rm [CONTAINER_ID]
ile kaldırın.docker rmi [IMAGE_ID]
ile işe yaramaz, durdurulmuş bir konteynerin arkasındaki görüntüyü kaldırın.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.