Docker Temelleri

Berkay İnam
7 min readApr 2, 2024

--

Bu yazıda docker tarihini ve temellerini sunacağım.

Docker Neyin Nesi, “Liman işçisi” mi ?

İlk olarak kelime anlamından ve nereden geldiğinden başlayalım. Docker kelimesinin Türkçe anlamı “liman işçisi” olarak geçmektedir. aslında çalışma prensibi de tam olarak böyle.

Bir gemi limanı düşünün, bu limanda birsürü konteyner ve içerisinde değerli varlıklar olsun. Limana günde yüzlerce konteyner gelip giderken nasıl işler tıkırında yürüyor, tabiki liman işçileri sayesinde. Hikayemizi anladık. Artık sadede gelip docker ın nasıl iş yaptığını anlayalım

Docker kendi içerisindeki konteyner(container) dediğimiz izole edilmiş bilgisayarcıkları yönetir ve hepsini bir bütün olarak denetler, çalıştırır, ayarlar. Bilgisayarcık… şimdi biraz temel kavramlara bakalım.

Çok detaya girip bu yazıyı gereksiz hikayelerle uzatmayacağım. docker teknolojisi neden icat edildi? eskiden ne kullanılıyordu ve docker sistemlerine geçtik ?

Docker 2013 te piyasaya sürülmüştür, 2012 ve öncesinde bir uygulama tasarlanacağı zaman sanal makineler ayarlanır, GB dolusu hard disk ve RAM ler makinelere kurulur. Her sanal makine için işletim sistemleri tek tek fullpacketler olarak yüklenirdi. Gerek bakım onarım gerekse kontrol olarak çok fazla insan ve sistem gücü isterdi. Bu klasikleşmiş yöntem 2012 ye kadar bir sistem tasarlamak için en iyi şekilde optimize edilmişti. Yeni bir çağ açacak bir teknoloji gelinceye kadar…

— İlk Container teknolojilerinin adımları 1970 yıllarında atılıyor. Ufak bir bilgi olarak kalsın Liman işçisi* olmak için bu kadar detaya gerek yok :)) —

2013 yılında Solomon Hykes isimli abimiz “abi bu böyle olmayacak LXC, Solaris Zones, Virtual Machines derken bicok seyle ugrasıyoruz gelin sunu bi gelistirelim” diyerek bir python konferansında docker teknolojisini tanıtmıştır. sonrasında açık kaynak platformu olan CNCF e bagıslanan proje yatırım ve kod geliştirmeleriyle günümüze kadar gelerek sistem standartı olarak kabul edilen sanallaştırma teknolojileri ve konteyner yönetimi standartı haline gelmiştir.

Önemli Kavramlar Sanallaştırma, İzolation Volumes Network…

Sanallaştırma (Virtualization) :

Yaygın kullanılan OS olduğu için, Windows üzerinden düşünelim.
Docker, uygulamaları ve bunların bağımlılıklarını izole edilmiş ortamlarda çalıştırmak için kullanılan bir sanallaştırma platformudur. Bu, yazılım geliştirme süreçlerini standartlaştırır, dağıtımı kolaylaştırır ve uygulamaların hızlı bir şekilde başlatılmasını sağlar. Docker Windows üzerinde çalıştığında, Windows’un kendi sanallaştırma teknolojilerini kullanır ve gerektiğinde Windows Subsystem for Linux gibi bileşenleri kullanarak Linux konteynerlerini destekler.

Konteyner (Container):

Docker’da “konteyner” olarak adlandırılan birimler, uygulamaların yazılım ve bağımlılıklarıyla birlikte paketlenmiş çalışabilir bir şekilde dağıtılmasını sağlar. Konteynerler, izole bir çalışma ortamı sağlar ve uygulamanın çalışması için gereken her şeyi içerir. Her bir konteyner, kendi dosya sistemi, ağ bağlantıları ve süreçleriyle birlikte bir uygulamayı çalıştırabilir. Konteynerler, hafif ve hızlı bir şekilde başlatılabilir, durdurulabilir ve taşınabilirler. Benim tabirime göre Birbirinden izole edilmiş bilgisayarcıklardır. ‘cık’ diyorum çünkü içlerindeki işletim sistemlerinin sürümleri 5mb lara kadar düşebiliyor. örneğin elinizde x dilinde yazılmış bir yazılım projesi var. bir kaç mb büyüklüğünde işletim sistemini kurup, projenizin bağımlılıklarını da çok düşük mb lara kurup derleyebilirsiniz. Bu projeyi Docker Hub a yükleyip başka bir kaynaktan saniyeler içinde tekrar indirebilirsiniz.

Only 5 MB in size !

İzolasyon (Windows Izolation):

izolasyon, bir sistem veya bileşenin dış etkenlerden veya diğer unsurlardan ayrı ve güvenli bir şekilde çalışmasını sağlayan bir koruma ve sınırlama mekanizmasıdır. Docker sisteminde izolasyon genellikle veri bütünlüğünü, güvenliği ve sistem stabilitesini sağlamak için önemlidir. İzolasyon, farklı konteynerlar arasındaki etkileşimi sınırlar ve bir bileşenin diğerine zarar verme veya başka bir şekilde etkileme riskini azaltır. Peki bizim Docker Containerlarımız nasıl haberleşiyor ?

Docker Network (Docker Ağı):

Az önceki sorunun cevabı docker ağıydı :) Docker, konteynerler arasında iletişim kurmak için Docker ağı adı verilen bir ağ modelini kullanır. Docker ağı, aynı Docker ana bilgisayarında çalışan konteynerler arasında iletişimi sağlar. Bu, konteynerların birbiriyle ve dış dünya ile iletişim kurmasını sağlar. Aynı ağa bağlı olan konteynerlar, ağdaki diğer konteynerlarla doğrudan iletişim kurabilirler. Docker ağları, konteynerların izole edilmiş bir ortamda çalışmasını sağlar ve iletişimlerini kontrol altında tutar.

Volumes (Hacimler):

Docker’da “volumes” olarak adlandırılan bir özellik, konteynerlerin içerisindeki verileri kalıcı bir şekilde saklamak için kullanılır. Bu, konteynerlerin çalışma zamanı sırasında oluşturulan veya değiştirilen verilerin, konteyner sonlandırıldıktan sonra bile korunmasını sağlar. Volumes, konteynerler arasında veri paylaşımını kolaylaştırır ve veri kaybını önler.

https://docs.docker.com/storage/volumes/

volume ls komutu ile volumlerinizi listelerken eğer inspect komutunu kullanırsanız, volume ait daha detaylı bilgiler listelenecektir.

Images (İmajlar):

Docker’da “images” ler konteynerlerin temel yapı taşlarını oluşturan dosyalardır. Bir Docker imajı, bir uygulamanın veya servisin çalıştırılması için gerekli olan her şeyi içerir: kod, runtime, bağımlılıklar, ortam değişkenleri ve diğer yapılandırma dosyaları. Bu imajlar, Dockerfile adı verilen bir dosya kullanılarak oluşturulur ve Docker Hub gibi imaj depolarında paylaşılabilir. Bir app yazıp onu .exe dosyasına çevirdiğinizi düşünün. Bu bir bütün halinde çalışan dosya docker dünyasındaki imajlar olarak düşünülebilir.

Terminal üzerinde docker images komutu ile hazır imajlarınızı görüntüleyebilirsiniz, yukarıdaki resimde ubuntu ve debian imajları listelenmiştir. Bu imajları Docker run komutu veya docker-compose.yaml dosyaları ile aynı anda çalıştırabilir, içerisinde kod bloğu işleyebilir birbirleriyle haberleştirebilir, yeni imajlar dahil edebilirsiniz.

Dockerfile:

Docker’da “Dockerfile” dosyaları bir Docker imajının nasıl oluşturulacağını ve yapılandırılacağını belirten bir metin dosyasıdır. Dockerfile, bir uygulamanın gereksinimlerini ve bağımlılıklarını belirtir, gerekli paketleri yükler, dosyaları kopyalar, ortam değişkenlerini tanımlar ve uygulamayı çalıştıracak komutları belirtir. Dockerfile, Docker imajlarını otomatik olarak oluşturmak için kullanılır. Bir örnekle ;

first step to Dockerfile -Docker Documentation

Sırasıyla satır satır bakalım.

  1. Node.js 18-alpine imajını container e kurmak icin.
  2. Çalışma dizinini “/app” olarak belirledik, Container ilk çalıştığında komutlar bu dizinde çalışmak üzere başlatılacak.
  3. Tüm dosyaları Docker konteynerinin “/app” dizinine kopyalayın. Burdaki ilk nokta ‘.’ Dockerfile ın olduğu tüm dizindeki dosyaları temsil ederken ikinci nokta ‘.’ app dizininin içini işaret eder. (çünkü WORKDIR olarak /app belirledik)
  4. Üretim bağımlılıklarını yüklemek için “yarn install — production” komutunu çalıştırın. — production gereksiz paketleri yüklemeyeceği icin containerin boyutu daha az olacak.
  5. Konteyner başlatıldığında “node src/index.js” komutunu çalıştırın.
  6. Uygulamanın 3000 numaralı portunu dış dünyaya bağlanmak üzere açalım.

Docker Compose:

Docker Compose, çoklu konteyner uygulamalarını tanımlamak, yönetmek ve çalıştırmak için kullanılan bir araçtır. Bir YAML dosyası kullanarak, Docker Compose kullanıcıları, birden çok konteynerin nasıl yapılandırılacağını, birbirleriyle nasıl ilişkilendirileceğini ve nasıl başlatılacağını belirleyebilirler. Docker Compose, uygulamaları hızlı bir şekilde başlatmak ve geliştirmek için yaygın olarak kullanılır. Bu dosyayı Makefile gibi düşünebilirsiniz. Temelindeki mantık aynı, bir şeyleri oluşturmak, silmek, ayarlamak ve yoketmek. Bir örnekle yaml;

docker-composer.yaml file -Docker Documentation

app Servisi:

  • Docker imajı olarak node:18-alpine kullanılır.
  • Konteyner başlatıldığında çalıştırılacak komut yarn install && yarn run dev olarak belirlenmiş.
  • Uygulamanın 3000 numaralı portu, localhost üzerinde 3000 numaralı porta yönlendirilir.
  • Çalışma dizini /app olarak belirlenir.
  • Yerel dosyaların Volume kullanılarak (./) Docker konteynerinin /app dizinine bağlanması sağlanır.
  • Çevresel değişkenler: MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB tanımlanır. Bu tanımlamalar da database imize bağlanmamız için gerekli.

mysql Servisi:

  • Docker imajı olarak mysql:8.0 kullanılır.
  • Veritabanının verileri saklanacak olan bir Docker volume oluşturulur (todo-mysql-data).
  • Çevresel değişkenler: MYSQL_ROOT_PASSWORD, MYSQL_DATABASE tanımlanır. burdaki degiskenlerimiz ise database create edilirken kullanılmak üzere tanımlanmaktadır.

volumes:

  • todo-mysql-data adında bir Docker volume oluşturulur. Bu volume, MySQL konteynerinin veritabanı verilerini saklamak için kullanılır.

Bu Docker Compose dosyası, bir Node.js uygulamasının yanı sıra bir MySQL veritabanını içeren bir uygulamayı başlatmak için kullanılır.

Docker İnstall :

https://docs.docker.com/engine/install/ link üzerinden gerekli adımları takip edip basitçe kurabilirsiniz, gerekli kurulumlardan sonra terminalimizi komutlarımızı deneyebiliriz. Ayrıca ilk testlerinizi dokümandaki get-started metotları ile birlikte denemenizi öneririm.

Docker Temel Komutlar:

Teorik bilgileri geçtikten sonra Docker ile çalışmaya başlamak için temel Docker komutlarını anlamak önemlidir. Bu komutlar, Docker’ın kullanımını yönetmek ve konteynerlerle etkileşimde bulunmak için gereklidir. En yaygın kullanılan Docker komutlarına bi bakalım.

  1. docker build <path/to/Dockerfile>: Bir Docker dosyasından (Dockerfile) bir Docker imajı oluşturmak için kullanılır. Docker dosyası, konteynerin nasıl yapılandırılacağını ve uygulamanın nasıl derleneceğini belirtir.
  2. docker run <image>: Bir Docker imajını çalıştırmak için kullanılır. Bu komut, belirtilen imajı indirir (eğer yerelde bulunmuyorsa) ve bir konteyner oluşturarak çalıştırır.
  3. docker ps: Çalışan Docker konteynerlerini listelemek için kullanılır. Bu komut, çalışan konteynerlerin ID'lerini, isimlerini, oluşturulma zamanlarını ve durumlarını görüntüler.
  4. docker images: Yerelde bulunan Docker imajlarını listelemek için kullanılır. Bu komut, indirilen veya oluşturulan Docker imajlarının listesini görüntüler.
  5. docker stop <container>: Bir Docker konteynerini durdurmak için kullanılır. Bu komut, belirtilen konteynerin çalışmasını sonlandırır.
  6. docker rm <container>: Bir Docker konteynerini silmek için kullanılır. Bu komut, belirtilen konteyneri kalıcı olarak kaldırır.
  7. docker rmi <image>: Bir Docker imajını silmek için kullanılır. Bu komut, belirtilen imajı ve bağlı olan tüm konteynerleri siler.
  8. docker exec -it <container> <command>: Bir Docker konteynerinde etkileşimli bir terminal başlatmak için kullanılır. Bu komut, belirtilen konteynerde belirtilen komutu çalıştırır ve kullanıcıya etkileşimli bir terminal sağlar.

Bu temel Docker komutları, Docker ile çalışırken sıkça kullanılır ve Docker konteynerlerini yönetmek için gereklidir. Eğitimini aldığım Özgür Öztürk namıdiğer Aytitech hocamın cheatsheet in linkini de buraya bırakıyorum.Komutların daha detaylı ve açık halleri mevcut
https://github.com/ozgurozturknet/AdanZyeDocker/blob/master/DockerCheatSheetTurkce.md. İyi calışmalar.

Kaynakça :

https://docs.docker.com/manuals/ https://github.com/ozgurozturknet/AdanZyeDocker/
chatGPT

--

--

Berkay İnam

22 Yaşındayım, kedileri ve docker ı severim. Tesekkürler