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
Hangi konteynerlerin portu kullandığını kontrol edin
Etkin konteynerlerin listesini ve eşlenen portlarını görmek için
docker pskomutunu ç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
Ana makinede portu tutan işlemi bulun
Linux'ta
sudo lsof -i :<port>veyasudo netstat -tulpn | grep <port>, macOS'tasudo lsof -i :<port>kullanın. Windows'ta PowerShell'i yönetici olarak açın venetstat -ano | findstr :<port>komutunu çalıştırın. İşlemin PID'sini not edin. - 3
Portu kullanan işlemi durdurun
Linux/macOS:
kill <PID>(yanıt vermezsekill -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
Docker yapılandırmasında port eşlemesini değiştirin
Portu serbest bırakamıyorsanız,
docker runkomutundaki veyadocker-compose.ymldosyasındaki eşlemeyi değiştirin. Örneğin,-p 8080:80yerine-p 8081:80kullanın. Ardından konteyneri yeniden başlatın. - 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çindocker system pruneda 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
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
Portun serbest bırakıldığını doğrulayın
Portun artık kullanılmadığını doğrulamak için
netstatveyalsofkomutunu yeniden çalıştırın. Ardından konteynerinizidocker runveyadocker compose upile 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 MVPSı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.