İlk iki yazımda aslında imajları konteyner oluştururken kullanmıştık. Şimdi docker imajlarına biraz daha yakından bakacağız.

Teorik olarak Docker imajları

Standart bir linux işletim sistemi, önce bir read-only boot imajı ile sistemi açar. Bu genellikle /boot altında olur ve biz kullanıcıların boot imajları ile pek işi olmaz. Boot imaj dan sonra Root imajı sisteme bağlanır ve bütünlük testleri bitene kadar root dosya sistemi de read-only dir. Bütünlük testi bitince root dosya sistemi de read-write olarak sisteme bağlanır ve işletim sistemi başlar.

Docker işte bu işlemler dizisini root dosya sisteminin read-write olduğu yere kadar takip eder. Ancak root dosya sistemini RW yapmak yerine, başka dosya sistemlerini, rootfs üzerine katman katman eklemeye başlar. Root dosya sisteminde herhangi bir değişiklik yapmaz. Bu sisteme union mount adı veriliyor. Eklenen her katman altındaki tüm katmanları da kapsar.

docker-filesystems-multilayer

Ref : http://docs.docker.com/terms/layer/

Diagramda gösterilen base image, bahsettiğimiz root dosya sistemidir. Centos, Debian gibi Linux dağıtımlarından oluşturulabilir ve birazdan anlatacağım repolardan çekilebilir. Bunun üzerine istediğimiz kadar katmanı ekleyebilir, aynı hiyerarşide geriye dönebiliriz. Her zaman sadece en üstteki katman RW dir. Birazdan komutlarında da göreceğiniz gibi git versiyon kontrol sisteminin mantığında çalışır. Her katman bir commit dir. Bir base imajdan türettiğimiz imajlar, bu base imaja göre farkı kadar diskte yer kaplar.

İmajlar ile çalışmak

Şu ana kadar çalıştırdığımız komutlarda iki adet imaj kullandık. Centos ve ubuntu. Sistemimizdeki imajları listeleyelim.

[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest c4ff7513909d 8 days ago 213 MB
centos latest b157b77b1a65 3 weeks ago 243.7 MB

Bu imajları biz ayrıca indirmedik. Komutları koşarken verdiğimiz argüman ile, docker servisi otomatik olarak bunu Docker Hub’dan indirdi. Hub’da olan imajları istediğimiz bir anahtar kelimeye göre arayabiliriz.

[root@localhost ~]# docker search rails
NAME DESCRIPTION STARS OFFICIAL TRUSTED
rails Ruby On Rails is an open-source web framew... 29 [OK]
lgsd/docker-rails 8 [OK]
jonsharratt/rails Ubuntu 12.04 LTS, Rails 4.0, Ruby 2.0.0-p2... 6
atcol/grails-tomcat7-jdk8 A cutting edge JEE development environment... 4
...

İstediğimiz bir imajı sistemimizde çekelim.

[root@localhost ~]# docker pull rails
Pulling repository rails
eb20913328e0: Download complete
6debeec2e195: Download complete
276e7302520b: Download complete
511136ea3c5a: Download complete
a70fb0647e6e: Download complete
431dac4e3917: Download complete
7bec3ae014d4: Download complete
b3b877130625: Download complete
c0d8af324727: Download complete

Artık ben rails adlı imaj ile konteyner çalıştırabilirim ve bunun için sistemimize indirdiğim yerel kopya kullanılır.

[root@localhost ~]# docker run -i -t rails /bin/bash
root@ef06070992f7:/# rails -v
Rails 4.1.4

İşte şimdi Docker anlamlı olmaya başladı. Rails kurulumu kavramının yerini Rails konteynerini çalıştırma kavramı aldı. Hızlı, güvenilir…

Şimdi ufak bir değişiklik yapalım.

root@ef06070992f7:/# apt install nginx
Reading package lists... Done
Building dependency tree
...

Rails imajından çalıştırdığım konteynere apt ile nginx kurdum. Ctrl+D ile çıkıp konteynerde değişen neler var bakalım.

[root@localhost ~]# docker diff ef06070992f7
C /tmp
C /lib/systemd/system
A /lib/systemd/system/nginx.service
C /etc
C /etc/rc5.d
A /etc/rc5.d/S01nginx
C /etc/rc0.d
A /etc/rc0.d/K03umountnfs.sh
A /etc/rc0.d/K04umountfs
A /etc/rc0.d/K06halt
...

Bu çıktıda, imajın üzerinde yaptığımız tüm değişiklikleri görebiliyoruz. Şimdi bu değişiklikleri aynı gitte olduğu gibi commit ediyorum. Commit sırasında yeni bir isim veriyorum. Burada format kullanıcı adı/imaj adı şeklinde olacak.

[root@localhost ~]# docker commit -m="Nginx eklendi" --author="Volkan Oransoy" ef06070992f7 volkan/rails-nginx
7319e7a0f51eaa128a1a89743f6cb5bb44314776f004f02bd295e87b571552df

Artık benim de bir Docker imajım var. 🙂

[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
volkan/rails-nginx latest 7319e7a0f51e About a minute ago 919.9 MB
rails onbuild 6debeec2e195 2 days ago 876.6 MB
rails 4 276e7302520b 2 days ago 902.7 MB
rails 4.1 276e7302520b 2 days ago 902.7 MB
rails 4.1.4 276e7302520b 2 days ago 902.7 MB
rails latest 276e7302520b 2 days ago 902.7 MB
ubuntu latest c4ff7513909d 8 days ago 213 MB
centos latest b157b77b1a65 3 weeks ago 243.7 MB
rails 4.1.1 eb20913328e0 7 weeks ago 1.036 GB

Docker Hub ile çalışmak.

Docker Hub https://hub.docker.com/ adresinden hizmet veren bir imaj deposudur. Github kullananların çok kolay adapte olacağı bir iş akışı vardır. Github gibi üye olursunuz ve private ve public repolarınız olur. Üyelik bilgilerinizi sisteminize girerseniz private repolarınıza erişebilirsiniz.

[root@localhost ~]# docker login
Username: volkan
Password:
Email: voransoy@gmail.com
Login Succeeded

Bir önceki adımda kendime oluşturduğum imajı, Docker Hub hesabıma yolluyorum. Tahmin ettiğiniz gibi push komutu ile 🙂

[root@localhost ~]# docker push volkan/rails-nginx
The push refers to a repository [volkan/rails-nginx] (len: 1)
Sending image list
Pushing repository volkan/rails-nginx (1 tags)
511136ea3c5a: Image already pushed, skipping
a70fb0647e6e: Image already pushed, skipping
431dac4e3917: Image already pushed, skipping
7bec3ae014d4: Image already pushed, skipping
b3b877130625: Image already pushed, skipping
c0d8af324727: Image already pushed, skipping
b3a3042b8723: Image already pushed, skipping
31b7fb575819: Image already pushed, skipping
1924405c8efc: Image already pushed, skipping
a804f49fe9f7: Image already pushed, skipping
9608417d67a9: Image already pushed, skipping
822c55f3dcbe: Image already pushed, skipping
4ea8982e8daa: Image already pushed, skipping
276e7302520b: Image already pushed, skipping
7319e7a0f51e: Image successfully pushed
Pushing tag for rev [7319e7a0f51e] on {https://cdn-registry-1.docker.io/v1/repositories/volkan/rails-nginx/tags/latest}

Capture
Artık bu imajı, aynı standart centos, ubuntu ya da rails imajı gibi, istediğim yerden çekebilir, konteynerlar koşabilirim. Push ettiğim imaj public, yani herkes tarafından görülebilir durumda. İsterseniz Docker Hub’dan alacağınız ücretli hesaplar ile bu imajı private yapabilirsiniz.

Docker ile uygulama sanallaştırma – III İmajlar

Leave a Reply

Your email address will not be published. Required fields are marked *