giriiş
Node.js, son yıllarda sunucu taraflı uygulamalar geliştirmek için popüler hale gelen bir JavaScript çalışma ortamıdır.
Bu eğitimde, Node.js uygulamasının Docker, Docker Hub ve Docker Compose aracılığıyla bir bulut sunucusuna nasıl dağıtılacağı gösterilmektedir.
Ön koşullar
- Bu eğitim, yerel sisteminizde Docker'ın yüklü olduğunu varsayar. Eğer yüklü değilse, resmi belgelerde nasıl kurulacağına dair talimatları bulabilirsiniz.
- Ayrıca, tercihen Ubuntu 24.04 olmak üzere bir Linux dağıtımı çalıştıran bir bulut sunucusuna da ihtiyacınız olacak. Başka bir dağıtım kullanıyorsanız, sunucuya Docker kurulumu yaparken belirli talimatları izlemeniz gerekebilir.
- Bazı adımlarda ayrıca uygulamaya ait Docker imajını yüklemek için bir Docker Hub hesabına (ücretsiz) ihtiyaç duyulur.
- Daha önce Docker deneyiminiz yoksa sorun değil, bu eğitim oldukça temel nitelikte ve yaptığımız işin arkasındaki temel kavramları açıklıyor.
- Dağıtabileceğiniz bir Node.js uygulamasına ihtiyacınız var.
Docker Hakkında
Docker'ı yeni kullanmaya başladıysanız, aynı sayfada olduğumuzdan emin olmak için incelemeniz gereken bazı terimler şunlardır.
- Görüntüler: Docker'da görüntüler, bir dosya sisteminin "anlık görüntüleri" veya şablonlarıdır ve bir uygulamayı çalıştırmak için gereken her şeyi içerir.
- Konteynerler: Bunlar, uygulamanın gerçek çalışan örnekleridir. Bir şablonu (bir görseli) alıp, başlatılabilen ve durumu olan bir şeye dönüştürerek oluşturulurlar.
- Katmanlar, bir Docker görüntüsünü oluşturan öğelerdir. Her katman, başka bir katmanın üzerine inşa edilir ve bu da katman önbelleğe alma adı verilen bir özellik sağlamanıza olanak tanır. Bu, bir görüntüdeki yalnızca bir katman değiştiğinde, görüntüdeki tüm katmanları yeniden oluşturmanız veya yüklemeniz gerekmediği anlamına gelir.
- Kayıt defterleri, görüntüleri herkese veya erişim bilgilerine sahip olanlara sunmak için yüklediğiniz (gönderdiğiniz) bir yerdir. Bu eğitimde Docker Hub kullanacağız, ancak GCP, AWS, Azure, GitHub ve diğerleri tarafından sağlanan alternatifler de mevcuttur.
Adım 1 – Dockerfile Oluşturun
Node.js projenizin kök dizininde aşağıdaki içeriklere sahip Dockerfile adında bir dosya oluşturun:
FROM node:20.17
ENV NODE_ENV=production
WORKDIR /app
COPY package*.json .
RUN npm ci
COPY . .
EXPOSE 8080
CMD [ "node", "src/index.js" ]Dockerfile, Docker'ın bir görüntü oluşturmasını sağlayan talimatları yerleştirdiğiniz yerdir. Her talimat, görüntü dosya sisteminde bir değişiklik olan bir katmanın oluşturulmasını temsil eder.
Bu durumda, bazen temel görüntü olarak da adlandırılan bir şablondan başlayarak görüntümüzü oluşturuyoruz; bu durumda bu, node:20.17'dir. Bu, Docker şirketi tarafından sağlanan resmi bir görüntüdür ve hakkında daha fazla bilgiyi burada bulabilirsiniz.
Bir sonraki adım, NODE_ENV ortam değişkenini üretime ayarlar. Buradaki temel etki, aşağıdaki npm install komutunu çalıştırırken geliştirme paketlerinin kurulmasını önlemektir, ancak bu genellikle güvenebileceğiniz modüllerde daha iyi optimizasyonlara yol açabilir.
WORKDIR komutuyla, geçerli dizini /app dizinine taşıyoruz; bu dizin, daha sonra gelecek talimatların yürütüleceği dizin oluyor.
COPY*.json paket satırı, package.json ve package-lock.json dosyalarını Docker görüntü dosya sisteminin /app klasörüne kopyalar. Sondaki noktanın geçerli dizini belirtmek için gerekli olduğunu unutmayın.
Şimdi npm ci komutunu kullanarak üretim bağımlılıklarını kurmak için RUN yönergesini kullanıyoruz (ci, temiz kurulum anlamına gelir ve otomatik ortamlarda kullanılmak üzere tasarlanmıştır).
Bu noktada dikkat edilmesi gereken bir nokta, şimdiye kadar tüm proje dizini yerine yalnızca package*.json dosyalarını derlemeye kopyalıyor olmamızdır. Bu, Docker katman önbelleğinden yararlanmamızı sağlar; böylece bağımlı paketler değişmemiş olsa bile, katmanlar yeniden derlemeye gerek kalmadan kullanılabilir.
Aşağıdaki satır (COPY . .) görüntüdeki kalan dosyaları kopyalar.
İsteğe bağlı olarak, bir web uygulaması tarafından erişilebilmesi için konteynerden belirli bir ağ bağlantı noktasını açığa çıkarmak istediğimizi belirtebiliriz. EXPOSE yönergesinin aslında bağlantı noktasını açığa çıkarmadığını unutmayın: Belgelerde belirtildiği gibi, "görüntüyü oluşturan kişi ile konteyneri çalıştıran kişi arasında, yayınlanması amaçlanan bağlantı noktaları hakkında bir tür belge görevi görür". .
Son olarak, son yönerge, Docker'ın konteyner başlatıldığında uygulamayı çalıştırmak için kullanması gereken komutu belirtir. Bu durumda, uygulamanın giriş noktasının index.js dosyası olduğunu varsayıyoruz.
Dockerfile'ınızla birlikte .dockerignore adlı bir dosya oluşturmak da genellikle iyi bir fikirdir. Bu, COPY. komutunu çalıştırdığınızda bilgisayarınızdaki işe yaramaz dosyaların görüntüye kopyalanmamasını sağlar:
.git
Dockerfile
node_modulesBu durumda, oluşturduğumuz şablonda git veya node_modules gibi dizinlerin geliştirme sürümlerinin bulunmasını istemiyoruz.
Adım 2 – Görüntüyü oluşturun
Artık bir Dockerfile'ımız olduğuna göre, Docker'a bunu kullanarak bir imaj oluşturmasını söyleyebiliriz.
Bunu yapmak için gereken temel komut aşağıdaki gibidir ve ana proje klasöründe çalıştırılmalıdır:
docker build -t myproject .
"/bin/sh -c npm ci" hatasıyla başarılı bir şekilde tamamlanmazsa, Dockerfile'daki npm ci ifadesini npm install ile değiştirin ve tekrar deneyin.
-t seçeneği, görüntü adını belirtir (bu durumda projem). Satırın sonunda, Docker'a geçerli dizinde Dockerfile'ı aramasını söylemeniz gerekir.
Not: Yapıyı ilk kez çalıştırdığınızda biraz zaman alacaktır çünkü Docker'ın temel görüntünün tüm katmanlarını indirmesi gerekir (bu durumda Node.js 20.17).
Bu imajı çevrimiçi Docker Hub kayıt defterine yüklemeyi planladığımızdan (sunucumuzdan erişmek için), imaja belirli bir adlandırma kuralı kullanarak isim vermemiz gerekiyor.
Yani yukarıdaki komut şu şekilde görünecektir:
docker build -t username/myproject:latest .
Burada kullanıcı adı Docker Hub kullanıcı adınız, sonuncusu ise resim etiketidir. Bir resmin birden fazla etiketi olabilir, bu nedenle bazen buna benzer bir iş akışı görürsünüz:
docker build -t myproject .
docker tag myproject username/myproject:latest
docker tag myproject username/myproject:20240905Bu komutlar bir görüntü oluşturur ve daha sonra onu latest ve 20240904 (bu eğitimin en son güncellendiği tarih) etiketleriyle etiketler.
Docker Hub varsayılan olarak eski imajları silmez, bu nedenle kayıt defterine gönderdiğiniz tüm imajların geçmişini tutmanıza olanak tanır. En son etikete sahip imaj her zaman en son derlenen imajdır, eski imajlar ise tarihle etiketlenir.
Adım 3 – Görsele basın
Artık görüntümüz hazır olduğuna göre, onu kayıt defterine göndermemiz gerekiyor. Öncelikle, Docker örneğinizin Docker Hub ile kimlik doğrulamasından emin olmak için aşağıdaki komutu çalıştırın:
docker login
Daha sonra docker push komutunu çalıştırarak tüm etiketleriyle birlikte görüntüyü yükleyin.
docker push username/myproject
Uygulamanız küçükse, bu komut yalnızca Node.js uygulamasına ve onun JavaScript bağımlılıklarına ilişkin katmanları yüklemesi gerektiğinden hızlı bir şekilde tamamlanacaktır.
Görüntünün yeni bir sürümüne sahip olduğunuzda, Docker Hub'a yüklendiğinden emin olmak için push komutunu tekrar çalıştırmanız gerekir.
Adım 4 – Ubuntu 24.04'e Docker Kurulumu
Şimdi sunucuya Docker ve Docker Compose kurulumuna geçebiliriz. Önkoşullarda belirtildiği gibi, burada varsayılan olarak kurulu bir Ubuntu 24.04 sunucunuz olduğu varsayılmaktadır.
Öncelikle Docker'ı kurmak için bazı sistem bağımlılıkları gerekiyor ve bunları aşağıdaki komutlarla kurmak mümkün:
sudo apt-get update
sudo apt-get install ca-certificates curlŞimdi resmi Docker GPG anahtarını ekleyin ve özel bir apt deposu yapılandırın:
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullSon olarak apt dizinini tekrar güncelleyin ve Docker Community Edition'ı yükleyin:
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginYukarıdaki komut aynı zamanda konteynerlerin ve yaşam döngülerinin yönetimini büyük ölçüde basitleştiren bir araç olan Docker Compose'u da yükler.
Son faydalı adım, mevcut Ubuntu kullanıcısını docker grubuna eklemektir, böylece Docker komutlarını doğrudan ondan çalıştırabiliriz.
Aşağıdaki komutla bu kolayca yapılabilir:
sudo gpasswd -a myuser docker
Aşağıdaki komutları çalıştırarak her şeyin yolunda gittiğinden emin olun:
docker --version
docker ps
docker compose versionHerhangi bir hata veya uyarı görmüyorsanız, işlem tamamdır.
Adım 5 – Konteyneri Docker Compose ile çalıştırın
Sunucunuzda aşağıdaki içeriğe sahip docker-compose.yml adlı bir dosya oluşturun:
services:
myproject:
container_name: 'myproject'
image: 'username/myproject'
restart: unless-stoppedBu, Docker Hub'daki myproject kullanıcı adı/görüntüsünü temel alarak myproject adlı tek bir kapsayıcıyı yapılandıran çok temel bir Docker Compose dosyasıdır. Bir etiket belirtmezseniz, varsayılan olarak sonuncusu kullanılır, ancak isterseniz belirli bir etiket de ayarlayabilirsiniz:
services:
myproject:
container_name: 'myproject'
image: 'username/myproject:20240904'
restart: unless-stoppedSon olarak, yeniden başlatma niteliği, manuel olarak durdurulmadığı sürece konteynerin başarısızlık durumunda otomatik olarak yeniden başlatılması gerektiğini belirtir.
Bu Compose komutunu şimdi çalıştırırsanız, Docker görüntüsü kayıttan düşecek ve uygulamanızın çalışmasını umuyoruz:
docker compose -f docker-compose.yml up
Bu komut bir kapsayıcı oluşturur ve çalıştırır. Kapsayıcının çıktısı Docker tarafından yakalanır ve konsolda size sunulur. CTRL + C (veya CMD + C) tuşlarına basın ve kapsayıcının durması için birkaç saniye bekleyin.
Her şey yolunda gittiyse, konteyneri hayalet olarak çalıştırmaya hazırsınız. Böylece, durdurulana kadar arka planda çalışmaya devam eder. Bu, komuta -d seçeneği eklenerek yapılabilir:
docker compose -f docker-compose.yml up -dGüm, düğüm! (Ciddiyim)
Sunucu ile kapsayıcı arasında ağ bağlantı noktalarını eşleme gibi faydalı özellikler bulabileceğiniz Compose dosyası referans belgelerine göz atmayı unutmayın. İşte harici bağlantı noktası 80'i dahili bağlantı noktası 8080'e eşleyen hızlı bir örnek:
services:
myproject:
container_name: 'myproject'
image: 'username/myproject'
restart: unless-stopped
ports:
- '80:8080'Adım 6 – Yeni bir sürüm yükleyin
Uygulamanızda bir değişikliği yayınlamanız gerektiğini varsayalım. Otomatik derlemeleri etkinleştirmediyseniz, Docker Hub'da yeni bir görüntü görünene kadar 2. ve 3. adımları tekrarlamanız gerekecektir.
Daha sonra sunucunuzda yeni görüntüyü şu şekilde manuel olarak çekmeniz gerekir:
docker compose -f docker-compose.yml pull
Ve konteyneri yeni görüntüyle yeniden başlatın:
docker compose -f docker-compose.yml up -d --force-recreate
Sonuç
Harika, başardınız! Bu, Docker, Docker Hub ve Docker Compose kullanarak Ubuntu 24.04'te bir Node.js uygulamasını dağıtmaya yönelik temel bir giriş niteliğindeydi.
Basit bir Dockerfile'ın nasıl yazılacağını, imajının nasıl oluşturulacağını, nasıl gönderileceğini ve sunucuya nasıl dağıtılacağını gördük.
Docker'da bu eğitimde anlatılanlardan çok daha fazlası var, bu yüzden kavramlar ve özellikler hakkında daha fazla bilgi edinmek için Docker ve Docker Compose belgelerine göz atmayı unutmayın.









