İçeriğe geç

Docker hatası: port zaten kullanımda, nasıl serbest bırakılır

Orta 10 dk Güncellendi:

Kısa cevap

"port is already allocated" hatası, istenen portun zaten başka bir işlem tarafından kullanıldığı anlamına gelir. `netstat` veya `lsof` ile işlemi bulun, durdurun veya Docker yapılandırmasındaki port eşlemesini değiştirin.

Sorun nasıl anlaşılır

  • Docker `Bind for 0.0.0.0:8080 failed: port is already allocated` hatasını gösteriyor
  • İmaj doğru olmasına rağmen konteyner başlamıyor
  • `docker ps` portu kullanan konteyneri göstermiyor ancak hata devam ediyor
  • Docker hizmeti yeniden başlatıldıktan sonra bile port kullanımda

En yaygın nedenler

Başka bir konteyner aynı portu kullanıyor

En yaygın neden, aynı portu ana makineye eşleyen çalışan bir konteynerdir. Aynı porta sahip bir konteyner olup olmadığını `docker ps` ile kontrol edin.

Yerel uygulama portu tutuyor

Ana makinedeki bir işlem (örneğin geliştirme sunucusu, veritabanı) portu kullanıyor olabilir. Bu, kapatmayı unuttuğunuz bir uygulama olabilir.

Önceki konteyner düzgün durdurulmamış

Konteyner zorla kaldırıldıysa veya Docker işlemi düzgün sonlanmadıysa, portu tutan artık bir işlem kalmış olabilir. Bazen kaynakları elle serbest bırakmak gerekir.

Ana makinedeki başka bir hizmet aynı portu tutuyor

Ana makinedeki başka bir hizmet, Docker'ın kullanmaya çalıştığı portu tutuyor olabilir (örneğin IIS, Apache). Konteyneri başlatmadan önce portun zaten kullanımda olup olmadığını kontrol edin.

Adım adım çözüm

  1. 1

    Hangi konteynerlerin portu kullandığını kontrol edin

    Etkin konteynerlerin listesini ve eşlenen portlarını görmek için docker ps komutunu çalıştırın. Aynı portu kullanan bir konteyner bulursanız, docker stop <ad_veya_id> ile durdurun. Ardından kendi konteynerinizi yeniden başlatmayı deneyin.

  2. 2

    Ana makinede portu tutan işlemi bulun

    Linux'ta sudo lsof -i :<port> veya sudo netstat -tulpn | grep <port>, macOS'ta sudo lsof -i :<port> kullanın. Windows'ta PowerShell'i yönetici olarak açın ve netstat -ano | findstr :<port> komutunu çalıştırın. İşlemin PID'sini not edin.

  3. 3

    Portu kullanan işlemi durdurun

    Linux/macOS: kill <PID> (yanıt vermezse kill -9 <PID>). Windows: taskkill /PID <PID> /F. Dikkatli olun: tanımadığınız işlemleri durdurmayın; sistem işlemlerini durdurmak diğer uygulamaları etkileyebilir.

  4. 4

    Docker yapılandırmasında port eşlemesini değiştirin

    Portu serbest bırakamıyorsanız, docker run komutundaki veya docker-compose.yml dosyasındaki eşlemeyi değiştirin. Örneğin, -p 8080:80 yerine -p 8081:80 kullanın. Ardından konteyneri yeniden başlatın.

  5. 5

    Artık konteynerleri ve ağları temizleyin

    Bazen artık konteynerler sorunun nedenidir. Tüm konteynerleri görmek için docker ps -a çalıştırın, ardından gereksiz, önceden durdurulmuş olanları docker rm <ad_veya_id> ile kaldırın. Durdurulmuş konteynerleri, kullanılmayan ağları, bağlantısız imajları ve önbelleği kaldırmak için docker system prune da kullanabilirsiniz. Dikkatli olun: bu komut bu kaynakları kalıcı olarak siler, bu nedenle çalıştırmadan önce neye ihtiyacınız olduğunu kontrol edin ve verilerinizi yedekleyin.

  6. 6

    Docker hizmetini yeniden başlatın

    Port hala kullanımda görünüyorsa Docker'ı yeniden başlatın: Linux'ta sudo systemctl restart docker, Windows'ta Docker Desktop'ı yeniden başlatın. Ardından portun serbest olup olmadığını kontrol edin.

  7. 7

    Portun serbest bırakıldığını doğrulayın

    Portun artık kullanılmadığını doğrulamak için netstat veya lsof komutunu yeniden çalıştırın. Ardından konteynerinizi docker run veya docker compose up ile başlatın.

Hiçbir şey işe yaramazsa

Tüm adımlara rağmen port hala kullanımda kalıyorsa, ana makinedeki bir hizmetin portu otomatik olarak kullanıp kullanmadığını kontrol edin (örneğin antivirüs, VPN veya başka bir Docker konteyneri). Bu hizmetleri geçici olarak devre dışı bırakabilirsiniz. Ayrıca Linux'ta sudo netstat -tulpn hem IPv4 hem de IPv6 bağlantılarını gösterir, bu nedenle çakışmanın yalnızca birinde olup olmadığını kontrol edin. Aşırı durumlarda, konteynerin bağlandığı portu değiştirin (örneğin 8081) ve uygulama yapılandırmasını güncelleyin. Bu da işe yaramazsa, bilgisayarı yeniden başlatmayı düşünün.

Tekrarlanmaması için

  • Durdurulmuş konteynerleri zaman zaman `docker container prune` ile temizleyin, ancak önce bunlara ihtiyacınız olmadığından emin olun.
  • Docker Compose (`docker compose`) kullanın ve her hizmet için benzersiz portlar tanımlayın.
  • Konteyneri başlatmadan önce `netstat` veya `lsof` ile portun serbest olup olmadığını kontrol edin.
  • Aynı uygulamanın birden fazla örneğini aynı portta başlatmaktan kaçının.

Ne zaman uzmana başvurmalı

Portu tutan işlemi bulamıyorsanız veya Docker ağıyla ilgili daha derin bir sorundan şüpheleniyorsanız, BT desteğine başvurun. Sistem işlemlerini ve yapılandırmayı güvenli bir şekilde inceleyebilirler.

Yazılım ve ürün geliştirme · Özel uygulamalar, SaaS ve 4-8 haftada MVP

Sık sorulan sorular

Windows'ta hangi işlemin portu kullandığını nasıl anlarım?

PowerShell'i yönetici olarak açın ve `netstat -ano | findstr :<port>` komutunu çalıştırın. Son sütundaki PID'dir. Ardından Görev Yöneticisi'nde Ayrıntılar sekmesinde bu PID'ye sahip işlemi arayın.

`docker system prune` kullanmak güvenli mi?

`docker system prune` tüm durdurulmuş konteynerleri, kullanılmayan ağları, bağlantısız imajları ve derleme önbelleğini kaldırır. `-a` seçeneği ayrıca kullanılmayan tüm imajları kaldırır. Bu, yer açabilir ancak ihtiyacınız olan bir şeyi silmemeye dikkat edin. Çalıştırmadan önce konteyner listesini ve disk kullanımını kontrol edin.

Etkin konteyner yokken Docker neden hata veriyor?

Portu ana makinedeki bir işlem veya artık bir Docker işlemi kullanıyor olabilir. Gerçek nedeni bulmak için `netstat` veya `lsof` kontrol edin ve durdurulmuş konteynerleri elemek için `docker ps -a` kullanın.

Paylaş
Çözüm bulamadınız mı?AI BT asistanı 7/24 hizmetinizde. Sorunu anlatın veya hatanın ekran görüntüsünü gönderin, durumunuza özel talimat alın.AI BT asistanına sorun