Docker port is already allocated ve address already in use hatası çözümü
Docker port çakışmasında portu kullanan konteyneri veya süreci bulun; host portunu değiştirin ve Compose eşlemesini doğru biçimde doğrulayın.
Docker konteyneri başlatılırken görülen port is already allocated veya bind: address already in use mesajı, Docker'ın host üzerindeki bir IP ve port birleşimini ayıramadığını gösterir. Konteyner içindeki uygulama sağlıklı olsa bile dış bağlantı için seçilen port başka bir işlem tarafından kullanılıyor olabilir.
Çözüm, portu kullanan işlemi belirlemek ve ihtiyaca göre o işlemi durdurmak veya yeni konteynerin host portunu değiştirmektir. İki konteynerin iç portunun 80 olması sorun değildir; çakışma aynı host adresinde yayımlanmaya çalışılan portta oluşur.
1. Host portu ile container portunu ayırın
docker run -p 8080:80 nginx
Bu örnekte soldaki 8080 host portudur; sağdaki 80 konteyner portudur. Aynı host üzerinde ikinci bir uygulamayı 8081:80 ile yayımlayabilirsiniz. İki konteyner farklı ağ alanlarında 80 portunu dinlerken host tarafında ayrı portlar kullanır.
IP adresi de bağlama davranışının parçasıdır. Tüm arayüzleri temsil eden 0.0.0.0 bağlaması, belirli bir arayüzdeki kullanım ile çakışabilir. Hata mesajında gösterilen IP ve portu birlikte okuyun; yalnızca konteynerin adını değiştirmek sorunu çözmez.
2. Portu kullanan Docker konteynerini bulun
docker ps --format "table {{.Names}}\t{{.Ports}}"
docker ps --filter publish=8080
İlk komutun PORTS sütununda host tarafındaki :8080-> eşlemesini arayın. Publish filtresi ek bir daraltma aracıdır; gerçek IP/host portu eşlemesini yine PORTS sütunundan doğrulayın. Farklı Compose projeleri de aynı host portunu isteyebilir.
Bulduğunuz konteyner kullanılmayan eski bir geliştirme örneğiyse, adıyla docker stop <konteyner-adi> çalıştırabilirsiniz. Hâlâ gerekli bir hizmeti yalnızca port boşalsın diye durdurmayın; yeni hizmetin host portunu değiştirmek daha uygun olabilir. Durdurulmuş konteynerler normalde portu dinlemez; bütün konteynerleri silmek gerekmez.
3. Docker dışındaki süreci kontrol edin
Windows PowerShell'de dinleyen port ve süreç kimliği:
Get-NetTCPConnection -LocalPort 8080 -State Listen |
Select-Object LocalAddress, LocalPort, OwningProcess
Get-Process -Id <OwningProcess-degeri>
Linux üzerinde:
sudo ss -ltnp 'sport = :8080'
macOS üzerinde:
lsof -nP -iTCP:8080 -sTCP:LISTEN
Sürecin kimliğini öğrendikten sonra onu ait olduğu uygulama veya servis üzerinden kapatın. Örneğin yerel bir geliştirme sunucusu terminalinde normal durdurma işlemini kullanın. Bilinmeyen PID'leri zorla sonlandırmak veri veya hizmet kaybına yol açabilir. Komutlarda TCP kontrol edildiğini unutmayın; hata UDP yayınıyla ilgiliyse protokole uygun araç seçin.
4. Compose içinde yalnızca host portunu değiştirin
Aşağıdaki geliştirme örneğinde uygulama konteyner içinde hâlâ 80 portunu kullanır. Host tarafı 8081'e taşınır ve yalnızca yerel bilgisayardan erişim için localhost'a bağlanır:
services:
web:
image: nginx:stable
ports:
- "127.0.0.1:8081:80"
docker compose config
docker compose up -d web
docker compose ps
Config komutu birleştirilmiş Compose yapılandırmasını gösterir. Override dosyaları veya ortam değişkenleri başka bir port ekleyebilir. Üretimde image sürümünü proje politikanıza göre sabitleyin; buradaki etiket örnek içindir. Dışarıdan erişim gerekiyorsa bağlanacak arayüzü ayrıca planlayın.
5. Yeni portu uygulama tarafında da doğrulayın
Tarayıcıda http://localhost:8081 adresini açın. Konteynerler aynı Compose ağı üzerinden birbirine bağlanıyorsa genellikle servis adını ve container portunu kullanır; örneğin web:80. Host portunu değiştirmeniz bu iç adresi otomatik değiştirmez.
Dinleyen süreç görünmediği halde Windows'ta erişim izni veya rezerve port hatası alıyorsanız, hata metninin gerçekten address already in use olup olmadığını kontrol edin. Rezerve port aralıkları ve erişim engelleri farklı bir durumdur. Docker Desktop'ı yeniden başlatmayı, yapılandırma ve süreç kontrolünden sonra değerlendirin.
Kısa rehber
Sık yapılan hata
docker system prune veya volume silme işlemlerini port hatasının ilk çözümü olarak kullanmak. Port eşlemesini düzeltmek çoğu durumda yeterlidir; volume silmek kalıcı veriyi etkileyebilir.