Ana içeriğe geç

Bir Docker İmajını Konteyner Olarak Çalıştırma: Uygulamalı Başlangıç Rehberi

Bu eğitim, docker run kullanarak Docker imajlarını güvenle çalıştırmayı; net örnekler, pratik ipuçları ve sorun giderme önerileriyle öğretir.
· 9 dk. oku

Yapay Zeka ile Keşfedin

Bir Docker imajını çalıştırmanın yolunu merak ediyorsanız, yalnız değilsiniz. İmajı Docker Hub’dan yeni çekmiş olun ya da kendiniz oluşturmuş olun, onu çalıştırmak uygulamanızı hayata geçiren kilit adımdır.

Bu eğitim, docker run komutuna ve ötesine başlangıç düzeyinde, anlaşılır bir rehberdir. Şunları öğreneceksiniz:

  • Docker imajlarının ve konteynerlerin aslında ne olduğunu.
  • Bir imajı farklı seçeneklerle nasıl çalıştıracağınızı.
  • Ve konteynerleri bir profesyonel gibi nasıl durduracağınızı, sileceğinizi ve sorun gidereceğinizi.

Sonunda, kendi konteynerlerinizi başlatırken ve kaputun altında tam olarak neler olup bittiğini anlarken kendinize güveneceksiniz.

Docker İmajlarını ve Konteynerleri Anlama

Komut örneklerine geçmeden önce, Docker imajlarını ve konteynerleri basitçe anlayalım.

Bu terimlere hâlihazırda aşinaysanız, bir sonraki bölüme geçebilirsiniz!

Docker imajı nedir?

Docker imajı, uygulamanız için değiştirilemez bir plandır. Konteynerinizin ihtiyaç duyduğu her şeyi tanımlar: kod, kütüphaneler, ortam ve yapılandırmalar. Bir imaja sahip olduğunuzda, ondan bir ya da yüz konteyner başlatabilirsiniz. Her seferinde tutarlı kalır.

Peki imajlar nereden gelir? Dockerfile onları oluşturur. Bir Dockerfile, hangi temel imajın kullanılacağını, hangi bağımlılıkların kurulacağını ve uygulamanızın nasıl çalışacağını tanımladığınız yerdir.

Dockerfile hazır olduğunda, docker build komutunu çalıştırırsınız. Bu komut dosyadaki adımları izler ve bunları yeniden kullanılabilir bir imaja dönüştürür.

Docker konteyneri nedir?

Docker konteyneri, bir Docker imajının çalışan sürümüdür. Uygulamanızın kendi izole ortamında çalışmasına olanak tanır ve ana sistemden bağımsız olarak tutarlı davranış sağlar. 

“Bir kez derle, her yerde çalıştır” yaklaşımını izler; böylece her seferinde ortamı elle kurmanıza gerek kalmaz. 

İmaj vs konteyner

Aşağıdaki tablo bir imaj ile bir konteyneri yan yana karşılaştırır:

İmaj

Konteyner 

Bir imaj, bir konteyneri çalıştırmak için gereken tüm dosyaları, ikilileri, kütüphaneleri ve yapılandırmaları içeren standartlaştırılmış bir pakettir.

Bir imajın çalışma zamanı örneği.

Bir imaj değiştirilemezdir. Yani yeniden oluşturulana kadar değiştirilemez.

Konteyner değiştirilebilir. Çalışırken üzerinde değişiklik yapabilir, yeni paketler kurabilir veya yapılandırma dosyalarını değiştirebilirsiniz.

Bir Dockerfile (bir imajı oluşturmaya yönelik talimatlar) bir imaj oluşturur.

Bir imaj bir konteyner oluşturur.

Bilgisayarınız imaj dosyalarını saklar.

Bir konteyner belleğinizde çalışır.

Konteynerleştirmeye tamamen yeniyseniz, Introduction to Docker kursumuz temel kavramları uygulamalı örneklerle anlatır.

docker run Komutu

docker run komutunu çalıştırdığınızda, Docker’a bir imajdan yeni bir konteyner başlatmasını söylersiniz.

Basitçe söylemek gerekirse, izole bir ortam içinde bir program başlatırsınız. Bu program basit bir web uygulaması da olabilir, birden çok süreçli tam teşekküllü bir servis de. 

Temel sözdizimi

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

  • [OPTIONS] - Konteynerin nasıl çalışacağını özelleştirmek için ek bayraklar
  • IMAGE - Docker imaj adı 
  • [COMMAND] - (İsteğe bağlı) İmajdaki varsayılan komutu geçersiz kılar.
  • [ARG...]- (İsteğe bağlı) Argümanlar.

Yaygın bayraklar ve seçenekler

  • -d: Ayrık mod: konteynerleri arka planda çalıştırır
  • -p: Port eşleme: Tarayıcınızdan bir servise (ör. API veya web uygulaması) erişmek için bir portu açmanız gerekir. Örnek: -p 3000:3000 makinenizin 3000 portunu konteynerin 3000 portuna eşler.
  • --name: Docker konteynere varsayılan bir ad verir, ancak bu bayrakla yeni bir ad atayabilirsiniz.
  • -v:  Verileri konteynerin kendisinden ayrı tutmak için kullanılır; böylece konteyner durdurulsa veya silinse bile veriler kalıcı olur.
  • --rm: Konteyner durduğunda onu otomatik olarak siler.
  • -e: Veritabanı parolaları veya API anahtarlarını uygulamanıza gömmeden iletmek için kullanın.

Etkileşimli ve ayrık konteyner çalıştırma

Docker konteynerleri iki şekilde çalıştırır: etkileşimli mod (-it) ve ayrık mod (-d). Her mod, amacınıza bağlı olarak farklı kullanım senaryolarına sahiptir. 

  • -it: Etkileşimli mod: Bir konteynerin içinde doğrudan terminalle çalışmak istiyorsanız -it bayrağını kullanabilirsiniz. Konteyneri etkileşimli moda alır; böylece komut yazabilir, çıktıyı görebilir ve gerçek zamanlı çalışabilirsiniz.
    • -i: Girdiyi açık tutar ki konteynere komut yazabilesiniz
    • -t: Konteyner içinde terminal benzeri bir arayüz sağlar
  • -d: Ayrık mod: Konteyneri arka planda çalıştırır; terminaliniz diğer işler için serbest kalır. 

Önemli komutları ve iyi uygulamaları elinizin altında tutmak için Docker for Data Science Cheat Sheet’imize göz atın.

Docker İmajlarını Çekme ve Çalıştırma

docker run komutunun sözdizimini artık bildiğinize göre, bu bölüm özel imajlar oluşturmayı ve çalıştırmayı gösterecek.

Docker Hub’daki imajları kullanma

Docker Hub, konteyner imajları için çevrimiçi bir kütüphane gibidir. Hazır imajları alabilir veya kendi imajlarınızı yükleyip başkalarıyla paylaşabilirsiniz. Hem herkese açık hem de özel depoları destekler; böylece imajları toplulukla açıkça paylaşabilir veya dahili ekipleriniz için erişim kontrolleri uygulayabilirsiniz.

Özel imajları çalıştırma 

Bir Docker imajını çalıştırmak için önce onu bir Dockerfile kullanarak oluşturmanız gerekir. Ardından yerel olarak çalıştırabilir veya paylaşmak için Docker Hub’a gönderebilirsiniz. 

Öyleyse önce bir Dockerfile oluşturalım. İşte bir örnek:

# Use official Python base image
FROM python:3.11-slim
# Set working directory in the container
WORKDIR /app
# Copy requirements file and install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy the rest of the app code
COPY . .
EXPOSE 5000
# Set default command
CMD ["python", "app.py"]

Yukarıdaki Dockerfile ne anlama geliyor?

  • FROM python:3.11-slim: Python 3.11 sürümünü içeren temel imaj
  • WORKDIR /app: Konteyner içinde çalışma dizinini /app olarak ayarlar.
  • COPY requirements.txt . : Tüm bağımlılıkları yerel makineden konteynerin uygulama dizinine taşır.
  • RUN pip install --no-cache-dir -r requirements.txt: requirements.txt içindeki bağımlılıkları kurar.
  • COPY . . : Geçerli çalışma dizinindeki kodu (uygulamalar, yapılandırma dosyaları vb.) konteynerin uygulama dizinine kopyalar.
  • CMD ["python", "app.py"]: Bu imajdan bir konteyner başlatılırken app.py’yi çalıştırır.

Adım 1. Dockerfile’ı oluşturun 

Bu Dockerfile’ı derlediğinizde neler olduğuna bakalım.

  • Aşağıdaki komutu çalıştırın:
docker build -t my-python-app .

Not: Bu komutun çalışması için önce sisteminizde Docker kurulmuş olmalıdır; bu kılavuz kuruluma yardımcı olur.

Terminalde docker build -t my-python-app komutunun çalıştırılmasının sonuçlarını gösteren görsel.

Derleme komutunu çalıştırdığınızda arka planda şunlar olur:

  1. Docker Dockerfile’ı okur
  2. Python temel imajı Docker Hub’dan çekilir
  3. Çalışma dizini /app olarak ayarlanır.
  4. requirements.txt konteynere kopyalanır.
  5. Bağımlılıklar pip install ile kurulur.
  6. Kodunuzun geri kalanı /app dizinine kopyalanır.
  7. Son imaj my-python-app etiketiyle işaretlenir.

Adım 2: Dockerfile’ı çalıştırın

İmajınız oluşturulduktan sonra, şunu kullanarak çalıştırabilirsiniz:

docker run -p 5000:5000 my-python-app

Çalıştırdığınızda şunlar olur: 

  • Özel imajınız my-python-app’ten yeni bir konteyner oluşturulur.
  • Makinenizdeki 5000 portu, konteynerdeki 5000 portuna eşlenir (-p 5000:5000).
  • CMD ["python", "app.py"] çalıştırılır ve uygulamayı başlatır.
  • -d seçeneği (ayrık mod) nedeniyle konteyner arka planda çalışır.

Bu noktada tarayıcınızda http://localhost:5000 adresine gidebilir ve uygulamanızın çalıştığını gösteren aşağıdakine benzer bir ekran göreceksiniz:

http://localhost:5000 adresinde

Makine öğrenimi alanında çalışıyorsanız, bu ML ve AI için en iyi Docker imajları ortam kurulumunuzu hızlandırabilir.

Yapılandırmayla imaj çalıştırma

Bazı uygulamalar için imajları belirli bir yapılandırmayla çalıştırmanız gerekebilir. İşte iki yaygın örnek.

Veriyi kalıcı kılma

Konteynerler veriyi geçici olarak saklar. Onları sildiğinizde veri kaybolur. Volume, veriyi konteynerin dışında saklamanın bir yoludur; böylece konteyner kaldırıldığında veya yeniden başlatıldığında bile veri kalıcı olur.

Bir volume bağlamak için aşağıdakine benzer bir komut çalıştırmalısınız:

docker run -v my-volume:/app/data my-image

/app/data içine yazılan veriler, konteyner kaldırıldıktan sonra bile volümde saklanır.

Ortam değişkenleri geçirme

Ortam değişkenleri, çalıştırma zamanında bir Docker konteynerine yapılandırma ayarları aktarır. Böylece Docker imajlarınızı değiştirmeden konteynerlerinizi özelleştirirsiniz. 

Ortam değişkenlerini iki şekilde iletebilirsiniz: 

  1. -e parametresiyle ortam değişkenleri geçebilirsiniz. Örnek bir komut:
docker run -e ENV=production -e DEBUG=False my-image
  1. Tüm ortam değişkenlerini içeren bir .env dosyası oluşturup komuta iletebilirsiniz. Örnek:
docker run --env-file .env my-image

Örnek .env dosyası:

ENV=staging
DEBUG=True
SECRET_KEY=mysecret

Çalışan Konteynerleri Yönetme

Bir konteyner çalıştıktan sonra onu görüntüleyebilir, durdurabilir ve erişebilirsiniz. Bunu nasıl yapacağınıza bakalım.

Aktif konteynerleri görüntüleme

Sisteminizde çalışan tüm Docker konteynerlerini listelemek için docker ps komutunu veya docker container ls komutunu çalıştırın. Bu komut konteyner kimliği, imaj, komut, port, durum ve diğer ayrıntıları gösterir.

docker ps
# or
docker container ls

Yalnızca çalışanlar değil — çıkmış veya oluşturulmuş ama başlatılmamış olanlar da dahil — tüm konteynerleri görmek için -a bayrağını kullanın:

docker ps -a

Yalnızca en son oluşturulan konteyneri görmek isterseniz, -l (last) bayrağını kullanın:

docker ps -l

Tüm konteynerleri oluşturulma zamanına göre, en yenisi en üstte olacak şekilde görmek için şunu çalıştırın:

docker ps -a --sort=created

Konteynerleri durdurma ve kaldırma

Belirli bir çalışan konteyneri durdurmak için docker stop komutunu ve ardından konteyner kimliğini veya adını kullanın:

docker stop <container_id_or_name>

Tüm çalışan konteynerleri durdurmak için:

docker stop $(docker ps -q)
  • $(docker ps -q) çalışan tüm konteyner kimliklerinin listesini döndürür.

Bir konteyner durdurulduktan sonra, şunu kullanarak kaldırabilirsiniz:

docker rm <container_id_or_name>

Duran tüm konteynerleri kaldırmak için şunu çalıştırın:

docker container prune

Kullanılmayan konteynerleri, volumeleri, ağları ve imajları kaldırmaya daha da ileri gitmek için Docker prune rehberine göz atın.

Konteyner günlüklerine ve kabuğa erişme

  • docker logs - docker logs komutu, yürütme anındaki günlükleri toplu olarak getirir.
  • docker exec - docker exec, çalışan bir konteynerin içinde yeni bir komutu durdurmadan veya yeniden başlatmadan çalıştırmanıza olanak tanır. Bunu, konteynerinizin içinde yeni bir terminal açmak gibi düşünebilirsiniz — etrafa bakınabilir, betikler çalıştırabilir, günlükleri kontrol edebilir veya hata ayıklayabilirsiniz.
  • docker attach - docker attach, terminalinizi doğrudan çalışan bir konteynerin ana sürecine bağlar. Bu sayede konteynerin canlı çıktısını (günlükler, istemler vb.) görebilir ve süreç girdi kabul ediyorsa etkileşim kurabilirsiniz.

Yaygın Sorunları Giderme

Yaygın sorunlara basit çözümler. Docker imajları çalıştırırken karşılaşılan bazı tipik hatalar ve bunlara nasıl yaklaşabileceğiniz aşağıdadır. 

Hata 1: “Error response from daemon: pull access denied for alpine-python, repository does not exist or may require ‘docker login’: denied: requested access to the resource is denied.”

  • Ne anlama gelir: Docker bir imajı çekmeye çalıştı; bu örnekte Docker Hub’daki alpine-python imajını; ancak imaj mevcut değil ya da özeldir ve kimliğiniz doğrulanmamıştır.
  • Nasıl düzeltilir:
    • Docker Hub’daki imaj adını ve etiketini tekrar kontrol edin.
    • Özel bir imajsa, kimlik doğrulamak için docker login çalıştırın.
    • Özel bir kayıttan çekiyorsanız imajın mevcut olduğundan emin olun.

Hata 2: “No such image found: <image-name>:<tag>”

  • Ne anlama gelir: Yerel olarak bir imajı çalıştırmayı veya etiketlemeyi denediniz; ancak imaj (ya da belirtilen etiket) sisteminizde mevcut değil.
  • Nasıl düzeltilir:
    • Mevcut imajları kontrol etmek için docker images komutunu kullanın.
    • İmajı açıkça çekin:
docker pull <image-name>:<tag>

Hata 3: “manifest for <image>:<tag> not found: manifest unknown: The named manifest is not known to the registry.”

  • Ne anlama gelir: Bu hata genellikle belirtilen imajın veya etiketin mevcut olmaması durumunda ortaya çıkar.
  • Olası çözümler: Bu öneriler yaygın hataların çoğunu çözecektir: 
    • Doğru imaj ve etiket adını doğrulayın.
    • Docker Hub’daki ya da kendi kayıt depolarınızdaki imajın etiketlerine bakın.
    • Geçerli bir sürümü almak için docker pull <image>:<tag> komutunu kullanın.
    • Yerelde derliyorsanız, doğru bir Dockerfile kullanın ve imajı şu komutla derleyin:
docker build -t <image>:<tag> .

Port çakışmaları ve bağlama hataları

Port çakışmaları, birden fazla konteynerin veya bir konteyner ile başka bir uygulamanın aynı porta erişmeye çalışmasıyla ortaya çıkar.

  • Nasıl düzeltilir:
    • Konteynerinizi çalıştırırken farklı bir host portu kullanın:
docker run -p 8081:80 <image>
  • Portu hâlihazırda kullanan servisi durdurun.
  • Bir portu (ör. 8080) neyin kullandığını şununla tespit edin:
lsof -i :8080

Sonuç 

Bir Docker imajını çalıştırmak, ister basit bir web sunucusu başlatıyor olun ister karmaşık bir uygulama dağıtıyor olun, konteyner kullanmanın en önemli ve güçlendirici adımlarından biridir. docker run, docker ps ve docker stop gibi yalnızca birkaç komutla artık konteynerleri güvenle başlatmaya, yönetmeye ve sorun gidermeye hazırsınız.

Daha ileri gitmeye hazırsanız, bir Dockerfile ile kendi imajınızı derlemeyi deneyin, gelişmiş docker run bayraklarını keşfedin veya birden fazla konteyneri Docker Compose ile nasıl yöneteceğinizi öğrenin.

Docker yolculuğunuza devam etmek için şu kurslara göz atın:

SSS

Aynı Docker imajından birden çok konteyner çalıştırabilir miyim?

Evet, aynı imajdan birden fazla konteyner çalıştırabilirsiniz. Her konteyner izoledir ve kendi ayarlarına, portlarına ve ortam değişkenlerine sahip olabilir.

Gizli bilgilerimi veya API anahtarlarını bir Docker konteynerine güvenli şekilde nasıl aktarırım?

Ortam değişkenleri ayarlamak için -e bayrağını kullanın veya bir .env dosyası ve --env-file ile gizlileri çalıştırma zamanında, kodunuza gömmeden iletin.

Bir Docker imajını arka planda nasıl çalıştırırım?

Terminalin başka komutlar için kullanılabilir kalmasını sağlamak üzere konteyneri ayrık modda başlatmak için docker run ile -d bayrağını kullanın.

docker exec ile docker attach arasındaki fark nedir?

 docker exec konteyner içinde yeni bir kabuk oturumu açar; docker attach ise konteynerin ana sürecine ve canlı çıktısına bağlanır.

Bir imajı çalıştırırken neden 'pull access denied' hatası alıyorum?

Bu genellikle imajın özel olduğu veya yanlış yazıldığı anlamına gelir. Adı ve etiketi kontrol edin ve docker login ile Docker Hub’a giriş yaptığınızdan emin olun.

Bir konteyner durduktan sonra veriyi nasıl kalıcı tutarım?

Veriyi konteyner dışında tutmak ve konteyner kaldırıldıktan sonra bile korunmasını sağlamak için -v bayrağıyla bir volume bağlayın.

Geliştirme amaçları için bir konteyneri çalıştırmanın en iyi yolu nedir?

Etkileşimli mod için -it bayraklarını; yerel geliştirme ortamını taklit etmek için de volume bağlama ve ortam değişkenlerini kullanın.

Makinemde hangi portların çakıştığını nasıl öğrenebilirim?

Belirli bir portu hangi sürecin kullandığını öğrenmek için lsof -i :<port> komutunu kullanın; ardından o süreci durdurun veya konteyneriniz için farklı bir host portu kullanın.

Çalışan bir Docker konteynerinden günlükleri nasıl görüntülerim?

Konteynerin standart çıktı ve hata akışlarından günlükleri almak ve incelemek için docker logs <container_id> komutunu kullanın.

Srujana Maddula

Yazar

Srujana Maddula

Srujana, Bilgisayar Bilimleri alanında dört yıllık dereceye sahip serbest çalışan bir teknoloji yazarıdır. Veri bilimi, bulut bilişim, geliştirme, programlama, güvenlik ve daha birçok konuyu yazmak onun için doğal bir süreçtir. Klasik edebiyata ve yeni yerler keşfetmeye tutkuyla bağlıdır.

Konular

İlgili