Ragnarok 03 – Bir Sunucu Birden Fazla Docker Container ve Alan Adı

Bir önceki yazıda sunucumuza Docker Engine ve nginx kurulumu yaptık. Şimdi ise birden fazla docker containeri nasıl tek bir sunucuda çalıştırırız ve bu uygulamalara farklı alan adları ile nasıl erişebiliriz bunu öğrenmeye çalışacağız.

 

Bunun için Docker Hub üzerinde yer alan httpd containerını kullanarak hedeflediğim yapıya benzer şekilde 3 farklı uygulama ayağa kaldıracağız. Bu container bir ASP.NET Core uygulaması içermiyor ancak bizim için önemli bir örnekleri basitleştirmek. İsterseniz örnek ASP.NET Core uygulamaları kullanarak da bu işlemi gerçekleştirebiliriz.

 

Bu aşamadan sonra bazı docker komutları kullanıyor olacağız. Her ne kadar komut isimlerinden anlaşılabiliyor olsa da detaylı bilgi için Docker Docs sayfasını inceleyebilirsiniz.

 

Httpd containeri kullanarak sunucu tarafında 8080 portu üzerinde çalışacak container adı container-1 olan -dit (-d -i -t) komutları ile çalıştıracağız. Komutların detaylı açıklamasına Docker Docs sayfasından bakabilirsiniz.

 

docker run -dit --name container-1 -p 8080:80 httpd:2.4

 

Şu an sunucunu IP adresi üzerinden http://{Sunucu IP Adresi}:8080 (IP adresinde süslü parantezler olmayacak) bağlantısı ile ilk testimizi gerçekleştirebiliriz. Adrese gittiğimizde “It works!” yazan bir sayfanın bizi karşılamasını bekliyoruz. Başarabildiysek bir sonraki adıma geçebiliriz. Diğer örnek uygulamalarda ayırt edebilmek için “It works!” yazan bu yazıyı değiştirelim. Bunun için önce containerın idsini bulmamız gerekiyor.

 

docker ps

 

Bu komut ile şu an docker engine üzerinde çalışan containerlara ait bilgileri görebiliriz. Buradan container-1 isimli containerın idsini alıp bir sonraki işleme geçiyoruz.

{CONTAINER-1_ID} yazan yere container id gelecek şekilde düzenliyoruz. İşlem sonunda süslü parantezler kalmayacak.

 

docker exec {CONTAINER-1_ID} sed -i 's/It works!/Container 1/' /usr/local/apache2/htdocs/index.html

 

Bu komut container içindeki index.html dosyasında yazan “It works!” yazısını bulup onun yerine Container 1 yazacak. Şimdi sunucunun 8080 portunu ziyaret ettiğimizde “Container 1” yazdığını görebiliriz.

 

Şimdi sırada ikinci ve üçüncü containerımız var. Yine aynı komutu bu sefer ilgili değişiklikeri yaparak tekrar giriyoruz.

 

docker run -dit --name container-2 -p 8081:80 httpd:2.4

docker run -dit --name container-3 -p 8082:80 httpd:2.4

 

Yine karışıklığı önlemek için “It works!” yazısını container adı ile değiştirelim.Bunun için container idlerini tekrar buluyoruz.

 

docker ps

 

Ardından ilgili komutlarda idlere ait düzenlemeleri yaparak site içeriklerini değiştiriyoruz.

 

docker exec {CONTAINER-2_ID} sed -i 's/It works!/Container 2/' /usr/local/apache2/htdocs/index.html

 

docker exec {CONTAINER-3_ID} sed -i 's/It works!/Container 3/' /usr/local/apache2/htdocs/index.html

 

Şu an sunucumuza aşağıdaki IP adresleri ile erişip farklılığı görebiliriz.

 

http://{Sunucu IP Adresi}:8080                     Container 1

http://{Sunucu IP Adresi}:8081                     Container 2

http://{Sunucu IP Adresi}:8082                     Container 3

 

Şuan IP adresine direk gittiğinizde 80 portu üzerinde nginx karşılama sayfası çıkıyor. Ben tüm konfigürasyonu bitirdiğimde sahip olduğum alan adını aşağıdaki gibi ayarlamış olmak istiyorum.

 

aykutkaskaya.xyz                   Web Sitesi                  (80 portunda çalışacak)

api.aykutkaskaya.xyz             REST Servisi                (8081 portunda çalışacak)

admin.aykutkaskaya.xyz        Yönetim Paneli           (8082 portunda çalışacak)

 

NOT: Tüm bu işlemleri yapmadan önce ilgili alan adınız için DNS kayıtlarını yapmış olduğunuzu varsayıyorum. Ben DNS kayıtlarımda aykutkaskaya.xyz için sunucu IP’sine bakan bir A kaydı, api.aykutkaskaya.xyz için sunucu IP’sine bakan bir A kaydı, admin.aykutkaskaya.xyz için sunucu IP’sine bakan bir A kaydı oluşturdum. Bu işlemleri yapmadan devam ederseniz alan adınız ile sunucu IP adresi arasındaki ilişki kurulmadığı için alan adınız IP adresinizi çözemeyecek, dolayısıyla sayfalara erişemeyeceksiniz. DNS kayıtlarının güncellenmesi biraz zaman alabilir.

 

Siteyi ziyaret eden bir kullanıcı doğrudan web sitesine gitsin istiyorum. Bu sebeple şu anda 80 portunda yayan yapan nginx default sayfasını bir sonraki adımlarda siliyor olacağım. Artık nginx üzerinde alan adı konfigürasyonlarını yapabiliriz.

 

cd /etc/nginx/sites-available/

touch  aykutkaskaya.xyz.conf

nano aykutkaskaya.xyz.conf

 

Bunun için öncelikle /etc/nginx/sites-available/ klasöründe aykutkaskaya.xyz.conf isimli bir dosya oluşturuyor ve içeriğini aşağıdaki gibi düzenliyoruz.

 

server {

  listen        80;

  server_name   aykutkaskaya.xyz;

 

  location / {

    proxy_pass  http://localhost:8080;

  }

}

server {

  listen        80;

  server_name   {Sunucu IP AdresiI};

return 301 http://aykutkaskaya.xyz;

}

Bu ayarlar sayesinde sunucunun 80 portu dinlenecek ve “aykutkaskaya.xyz” alan adına gelen trafik 8080 portuna yönlendirilecek. İkinci server kod bloğu siteye direk IP adresi üzerinden gelen trafiği web sitesine zorunlu yönlendirmek için gerekli.

 

Aynı işlemleri api.aykutkaskaya.xyz ve admin.aykutkaskaya.xyz alan adları için de gerçekleştiriyoruz.

 

api.aykutkaskaya.xyz alan adı için:

 

cd /etc/nginx/sites-available/

touch  api.aykutkaskaya.xyz.conf

nano api.aykutkaskaya.xyz.conf

 

server {

  listen        80;

  server_name   api.aykutkaskaya.xyz;

 

  location / {

    proxy_pass  http://localhost:8081;

  }

}

 

admin.aykutkaskaya.xyz alan adı için:

 

cd /etc/nginx/sites-available/

touch  admin.aykutkaskaya.xyz.conf

nano admin.aykutkaskaya.xyz.conf

 

server {

  listen        80;

  server_name   admin.aykutkaskaya.xyz;

 

  location / {

    proxy_pass  http://localhost:8082;

  }

}

 

Bir sonraki aşamada bu ayarları sites-enabled klasörüne bağlayacağız. Öncesinde sites-enabled klasörüne gidelim.

 

 

cd /etc/nginx/sites-enabled

 

Ardından daha önce oluşturduğumuz conf dosyalarını sites-enabled klasörüne bağlayalım.

 

ln -s ../sites-available/aykutkaskaya.xyz.conf .

ln -s ../sites-available/api.aykutkaskaya.xyz.conf .

ln -s ../sites-available/admin.aykutkaskaya.xyz.conf .

 

Artık nginx default sayfasını silmeye hazırız. Bunun için /etc/nginx/sites-available ve /etc/nginx/sites-enabled klasörü içerişinde bulunan default dosyalarını siliyoruz.

 

Ardından konfigürasyonda bir hata olup olmadığını kontrol ediyoruz.

 

nginx -t

 

Eğer “Syntax OK” sonucunu alırsak artık nginx servisini tekrar başlatabiliriz.

 

systemctl restart nginx

Yorumlar

Henüz hiç yorum yok.

Yorum Yap