Ian Murdock’ın ölümü üzerine denk gelmesi üzücü tabi ama bir kaç zamandır kendime not olarak yazmak istediğim bir konuydu Docker. Docker’la ilgili bakınırken, seyahat takip listemde bulunan Emre Aladağ’ın Docker konusunda tam olarak derlemek istediğim özeti yapmış olduğunu gördüm. Kendisinin de izniyle yazıyı buraya aldım.
Docker, yazılım geliştiriciler ve sistemciler için geliştirilen açık kaynaklı bir sanallaştırma platformudur. Docker ile Linux, Windows ve MacOSX üzerinde Linux ve Windows sanal containerler(makineler) çalıştırabilirsiniz. Bu platform sayesinde web sistemlerinin kurulumunu, testini ve dağıtımını kolaylıkla gerçekleştirebilirsiniz. En önemli özelliği belki de “Benim bilgisayarımda çalışıyordu, sunucuda neden çalışmadı acaba?” sorununu ortadan kaldırıyor olması.
Docker, yazılımların kurulmuş halinin imajını (.iso DVD imajı gibi) alıp tekrar kullanılabilir hale getiriyor. İsterseniz bu imajı bir kere oluşturup istediğiniz sunuculara gönderirsiniz, isterseniz her sunucuda sıfırdan imaj oluşturursunuz. Dockerfile adı verilen talimat dosyalarına bakarak her sunucu aynı imajı yeniden inşa edebilir. Bu sayede manuel müdahaleye gerek kalmaz.
Bir diğer güzel özelliği ise Dockerfile ve imajların geliştirilebilir olması. Talimatlara birkaç adım daha eklemek isterseniz önceki komutları tekrardan vermek yerine kaldığı en son yerden devam ediyor. Bu da zaman kazandırıyor.
Ne farkı var?
Bunu açıklamak için öncelikle var olan durumdan bir örnek üzerinde bahsedelim. Python/Flask ile geliştirdiğimiz bir web uygulamamız olsun.
Bunu Dockersız bir sunucuya kurmamız için gereken adımlar aşağı yukarı şu şekilde:
- Önce Python, virtualenv, pip gibi araçları kur.
- Git versiyon kontrol sistemini kur, gerekli depodan kodları çek.
- virtualenv ile sanal ortam oluştur, bağımlılıkları çek.
- Django sunucusunu çalıştır.
- Gerekirse nginx ile reverse proxy ayarı yap.
Veritabanı kurulum ve ayarları varsa işlem daha da uzuyor. Bunları manuel olarak yapmak gerekiyor, bu da her bir kurulum için zorluk demek. Özellikle de çok sayıda bilgisayara aynı kurulum yapılacaksa ve belli aralıklarla güncelleme gerekebiliyorsa bu durum can sıkıcı olabiliyor. Docker da bu noktada imdadımıza yetişiyor. Örnek bir anlatım şurada. Tüm komutları tek bir Dockerfile dosyasına yazıp imaj oluşturup çok sayıda sunucuya bu imajı gönderebiliyoruz. İmajları Docker Hub gibi sitelerde tutabiliyoruz. Eğer imaj açık kaynak ise ücretsiz, imajınızı başkalarının görmesini istemiyorsanız ücretli. İşin güzeli popüler birçok uygulamanın (mysql, apache, nginx, ghost, wordpress vs) hazırda ücretsiz imajları mevcut.
docker pull mysql
diyerek bu imajı indirip kullanıma hazır hale getirebiliyoruz.
Container ve Image kavramları
Docker, LXC sanallaştırma mekanizması üzerine kurulu. Bir Docker imajı, container denilen birimlerde çalıştırılıyor. Oyunculara rol vermek gibi düşünebiliriz. Her bir container bir süreç (process) kullanıyor. Bir makinada gücüne bağlı olarak binlerce docker containerı birden çalışabiliyor. Container imajları ortak olan sistem dosyalarını paylaşıyorlar. Dolayısıyla disk alanından tasarruf ediliyor. Şekilde görüldüğü gibi uygulama containerları ortak bin (exe) ve kütüphaneleri kullanıyorlar. Ancak klasik sanal makina sistemlerinde (VMWare, VirtualBox vs) her bir uygulama için ayrı işletim sistemi ve kütüphane dosyaları ayrılmak zorunda.
Container dediğimiz mekanizma deniz taşımacılığında kullanılan containerlardan esinlenmiş. Deniz taşımacılığında her containerın boyutu aynıdır ve taşıma ücreti aşağı yukarı standarttır. Boyutlarının aynı olması sebebiyle yerleşimi ve taşıması kolaydır.
Docker ile örnek bir mimari
Aşağıdaki fotoğraftaki örnekten gidecek olursak, sunucumuzda 4 adet docker container çalışıyor. 2 adet Apache web sunucusu, 1 adet mysql veritabanı, 1 adet ssh-bis. Apache sunucular 80 portundan yayın yapacaklar. Bu 80 portundaki yayın container’dan dışarıya (ana (host) sisteme) çıkarken 25890 ve 27568 olarak çıkacaklar. Containerın çalıştığı sistemde web tarayıcı ile http://localhost:25890 adresine girdiğimiz zaman birinci Apache’nin cevabını alırız.
Nginx gibi bir reverse proxy ise gelen istek sub1.domain.com:80’e ise ilk containera (25890), sub2.domain.com:80 ise ikinci containera (27568) yönlendirecek. Bu sayede çok sayıda yazılım bir sistemde birbirinden izole bir halde kolay kurulumla çalışabilecek.
Yazılımımızı test etmek istediğimizde bir yazılım ve bir veritabanı containerı oluşturup testi onun üzerinde gerçekleştirebiliriz. Bu işlemi Jenkins gibi continuous integration aracıyla otomatikleştirme imkanımız da var. Docker özetle bu şekilde. Sunucunuz üzerinde dışarıya belirli bir porttan hizmet veren yazılım kutuları olarak düşünebiliriz. Kurulumu, dağıtımı ve testi kolaylaştıran bu sistem, sistem yöneticilerine ve yazılımcılara büyük kolaylık sağlamakta.
Hakan Müştak @2015/12
Bir yanıt yazın