Docker konteynerim Nginx ile 80 portunda çakışma yaşıyor, nasıl çözerim?

0

VPS'ime Docker ile bir uygulama dağıtmaya çalışıyorum. Uygulama, 80 portunu kullanarak yayın yapması gereken bir web sunucusu içeriyor. Ancak sunucumda zaten nginx kurulu ve 80 portunu kullanıyor. Docker konteynerimi `docker run -p 80:80 my-app-image` komutuyla çalıştırmaya çalıştığımda "Bind for 0.0.0.0:80 failed: port is already allocated" hatasını alıyorum. Nginx'i durdurup denediğimde konteyner sorunsuz çalışıyor ama o zaman da ana web sitem çalışmıyor. Ben hem Nginx'in hem de Docker konteynerinin aynı sunucuda, aynı IP adresi üzerinden farklı alan adları için 80/443 portlarını kullanmasını istiyorum. Nginx'i bir reverse proxy olarak kullanmam gerektiğini biliyorum ama yapılandırmayı bir türlü başaramadım. Nginx'in `default.conf` dosyasında veya `sites-enabled` içindeki yapılandırmalarda ne gibi değişiklikler yapmalıyım ki Docker konteynerim Nginx ile çakışmadan çalışsın ve dışarıdan erişilebilsin?

#docker #port çakışması #reverse proxy

Cevaplar (2)

0

Bu durum, nginx'in ana sunucuda 80. portu zaten kullanmasından kaynaklanıyor. Docker konteynerinin de aynı portu kullanmak istemesi çakışmaya yol açıyor. Aslında yapmak istediğin gayet standart bir Reverse proxy kurulumu.

Nginx'i ana web siten için kullanmaya devam ederken, gelen istekleri Docker konteynerindeki uygulamana yönlendirebilirsin. Bunun için Nginx'in ana yapılandırma dosyasında (genellikle /etc/nginx/nginx.conf veya /etc/nginx/conf.d/default.conf gibi) veya /etc/nginx/sites-available/ altında oluşturacağın yeni bir sanal host dosyasında düzenleme yapman gerekiyor. Nginx'in kendisi 80. portunu dinlemeye devam edecek ama bu porttan gelen trafiği, hangi alan adına (domain name) geldiğine bakarak doğru yere iletecek.

Örneğin, ana web siten Example.com ve Docker uygulaman App.example.com adresi üzerinden erişilecekse, Nginx yapılandırman şöyle bir mantık izlemeli:

Server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:PORT_BILGINIZ_BURAYA; # Ana siteniz buraya
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

server {
    listen 80;
    server_name app.example.com;

    location / {
        proxy_pass http://127.0.0.1:8080; # Docker konteynerinizin çalıştığı port
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Burada dikkat etmen gereken en önemli nokta, Docker konteynerini çalıştırırken -p ile host makinede farklı bir portu (örneğin 8080) eşleştirmen ve Nginx'in bu eşleşen porta yönlendirme yapması. Yani Docker komutun şöyle olabilir: Docker run -p 8080:80 my-app-image. Böylece Nginx hem ana siteni (kendi içinde çalışıyorsa) hem de Docker uygulamanı aynı anda sunabilir. Yapılandırmayı yaptıktan sonra Nginx'i yeniden başlatmayı unutma: Sudo systemctl restart nginx.