Docker Temelleri

  • Konbuyu başlatan Konbuyu başlatan Hüseyin
  • Başlangıç tarihi Başlangıç tarihi

Hüseyin

Üye
Top Poster Of Month
Katılım
21 Ocak 2024
Mesajlar
164
Tepkime puanı
36
Puanları
28
docker.jpg



Docker, ölçeklenebilirlik ve dağıtım kolaylığı için oluşturulmuş açık kaynaklı bir konteynerleştirme teknolojisidir. Şimdi bunları nasıl yaptığını görelim:
1. Ölçeklenebilirlik: Docker bir konteynerizasyon teknolojisidir, yani her konteyner kendi yapılandırmasına sahip izole bir ortamdır. En iyi yanı, docker kullanarak konteynerleri döndürmenin çok basit olmasıdır. Yani uygulamanızın ölçeklendirilmesi gerekiyorsa, konteyner sayısını artırmanız yeterlidir ve docker istediğiniz kadar konteyner oluşturacaktır.
2. Dağıtım kolaylığı: Docker dağıtımları kolaylaştırır çünkü sisteminizde çalışan şeyin aynısıdır. Sisteminizden bir sanal makine üzerinde çalıştığınızı ve kodun yapılandırmalarla birlikte sanal makinede (sunucunuz da olabilir) kaldığını hayal edin. Şimdi aynı teknolojiyi hayal edin, ancak birkaç VM'ye dağıtılmak üzere yapılmış olsun. İşte docker sizin için.

Tüm bunlar kulağa biraz fazla zor geliyorsa, korkmayın. Burada, Docker'ın yapabildiği her şeyi bazı temel kavramlarla birlikte ayrıntılı olarak açıklayacağım (elbette yine de sadece temelleri ele alacağız). Bu yazı VM'ler, ağ ve izleme hakkında biraz bilgisi olan yazılım geliştiricilere yöneliktir. Şimdi Docker'ın ne olduğunu ve neler yapabildiğini görelim.

Konteynerleştirme ve Sanallaştırma

docker.png


Docker bir konteynerizasyon teknolojisidir. Bu da “konteynerizasyon da neyin nesi?” sorusunu gündeme getiriyor. İşte kısa cevabı:Konteynerleştirme, ölçeklenebilirliği ve dağıtımları kolay ve kaynak verimli hale getiren bir sanallaştırma biçimidir. Mantıklı gelmiyor mu? O zaman ayrıntılı cevabı görelim (daha önce ne hakkında konuştuğumu anladıysanız bunu atlamaktan çekinmeyin). Konteynerizasyon, bazı küçük farklılıklarla birlikte sanallaştırmaya benzer:

İzolasyon: Her sanal makine kendi işletim sistemini kendi özel donanımında (tabii ki sanal) çalıştırdığı için sanal makineler daha izoledir. Öte yandan konteynerler izole edilmiştir, ancak işletim sistemi düzeyinde değildir. Bu da tüm konteynerlerin aynı işletim sistemini (ana sistem olarak) çalıştıracağı ve işletim sistemi çekirdeğinde bir güvenlik açığı bulunursa, tüm konteynerlerin aynı anda etkileneceği anlamına gelir
Kaynak kullanımı: Konteynerler ana sistemin işletim sistemini paylaşır, bu nedenle kendi işletim sistemi için kendi süreçlerini çalıştıracak bir VM'ye kıyasla daha az kaynak kullanır.
Performans: Konteynerler, VM'lerin aksine ana işletim sistemini paylaştıkları için neredeyse yerel performansa sahiptir
Dağıtım süresi: Çalıştırılacak daha az işlem olduğundan (yalnızca sizin tanımladığınız işlemler) konteynerler VM'lere kıyasla daha hızlı dağıtım ve başlatma süresine sahiptir
İşletim sistemleri: Konteynerler ana sistemin işletim sistemi çekirdeği ile sınırlıyken, VM'ler farklı işletim sistemi çekirdeklerini çalıştırabilir.
Taşınabilirlik: Konteynerler son derece taşınabilirdir ve VM'lerin aksine konteyneri çalıştıran her cihazda aynı kod çalışır.

Yani genel olarak konteynerler ölçeklenebilirlik, dağıtım kolaylığı, kaynak tüketimi ve taşınabilirlik açısından sanal makinelere kıyasla çok daha iyidir. Ama bana bir şey söyleyin. Yazdığınız kodun, farklı bir işletim sistemi kullanıyor olsalar bile başka birinin sisteminde olduğu gibi çalışması artık harika mı? Sizi bilmem ama bu bana kesinlikle süper havalı geliyor. Şimdi docker'ın aslında bunları nasıl yaptığını görelim. Ama önce, bazı temel kavramları gözden geçirelim.

Docker Konteynerleri

Docker Konteynerleri uygulamanızı çalıştıran hafif sanal makinelerdir. Ancak, sanal makinelerin aksine, docker konteynerleri her zaman kaynak tüketmez (yukarıda belirtildiği gibi). Yalnızca çalışırken kaynak tüketirler. Bunun nedeni, görevleri için ana işletim sistemi çekirdeğini kullanmaları ve ortamı basitçe izole etmeleridir.

Docker Konteynerleri, docker imajları kullanılarak çalıştırılabilir.

Docker İmajları

Docker İmajları, docker konteynerleri için planlardır. Esasen, bir konteyneri saniyeler içinde döndürmek için kullanılabilecek konteyner yapılandırmasının önbelleğe alınmış bir sürümüdür. Docker imajları, docker hub'dan çekilerek veya Dockerfile kullanılarak özel imajlar oluşturularak oluşturulabilir.

Dockerfile

Bu temelde bir docker imajı için bir yapılandırma dosyasıdır. Bu, docker imajını oluşturmamıza yardımcı olan komutları içerir. İmaj katmanlar halinde oluşturulur ve her komut bir katman oluşturur. Bu işlemin avantajı, görüntüleri yeniden oluşturmanın daha hızlı olması ve yalnızca değişen katmanların yeniden oluşturulmasıdır.

Bu şeyler nasıl çalışır?

Bunu anlamak için bir örnek verelim.
Diyelim ki, bu sonraki js uygulamasını docker kullanarak çalıştırmak istiyorum.

Bunu yapmak için önce projenin kök dizininde bir Dockerfile oluşturacağım. Bu, docker'a bunun inşa edilmesi gereken bir proje olduğunu söyleyecektir. Şimdi, dosya içeriğini kopyalayıp yapıştırmadan ve her adımı açıklamadan önce, tipik bir nextjs uygulamasını sunucuya dağıtmak için atacağımız adımları düşünelim. Bunların bir listesini yapalım:
Adım 1: Sunucuyu uygun işletim sistemi, ayarlar ve konfigürasyonlarla yapılandırın.
Adım 2: Bir çalışma dizini oluşturun (isteğe bağlı ama önerilir)
Adım 3: Proje içeriğinin kopyalanması (kod, bağımlılıklar, derleme komut dosyaları vb.)
Adım 4: Makineye gerekli bağımlılıkların yüklenmesi
Adım 5: Yapı olarak yapmak
Adım 6: Bu yapıyı bir port üzerinde çalıştırmak ve bu portu istekler için açığa çıkarmak.

İster inanın ister inanmayın, bunlar docker'da yapmamız gereken adımlarla aşağı yukarı aynıdır ve bunları proje için Dockerfile'da tanımlarız.

Docker kullanarak bu uygulama nasıl çalıştırılır

Evet bu eğlenceli kısım. Sonunda bu uygulamayı docker kullanarak çalıştırıyoruz. Ve daha fazla gecikmeden, bunu yapmak için adımları listeleyeceğim:

Bir Docker Görüntüsü oluşturun (Docker dosyası veya kodu her değiştiğinde gereklidir)
Görüntüyü kullanarak bir Docker Konteyneri çalıştırın (uygulamayı docker lol kullanarak çalıştırmak istediğinizde gereklidir)

Adım 1: Bir Docker Görüntüsü Oluşturun

Bunu yapmak için aşağıdaki komutu çalıştırıyoruz:

docker build -t <tag-name> .
Bunu Dockerfile'ın bulunduğu kök dizinde çalıştırdığınızdan emin olun. <tag-name> ifadesini uygun bir isimle değiştirin. Bu işlemin projenize bağlı olarak çalışması ve docker imajını oluşturması biraz zaman alacaktır. Bu imajı docker konteynerlerini döndürmek için kullanacağız. Tag-name imajların hatırlanmasına yardımcı olur (temelde imaj için bir isimdir). Varsayılan olarak, docker <tag-name>:latest adında bir imaj oluşturacaktır.

Adım 2: Görüntüyü kullanarak bir Docker Konteyneri çalıştırın

Bunu yapmak için aşağıdaki komutu çalıştırıyoruz:

docker run --rm -p <system-port>:<container-port> --name <container-name> -d <tag-name>:latest
<tag-name> ifadesini yukarıda verilen imaj adı ile değiştirin. Bu, konteynerinizi anında çalıştıracaktır. Uygun bir <container-name> sağladığınızdan emin olun. Bu isteğe bağlı bir adımdır, ancak konteynerlerinizin kontrolden çıkmasını istemiyorsanız şiddetle tavsiye edilir (docker xD'yi keşfetmeye başladığımda bana çok oldu). Lütfen sistem portunun uygulamayı çalıştırmak istediğiniz port, konteyner portunun ise uygulamanın çalışacak şekilde yapılandırıldığı port olduğunu unutmayın. Örneğin, uygulamam 3000 portunda çalışıyorsa ancak sistemimde 8080 portunda çalışmasını istiyorsam (belki de 3000 yerel kodumu çalıştırdığı ve değişiklikleri çapraz kontrol etmek istediğim için), çalıştıracağım:
docker run --rm -p 8080:3000 - name container-name -d tag-name:latest
Bununla birlikte, uygulamam makinemde localhost:8080 üzerinde çalışıyor, ancak uygulamayı kendi başına 3000 numaralı bağlantı noktasında çalıştıran docker kapsayıcısı aracılığıyla.
Her değişiklik için bunların hepsini yapmanız gerekiyor mu?

Hayır, kodda her değişiklik yaptığınızda hepsinin yapılması gerekmez. Dockerfile olduğu gibi kalır. Sadece imajın yeniden oluşturulması ve tabii ki konteynerin yeni imajla çalıştırılması gerekir. Hepsi bu kadar.
Bazı iş akışları için bu bile çok fazladır, ancak daha sonra değişikliklerimizi üretime (veya hatta hazırlık ortamına) dağıtmamız ve test etmemiz gerektiğinde bunun bize çok fazla iş ve zaman kazandırdığını da hatırlamamız gerekir.

Peki bu acıya değer mi? Muhtemelen küçük ölçekli projeler için değil, ama daha büyük projeler için kesinlikle evet. Her mikrosaniyede yaklaşık bir milyon istek alan bir sunucu düşünün. Bu tür bir trafiği idare etmek için eski tip bir sunucuya güvenmek ister misiniz? Muhtemelen hayır. Mevcut sunucunuzu bu yükü kaldırabilecek şekilde belki 10 ya da 100 kat ölçeklendirmeyi tercih edersiniz ve docker size tam da bunu yapabilme gücü verir.

Şimdi biraz aydınlanmış hissediyor musunuz? O zaman makalenin başına gidin ve ikinci paragrafı okuyun (yani tekrar okuyun). Şimdi daha mantıklı geliyor mu? Hala biraz kafa karıştırıcıysa, bu alıştırmayı kendiniz yapmayı deneyin. Depo herkese açıktır, bu nedenle kodu klonlamaktan ve sisteminizde çalıştırmayı denemekten çekinmeyin ve ardından aynı şeyi çalıştırmak için docker kullanın.

Pratik yapmak insanı mükemmelleştirir

Bir şeyleri insanların yaptığını görerek ya da okuyarak değil, elle yaparak öğrendiğimize inanıyorum, bu yüzden bir deneyin ve yardımcı olup olmadığını görün.

Şimdi docker kendi başına da o kadar etkileyici değildir, çünkü bazı sınırlamaları vardır. Örneğin, bir konteynerdeki veriler kalıcı değildir ve konteyner durdurulduğunda kaybolur. Ayrıca, çoğunlukla mikro hizmetler için tasarlandığından docker üzerinde birden fazla uygulama ve hatta bir tek parça (monolith) çalıştıramayız. Bununla birlikte, bu kullanım durumlarını ele almak için oluşturulmuş şeyler vardır, örneğin, docker volumes, konteyner durdurulduktan sonra bile verilerin korunmasını sağlar ve docker compose birden fazla uygulama veya bir monolit çalıştırmak için kullanılabilir, ancak burada bu ayrıntılara girmeyeceğiz ve başlangıç seviyesinde tutacağız.
 
Geri
Üst