Docker Nedir ve Geliştiriciler Neden Öğrenmelidir?
Geliştiriciler için Docker'ın pratik bir incelemesi: konteynerler vs VM'ler, temel komutlar, Dockerfiles ve gerçek projelerde kullanmaya nasıl başlanır.
Docker, iş ilanlarında ve kurulum kılavuzlarında sürekli ortaya çıkıyor ve eğer hiç konteyner kullanmadıysanız, gerçek kod yazabulmek için tırmanmanız gereken bir duvar gibi hissettirilebilir. Kelime dağarcığını geçtikten sonra karmaşık değildir.
Konteyner aslında ne
Bir konteyner uygulamanızı çalışması için gereken her şeyle paketler: kod, runtime, sistem kütüphaneleri ve yapılandırma dosyaları. Sanal makine değildir. Bir VM bütün bir işletim sistemini, kernel dahil olmak üzere sanallaştırır, yani bir tanesini başlatmak bir dakika sürebilir ve birkaç gigabyte RAM tüketebilir. Bir konteyner host makinenin kernelini paylaşır ve sadece süreci izole eder, bu yüzden bir saniyeden kısa sürede başlar ve genellikle gigabayt yerine onlarca megabyte kullanır.
Bu fark, Docker'ın neden yerel geliştirme ve CI pipeline'larını bu kadar hızlı ele geçirdiğini açıklıyor. Bir Postgres veritabanı, Redis cache'i ve uygulama sunucunuzu bir dizüstü bilgisayarda çalıştırabilir, bunları doğrudan OS'ye yüklemenize gerek olmadan.
Bilmeniz gereken temel parçalar
Gün içinde karşılaşacağınız şeylerin çoğunu kapsayan dört terim vardır:
- Image: Dockerfile'dan oluşturulmuş salt okunur şablon. Bunu bir dosya sistemi anlık görüntüsü artı onu nasıl çalıştıracağına dair metadata olarak düşünün.
- Container: bir image'in çalışan örneği. Kaynaklandıkları image'e dokunmadan konteynerları başlatabilir, durdurabilir ve silebilirsiniz.
- Dockerfile: bir image oluşturmak için satır satır talimatları içeren metin dosyası.
- Registry: image'lerin depolandığı ve çekildiği yer, en yaygın olarak Docker Hub.
Bir Node.js uygulaması için minimal bir Dockerfile şu şekilde görünür:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Bunu docker build -t my-app . ile oluşturun ve docker run -p 3000:3000 my-app ile çalıştırın. -p bayrağı, makinenizde bir portu konteyner içindeki bir porta eşler, bu yüzden uygulamaya tarayıcınızdan ulaşabilirsiniz.
Sürekli kullanacağınız komutlar
Birkaç komut günlük çalışmanın çoğunu kapsar:
docker ps— çalışan konteynerları listeledocker ps -a— durdurulanlar da dahil olmak üzere tüm konteynerları listeledocker images— makinenizdeki image'leri listeledocker logs <container>— çalışan veya çökmüş konteynerden çıktıyı kontrol etdocker exec -it <container> sh— çalışan bir konteynerin içinde shell açıdocker rm/docker rmi— artık ihtiyacınız olmayan konteynerler ve image'leri temizle
Son çift, insanların beklediğinden daha önemlidir. Docker, disk alanının eski image'ler ve durdurulan konteynerler içinde kaybolmasına mutlulukla izin verir. Ara sıra docker system prune çalıştırmak şaşırtıcı bir miktar alan geri kazanır.
Neden docker-compose iş akışını değiştirir
Çoğu gerçek proje birden fazla konteyner gerektirir: bir uygulama sunucusu, bir veritabanı, belki bir cache. Her biri için docker run komutlarını yazmak çabuk sıkıcı hale gelir. docker-compose.yml bütün yığını bir dosyada tanımlamanıza izin verir:
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: devpassword
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
docker compose up çalıştırın ve her iki hizmet birlikte başlar, ağlandırılır ve web hizmet adıyla db ile iletişim kurabilir. Bu, hemen hemen her açık kaynak depoyu README'sinde göreceğiniz kurulundur ve bunu anlamak, bir projeyi klonlayıp Postgres, Redis ve uygulamanın ihtiyaç duyduğu diğer şeyleri manuel olarak yüklemek yerine birkaç dakika içinde çalıştırmayı anlam gelir.
İnsanların erken dönemde takılı kaldığı yerler
Volumeler başlangıçta hemen herkesi kafası karıştırır. Volume olmadan, konteyner içine yazılan herhangi bir şey konteyner kaldırıldığında kaybolur, bu veritabanlar için sorunludur. Yukarıdaki compose dosyasındaki volumes bölümü, adlandırılmış bir volume'ü konteyner içindeki bir yola eşler, bu yüzden veriler yeniden başlamalar sonrasında da kalır.
Bir diğer yaygın hata, .dockerignore dosyası olmadığı için node_modules veya .git öğelerini image'e kopyalamaktır. .gitignore gibi bir tane ekleyin:
node_modules
.git
.env
Bu, derlemeleri hızlı tutar ve image'leri küçük kalmasını sağlar, bu da image'leri bir registry'ye ittiğinizde veya Kubernetes'e dağıttığınızda önemli hale gelir.
Temel bilgilerden sonra nereye gidilir
Konteyner oluşturma ve çalıştırma normal hale geldikten sonra, sonraki faydalı beceriler daha küçük üretim image'leri için çok aşamalı build'ler, Docker ağ modlarını anlamak ve bir şey doğru bağlanmadığında docker inspect çıktısını okumaktır. Hiçbiri zor değildir, sadece ilk sefer yabancıdır.
Gerçek uygulamaları konteynerleştirme ve bunları bulut dağıtım pipeline'larına bağlama hakkında daha fazla bilgi için, Korra Studio üzerindeki DevOps ve Cloud bölümlerine bakın.
AI yardımıyla yazıldı, Michal Pilch (CISSP), Korra Studio tarafından incelendi ve yayınlandı.
Bu, Korra Studio bilgi tabanından bir nottur — platform her konuyu 1-to-1 mentoring ile eşleştirir.
Ücretsiz başlaarrow_forward