Docker: Node.js Uygulamalarını Dockerize Etmek

Merhaba sevgili okur,
Node.js’de yazılmış bir uygulama için nasıl docker image’ı oluşturabileceğinizi anlatmaya çalışacağım. Bir önce ki yazım da Docker: Dockerfile ile Image Oluşturmak’ı paylaşmıştım. Keyifli okumalar.

Docker: Dockerfile ile Image Oluşturmak
Merhaba sevgili okur,Docker image’ları oluşturmak için Dockerfile yönergelerini nasılkullanabileceğinizi anlatmaya çalıştım. Dockerfile için giriş veya gelişmeyazısı olarak düşünebilirsiniz. Bir önce ki yazım da Docker’ı yönetmek içinkullanabileceğiniz (docker cli) temel komut listesini[/docker…

Temel amacımız bir Node.js uygulamasını dockerize etmek olduğu için uygulamanın seviyesinin bizim senaryomuz için yeterli olduğu kanaatindeyim. “package.json” dosyası oluşturduktan sonra ihtiyacımız olan paketleri yüklüyoruz.

npm init -y
npm install
{ "name": "app", "version": "1.0.0", "description": "", "main": "server.js", "scripts": { "start": "node server.js" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "express": "^4.17.1" } }

“server.js” dosyasını oluşturup hayatımıza devam ediyoruz.

const express = require("express"); const PORT = 2323; const HOST = "0.0.0.0"; const app = express(); app.get("/", (req, res) => { res.send("Hello World"); }); app.listen(PORT, HOST); console.log(`Running on http://${HOST}:${PORT}`);

Sonuç olarak; ekrana “Hello World” yazan bir servisimiz mevcut. :)

Uygulamayı çalıştıralım

npm run start

Dockerfile

Uygulamamızın ana dizinine Dockerfile dosyasını ekleyelim. Dockerhub üzerinden bulunan resmi Node.js image’nı kullanacağız.

Not: Node.js kullanılabilecek farklı sistem ve versiyonlara ait image’lar bulunuyor. Uygulamanızın ihtiyaç duyduğu versiyon ve sisteme ait etikete sahip image’ı temel (base) image olarak tanımayabilirsiniz.

# Dockerfile
FROM node:15

Not: Bir temel (base) image kullanırken versiyon numarası vermeye özen gösterin. Aksi durumda “node” image’ının “latest” versiyonu çekecektir. Uygulamanızın eski versiyona bağımlılığı var ise bazı problemlere sebebiyet verebilir ve uygulamanız düzgün çalışmayabilir.

Konteyner’da ki çalışma dizinini “/app” olarak ayarlayalım. İsimlendirme tamamen sizin insiyatifinize kalmış. Bu dizini uygulama dosyaları ile işlemleri gerçekleştirmek için kullanacağız.

# Dockerfile
FROM node:15
WORKDIR /app

Uygulama dosyalarını “/app” dizinine kopyalayalım.

# Dockerfile
FROM node:15
WORKDIR /app
COPY /src .

Not: Geliştirme (development) ortamında kopyalama işlemi yapacağımız için, uygulama dizini içerisinde çalışma zamanından kalan dosyalar, geliştirme (development) ortamına ait ayar dosyaları veya code editörüne ait istenmeyen dosyalar olabilir. Bunlara benzer istenmeyen veya ihtiyaç olmayan dosyaları konteyner içine kopyalamak istemeyebilirsiniz. Problemi çözmek adına uygulamamızın ana dizinine “.dockerignore” dosyasını ekleyelim ve konteyner’a aktarmak istemediğimiz dosyaları belirleyelim.

# .dockerignore
*/node_modules
npm-debug.log
.idea
.vscode

Not: Uygulama dosyalarını kopyalama işlemi ADD talimatı kullanılarak bir source-code repository üzerinden çekilebilir.

Uygulama dosyalarımız konteyner içinde olduğuna göre artık bağımlılıkları yükleyebiliriz. “package.json” dosyasında tanımlanmış olan paketleri yüklemeye başlayalım.

# Dockerfile
FROM node:15
WORKDIR /app
COPY /src .
RUN yarn install

Not: Uygulamanızın ihtiyaç duyduğu değişiklik, yükleme vb işlemleri ekleyebilirsiniz.

Hissediyorum sona yaklaştık. Konteyner başlatılırken çalışacak olan komutları ekliyoruz.

# Dockerfile
FROM node:15
WORKDIR /app
COPY /src .
RUN yarn install
CMD yarn run start

Not: Bir “sh” benzeri kurulum veya çalıştırma dosyası oluşturup onu da başlangıç komutu olarak tanımlayabilirsiniz.

Son olarak; uygulamamız bir web application olduğu için hangi port (2323) üzerinden yayın yapacağımızıda belirtmemiz gerekiyor. Aksi takdir de uygulamaya konteyner’ın dışından kimse erişmez.

# Dockerfile
FROM node:15
WORKDIR /app
COPY /src .
RUN yarn install
CMD yarn run start
EXPOSE 2323

Dockerize Edelim

Dockerfile’mız hazır olduğuna göre artık dockerize etme kısmına geçebiliriz. “docker build” komutunu çalıştırarak image oluşturmakla başlayalım.

docker build -t anilatalay/my_node_app:1.0.1 .

Artık uygulamamızın bir image’ı mevcut, bu image’ı kullanarak bir konteyner oluştuyoruz.

docker run --rm -p 80:2323 anilatalay/my_node_app:1.0.1

Uygulama konteyner içinde “2323" portunu kullanırken dışarıya “80” portu üzerinden yayınlanıyor.

Uygulama Image’nı Paylaşalım

Docker cli üzerinden dockerhub’a giriş yapıyoruz.

docker login

Dockerhub’a image’mızı gönderiyoruz.

docker push anilatalay/my_node_app

Hayırlı olsun. Dockerhub üzerinde nur topu gibi image’mız var. (hub.docker.com) Artık isteyen herkes image’mızı çekebilir :)

Öğrenilecek çok şey, gezilecek çok yer var. Her bir yazım da gerçek dünyaya bir adım daha yaklaşacağız. Bir sonraki postumda görüşmek üzere.