Anahtar Noktalar
- Docker konteynerleri, sanal makineler gibi izole edilmiş ortamlar oluşturur, ancak tam bir işletim sistemi çalıştırmaz, bu da taşınabilirlik ve kullanım kolaylığı sağlar.
- Docker, uygulamaları hızlıca başlatmak için popüler bir araçtır ve sisteminize etki etmeden kullanılabilir.
- Docker kullanmak için, platformunuza Docker’ı kurun ve bir Dockerfile yazarak ilk Docker imajınızı oluşturun.
Docker, uygulamaları paketleyerek konteyner adı verilen izole edilmiş ortamlar oluşturur. Her bir konteyner, sanal makineye (VM) benzer bir izole ortam sağlar, ancak VM’lerin aksine Docker konteynerleri tam bir işletim sistemi çalıştırmaz. Bu konteynerler, ana makinenizin çekirdeğini paylaşır ve yazılım seviyesinde sanallaştırma sağlar.
Docker’ın Temel Özellikleri
Docker, yazılım geliştiricileri ve sistem yöneticileri için standart bir araç haline gelmiştir. Sisteminize etki etmeden uygulamaları hızla başlatmanın pratik bir yoludur. Tek bir docker run
komutuyla yeni bir hizmeti hemen başlatabilirsiniz.
Konteynerler, bir uygulamayı çalıştırmak için gereken her şeyi, işletim sistemi paketlerinden kendi kaynak kodunuza kadar kapsüller. Bir konteynerin nasıl oluşturulacağını Dockerfile dosyasında talimatlar olarak tanımlarsınız. Docker, Dockerfile kullanarak bir imaj oluşturur.
İmajlar, konteynerlerde mevcut olan yazılımları tanımlar. Bu, bir işletim sistemi ISO’su ile sanal makine başlatmaya kabaca eşdeğerdir. Bir imaj oluşturduğunuzda, herhangi bir Docker kullanıcısı docker run
komutuyla uygulamanızı başlatabilir.
Docker Nasıl Çalışır?
Konteynerler, işletim sistemi çekirdeği özelliklerini kullanarak kısmen sanallaştırılmış ortamlar sağlar. chroot
gibi komutlarla sıfırdan konteynerler oluşturmak mümkündür. Ancak bu, karmaşık, güvensiz ve hataya açık bir işlemdir.
Docker, konteynerlerin üretimi, dağıtımı ve kullanımı için eksiksiz bir çözümdür. Modern Docker sürümleri, birkaç bağımsız bileşenden oluşur. İlk olarak, terminalinizde etkileşimde bulunduğunuz Docker CLI vardır. CLI, Docker daemon’a komutlar gönderir. Bu daemon yerel olarak veya uzak bir sunucuda çalışabilir. Daemon, konteynerleri ve bunların oluşturulduğu imajları yönetmekten sorumludur.
Son bileşen ise konteyner çalıştırma ortamıdır. Bu ortam, çekirdek özelliklerini çağırarak konteynerleri gerçekten başlatır. Docker, OCI spesifikasyonuna uygun çalışma ortamlarıyla uyumludur. Bu açık standart, farklı konteynerleştirme araçları arasında birlikte çalışabilirliği sağlar.
Docker’ın ilk başladığınızda iç işleyişi hakkında çok fazla endişelenmenize gerek yoktur. Sisteminizde Docker’ı kurmak, konteynerleri oluşturup çalıştırmak için ihtiyacınız olan her şeyi sağlayacaktır.
Docker Neden Bu Kadar Popüler?
Konteynerler, yazılım geliştirme sürecinde birçok yaygın sorunu çözdükleri için popüler hale geldi. Konteynerler, bir kez paketleyip her yerde çalıştırma olanağı sunar, bu da geliştirme ortamınız ile üretim sunucularınız arasındaki farkı azaltır.
Konteynerler kullanarak her ortamın aynı olduğundan emin olabilirsiniz. Yeni bir ekip üyesi varsa, kendi geliştirme ortamını kurmak için sadece docker run
komutunu çalıştırması yeterlidir. Hizmetinizi başlattığınızda, Docker imajınızı kullanarak üretime dağıtabilirsiniz. Canlı ortam, yerel örneğinizle tam olarak eşleşir ve “benim bilgisayarımda çalışıyor” senaryolarını önler.
Docker, tam teşekküllü bir sanal makineden daha kullanışlıdır. VM’ler her türlü iş yükünü desteklemek için tasarlanmış genel amaçlı araçlardır. Buna karşılık, konteynerler hafif, kendi kendine yeterli ve geçici kullanım durumlarına daha uygundur. Docker, ana makinenin çekirdeğini paylaştığından, konteynerlerin sistem performansına etkisi minimumdur. Konteyner başlatma süresi neredeyse anında gerçekleşir, çünkü sadece süreçler başlatılır, tam bir işletim sistemi değil.
Başlangıç
Docker, tüm popüler Linux dağıtımlarında mevcuttur. Ayrıca Windows ve macOS’ta da çalışır. Docker’ı kurmak ve çalıştırmak için platformunuzun Docker kurulum talimatlarını izleyin.
Kurulumunuzun çalıştığını kontrol etmek için basit bir konteyner başlatabilirsiniz:
bashKodu kopyaladocker run hello-world
Bu komut, temel “hello-world” imajıyla yeni bir konteyner başlatacaktır. İmaj, Docker’ı nasıl kullanacağınızı açıklayan bazı çıktılar verir. Ardından konteyner kapanır ve terminalinize geri dönersiniz.
İmajlar Oluşturma
hello-world
komutunu çalıştırdıktan sonra, kendi Docker imajlarınızı oluşturmaya hazırsınız. Bir Dockerfile, hizmetinizi nasıl çalıştıracağınızı, gerekli yazılımları kurarak ve dosyaları kopyalayarak tanımlar. İşte Apache web sunucusunu kullanarak basit bir örnek:
DockerfileKodu kopyalaFROM httpd:latest
RUN echo "LoadModule headers_module modules/mod_headers.so" >> /usr/local/apache2/conf/httpd.conf
COPY .htaccess /var/www/html/.htaccess
COPY index.html /var/www/html/index.html
COPY css/ /var/www/html/css
FROM
satırı, temel imajı tanımlar. Bu durumda, resmi Apache imajını kullanıyoruz. Docker, Dockerfile’daki kalan talimatları temel imajın üzerine uygular.
RUN
aşaması, konteyner içinde bir komut çalıştırır. Bu, konteyner ortamında kullanılabilen herhangi bir komut olabilir. Burada, .htaccess
dosyasının yönlendirme kurallarını ayarlaması için kullanılabilecek headers Apache modülünü etkinleştiriyoruz.
Son satırlar, çalışma dizininizdeki HTML ve CSS dosyalarını konteyner imajına kopyalar. İmajınız artık web sitenizi çalıştırmak için gereken her şeye sahiptir.
Şimdi imajı oluşturabilirsiniz:
bashKodu kopyaladocker build -t my-website:v1 .
Docker, Dockerfile’ınızı kullanarak imajı oluşturacaktır. Docker, her bir talimatınızı çalıştırırken terminalinizde çıktıları göreceksiniz.
Docker, Dockerfile’ın talimatlarını izlerken. Komuttaki -t
, imajınızı belirli bir adla (my-website:v1
) etiketler. Bu, gelecekte referans vermeyi kolaylaştırır. Etiketler iki bileşenden oluşur, iki nokta üst üste ile ayrılır. İlk kısım imajın adını belirlerken, ikinci kısım genellikle sürümünü belirtir. İki noktayı atladığınızda, Docker varsayılan olarak latest
sürümünü kullanır.
Komutun sonundaki .
işareti, Docker’a yerel çalışma dizininizdeki Dockerfile’ı kullanmasını söyler. Bu aynı zamanda kopyalama talimatlarını kullanarak çalışma dizinindeki dosya ve klasörleri kullanmanıza olanak tanır.
İmajınızı oluşturduktan sonra, bir konteyner başlatabilirsiniz:
bashKodu kopyaladocker run -d -p 8080:80 my-website:v1
Burada docker run
komutuyla birkaç ekstra bayrak kullanıyoruz. -d
bayrağı, Docker CLI’nın konteynerden ayrılmasını sağlayarak onun arka planda çalışmasına izin verir. -p
ile bir port eşleme tanımlanır, böylece ana makinedeki 8080 numaralı port konteynerdeki 80 numaralı porta eşlenir. Tarayıcınızda localhost:8080
adresini ziyaret ederseniz web sayfanızı görmelisiniz.
Docker imajları katmanlardan oluşur. Dockerfile’daki her talimat yeni bir katman oluşturur. Gelişmiş yapı özelliklerini kullanarak birden çok temel imajı referans alabilir, önceki imajlardan ara katmanları atabilirsiniz.
İmaj Kayıtları
Bir imajınız olduğunda, bunu bir kayda gönderebilirsiniz. Kayıtlar, konteynerleri diğerleriyle paylaşabilmeniz için merkezi bir depolama sağlar. Varsayılan kayıt Docker Hub’dır.
Bir imajı referans alan bir komut çalıştırdığınızda, Docker önce bu imajın yerel olarak mevcut olup olmadığını kontrol eder. Eğer yoksa, Docker Hub’dan çekmeye çalışır. İmajları manuel olarak çekmek için docker pull
komutunu kullanabilirsiniz:
bashKodu kopyaladocker pull httpd:latest
Bir imaj yayınlamak isterseniz, bir Docker Hub hesabı oluşturun. docker login
komutunu çalıştırın ve kullanıcı adınızı ve şifrenizi girin.
Ardından, imajınızı Docker Hub kullanıcı adınızı kullanarak etiketleyin:
bashKodu kopyaladocker tag my-image:latest docker-hub-username/my-image:latest
Şimdi imajınızı gönderebilirsiniz:
bashKodu kopyaladocker push docker-hub-username/my-image:latest
Diğer kullanıcılar, imajınızı çekip konteynerleri başlatabilirler.
Özel imaj depolama alanı gerekiyorsa, kendi kayıt defterinizi çalıştırabilirsiniz. Birçok üçüncü taraf hizmet de Docker Hub’a alternatif olarak Docker kayıt defterleri sunar.
Konteynerlerinizi Yönetme
Docker CLI, çalışan konteynerlerinizi yönetmek için çeşitli komutlar sunar. İşte bilmeniz gereken en faydalı olanlardan bazıları:
Konteynerleri Listeleme
docker ps
komutu, tüm çalışan konteynerlerinizi gösterir. -a
bayrağını eklemek, durdurulmuş konteynerleri de gösterir.
Konteynerleri Durdurma ve Başlatma
Bir konteyneri durdurmak için docker stop my-container
komutunu çalıştırın. my-container
yerine konteynerin adını veya kimliğini girin. Bu bilgiyi ps
komutundan alabilirsiniz. Durdurulmuş bir konteyneri docker start my-container
komutuyla yeniden başlatabilirsiniz.
Konteynerler, ana süreçleri canlı kaldığı sürece çalışır. Yeniden başlatma politikaları, bir konteyner durduğunda veya ana makine yeniden başlatıldığında ne olacağını kontrol eder. docker run
komutuna --restart always
parametresini geçirerek bir konteynerin durduktan hemen sonra yeniden başlatılmasını sağlayabilirsiniz.
Bir Kabuk Alma
Bir konteynerde komut çalıştırmak için docker exec my-container my-command
komutunu kullanabilirsiniz. Bu, konteynerin ana sürecinden ayrı bir yürütülebilir dosyayı manuel olarak çalıştırmak istediğinizde kullanışlıdır.
Eğer etkileşimli erişim gerekiyorsa -it
bayrağını ekleyin. Bu, docker exec -it my-container sh
komutunu çalıştırarak bir kabuğa geçmenizi sağlar.
Günlükleri İzleme
Docker, bir konteynerin standart giriş ve çıkış akışlarına gönderilen çıktıları otomatik olarak toplar. docker logs my-container
komutu, bir konteynerin günlüklerini terminalinizde gösterir. --follow
bayrağı, günlükleri gerçek zamanlı olarak izlemenizi sağlar.
Kaynakları Temizleme
Eski konteynerler ve imajlar sisteminizde hızla birikebilir. docker rm my-container
komutunu kullanarak bir konteyneri kimliği veya adıyla silebilirsiniz.
İmajlar için komut docker rmi my-image:latest
şeklindedir. İmajın kimliğini veya tam etiket adını girin. Bir etiketi belirtirseniz, imaj daha fazla etiket atanmadıkça silinmez. Aksi takdirde, belirtilen etiket kaldırılır, ancak imajın diğer etiketleri kullanılabilir kalır.
Toplu temizlemeler docker prune
komutuyla mümkündür. Bu, durdurulmuş tüm konteynerleri ve gereksiz imajları kolayca kaldırmanıza olanak tanır.
Grafiksel Yönetim
Terminal sizin için uygun değilse, Docker için grafiksel bir arayüz kurmak için üçüncü taraf araçlar kullanabilirsiniz. Web panoları, kurulumunuzu hızla izleyip yönetmenize olanak tanır. Ayrıca konteynerlerinizi uzaktan kontrol etmenize de yardımcı olur.
Kalıcı Veri Depolama
Docker konteynerleri varsayılan olarak geçicidir. Bir konteynerin dosya sisteminde yapılan değişiklikler, konteyner durduktan sonra kalıcı olmaz. Basit bir docker run
komutuyla başlatılan bir konteynerde herhangi bir dosya depolama sistemi çalıştırmak güvenli değildir.
Kalıcı verileri yönetmek için birkaç farklı yaklaşım vardır. En yaygın olanı, Docker Volume kullanmaktır. Volume’lar, konteyner dosya sistemlerine monte edilen depolama birimleridir. Bir volume içindeki veriler, bağlantılı konteyner durduktan sonra bile sağlam kalır ve gelecekte başka bir konteyner ile bağlanmanıza olanak tanır.
Güvenliği Sağlama
Docker’laştırılmış iş yükleri, çıplak metal muadillerine göre daha güvenli olabilir, çünkü Docker, işletim sistemi ile hizmetleriniz arasında bir ayrım sağlar. Bununla birlikte, Docker genellikle root olarak çalıştığı için güvenlik sorunu potansiyeli taşır ve kötü amaçlı yazılımlar çalıştırmak için istismar edilebilir.
Eğer Docker’ı sadece bir geliştirme aracı olarak kullanıyorsanız, varsayılan kurulum genellikle güvenle kullanılabilir. Üretim sunucuları ve ağ erişimine sahip daemon soketli makineler, canlı yayına geçmeden önce sağlamlaştırılmalıdır.
Docker kurulumunuzu denetleyerek potansiyel güvenlik sorunlarını belirleyin. Güçlü yanları bulmanıza ve çözümler öneren otomatik araçlar mevcuttur. Ayrıca, bireysel konteyner imajlarını içeriden istismar edilebilecek sorunlar için tarayabilirsiniz.
Birden Fazla Konteynerle Çalışma
docker
komutu, yalnızca bir seferde bir konteynerle çalışır. Genellikle konteynerleri toplu halde kullanmak istersiniz. Docker Compose, konteynerlerinizi bir YAML dosyasında deklaratif olarak tanımlamanıza olanak tanıyan bir araçtır. Hepsini tek bir komutla başlatabilirsiniz.
Bu, projeniz diğer hizmetlere bağımlı olduğunda faydalıdır; örneğin, bir web arka ucunun bir veritabanı sunucusuna ihtiyacı olduğunda. Her iki konteyneri de docker-compose.yml
dosyanızda tanımlayabilir ve otomatik ağ oluşturma ile basitleştirilmiş yönetimden yararlanabilirsiniz.
İşte basit bir docker-compose.yml
dosyası:
yamlKodu kopyalaversion: "3"
services:
app:
image: app-server:latest
ports:
- 8000:80
database:
image: database-server:latest
volumes:
- database-data:/data
volumes:
database-data:
Bu, iki konteyneri (app ve database) tanımlar. Veritabanı için bir volume oluşturulur. Bu, konteynerde /data
olarak monte edilir. Uygulama sunucusunun 80 numaralı portu, ana bilgisayarda 8000 olarak açılır. docker-compose up -d
komutunu çalıştırarak hem hizmetleri hem de ağı ve volume’ü başlatabilirsiniz.
Docker Compose kullanımı, paylaşabileceğiniz yeniden kullanılabilir konteyner tanımları yazmanıza olanak tanır. Geliştiricilerin docker run
komutlarını ezberlemeleri yerine, docker-compose.yml
dosyasını sürüm kontrolüne gönderebilirsiniz.
Birden fazla konteyner çalıştırmanın başka yaklaşımları da vardır. Docker App, başka bir soyutlama düzeyi sağlayan yükselen bir çözümdür. Ekosistemde, Podman, terminalinizde “pod”lar oluşturmanıza olanak tanıyan Docker’a alternatif bir araçtır.
Konteyner Orkestrasyonu
Docker, üretimde genellikle tek başına kullanılmaz. Artık Kubernetes veya Docker Swarm modu gibi bir orkestrasyon platformu kullanmak daha yaygındır. Bu araçlar, birden fazla konteyner replikasını yönetmek için tasarlanmıştır, bu da ölçeklenebilirlik ve güvenilirliği artırır.
Docker, daha geniş bir konteynerleştirme hareketinin sadece bir bileşenidir. Orkestratörler, üretim için daha uygun bir ortam sağlamak üzere aynı konteyner çalıştırma teknolojilerini kullanır. Birden fazla konteyner örneği kullanmak, aşamalı güncellemeler ve makineler arasında dağıtım sağlar, bu da dağıtımınızı değişim ve kesintilere karşı daha dirençli hale getirir. Geleneksel Docker CLI, tek bir ana bilgisayarı hedefler ve bireysel konteynerlerle çalışır.
Konteynerler İçin Güçlü Bir Platform
Docker, konteynerlerle çalışmak için ihtiyacınız olan her şeyi sağlar. Yazılım geliştirme ve sistem yönetimi için önemli bir araç haline gelmiştir. Temel avantajları, bireysel hizmetler için artan izolasyon ve taşınabilirliktir.
Docker ile tanışmak, temel konteyner ve imaj kavramlarını anlamayı gerektirir. Bu kavramları, iş yüklerinizi konteynerleştiren özel imajlar ve ortamlar oluşturmak için uygulayabilirsiniz.