Şimdi nodejs ile bir express uygulaması oluşturup bunu da farklı bir porta yönlendireceğiz.

Bunun için nodejs’i host makinama kuruyorum. Containerlarımı stop komutuyla durdurdum.

Şimdi express uygulamamı kuruyorum. Express ve mongoose modüllerini kuracağım.

Daha sonra bir index.js oluşturalım:

Port 80’den çalıştı ve Hi There yazısını gördük. Şimdi Dockerfile’ı yazacağız.

nodejs imajını kullanacağız. Bu imaj uygulamamız için gerekli her şeyi barındırmıyor tabi ki. Docker ile bir imaj oluşturmanın arkasındaki ana fikir uygulamanın çalışması için gerekli olan bağımlılıkları barındırması. Bizim uygulamamız için bu kaynak kodu ve Express ve diğer bağımlılıklar olacak. Bunun için kendi imajımızı oluşturmamız gerekiyor. Bu custom imajı node imajı ile yapacağız.

Öncelikle bir dockerfile’a ihtiyacımız var. Dockerfile adında bir dosya oluşturuyoruz. İçerisinde Docker’ın bizim imajımızı oluşturması için gerekli komutları barındıracak.

İlk olarak base imajı belirtmemiz lazım. Node imajı bizim base imajımız olacak

Docker her bir satırı imajda bir katman olarak alır. Docker her bir basamağı cash’ler. İlk build uzun sürer ama ikincisi çok kısadır çünkü sonuncuyu size verir. Bunun önemi development sürecinde source code dışında değişiklik çok olmadığından  o adıma inmek gerekmez. Burada bir adımı bu yüzden iki defa yazarak optimizasyon sağlıyoruz.

CMD kısmı ise yalnızca runtime’da çalışacak. Container’ı çalıştırdığımızda çalışacak. Şimdi imajımızı build edelim.

Şimdi docker image ls dediğimizde imajı görüyoruz.

Artık imajımızı çalıştırabilriz.

İlki işletim sisteminin ikincisi container’in portudur. 4000:80’dersem 4000 dışardan içerinin container’ın 80 ine gelir.

Hi There yazısını gördük. Artık imajdan derlediğimiz container çalışıyor.

Aşağıdaki komut ile  container’ımızın dosyalarını görebiliyoruz.

exit diyerek çıkabiliriz.

Burada Dockerfile’ın bulunmana ihtiyacımız yok bunu ignore ettirebiliriz. COPY . ./ herşeyi kopyaladı. Sırlarımızı içeren Environment file ımız olabilir. Node modules ı da istemeyiz çünkü zaten package.json u kopyalayıp ardından npm install yapıyoruz. Git configürasyonu olabilir onu da istemeyiz.

Şimdi containerı silelim.

Docker ignore dosyası oluşturalım. İsmi .dockerignore olacak.

Ardından buildi tekrar yapıp çalıştırıyoruz.

Volumes Özelliği

Burada eksik olan bir nokta kodu değiştirdiğimizde doğal olarak güncellenmiyor. Bunun için her defasında build yapıp derlemek çalışma ortamımız açısından pek elverişli olmaz. Bunun için volumes adı verilen bir özelliği kullanacağız. Docker içerisinde bindmount adında bir volume var. Böylece işletim sistemi ile docker containerı içerisinde senkronize bir klasör elde edilebilior. Bunu wordpress için daha önce yapmıştık.

Buildi tekrar yapıp çalıştıralım.

Dosyamız aslında güncellense de uygulamaya yansımadı. Bunun sebebi node process’in tekrar başlamaması bunun için nodeman kullanacağız.

ile işletim sistemimize kuralım böylece klasör içerisindeki package.json dependency’e otomatik ekleyecektir. Bu arada script kısmını düzenleyelim. Test kısmını silip aşağıdaki sayırları ekliyoruz. Package json’u aşağıdaki gibi güncelledik. ( Windows sorun çıkarsa nodemondan sonra için –L gerekebilir. )

Dockerfile’da da aşağıdaki kısmı da,

Altındaki gibi değiştiriyoruz.

Sonrasında çalıştırdığımızda güncellendiğini görüyoruz.