Nest.js uygulamalarınızı sorunsuz bir şekilde dağıtmak ve çalıştırmak için Docker ve Docker Compose'dan yararlanın.
"Ama bilgisayarımda çalışıyor..." geliştirici şakası, uygulamaları farklı sistemlere dağıtmanın ve çalıştırmanın zorluğunu mükemmel bir şekilde vurguluyor.
Asıl zorluk, gerekli bağımlılıkların yapılandırılmasında ve yazılım sürümlerinin uygulamanızla uyumlu olmasını sağlamakta yatmaktadır. Bu soruna harika bir geçici çözüm, Docker gibi konteynerizasyon teknolojisinin kullanılmasını içerir.
Container görüntüsünde uygulamaları gerekli tüm bağımlılıklarla zahmetsizce dağıtmanıza ve çalıştırmanıza olanak tanır; üretim sistemlerinde kapsamlı konfigürasyon ihtiyacını ortadan kaldırır.
Docker ve Docker Compose'u Anlamak
Liman işçisi Bina ve paketleme uygulamalarında kullanılan konteynerizasyon teknolojisinin yanı sıra bağımlılıklarını da taşınabilir görüntüler olarak sağlayan açık kaynaklı bir geliştirme platformudur.
Bu görüntüler daha sonra yalıtılmış konteyner ortamlarında yürütülebilir bileşenler olarak çalıştırılır. Uygulamaların bu kapsayıcılar içinde çalıştırılması, herhangi bir uyumluluk sorunu olmaksızın farklı üretim sistemlerinde tutarlı uygulama performansını garanti eder.
Diğer taraftan, Docker Compose bir araçtır Çok kapsayıcılı uygulamaları tanımlama ve yönetme sürecini basitleştirmek için Docker ile birlikte kullanılır.
Docker öncelikle bireysel konteynerleri yönetmek için kullanılsa da Docker Compose, tek bir uygulama olarak çalışması gereken birden fazla konteynerin yapılandırmasını yönetmenize olanak tanır.
Bu, özellikle bir uygulama, diğerlerinin yanı sıra çeşitli bağımlı API hizmetleri ve veritabanları gibi birlikte çalışması gereken birden fazla hizmetten oluştuğunda kullanışlıdır.
Koda dalmadan önce yüklemeniz gerekir. Docker Masaüstü yerel makinenizde. Resmi belgelerdeki sisteme özel gereksinimleri ve kurulum adımlarını inceleyin.
Bu uygulamanın kodunu kendi içinde bulabilirsiniz. GitHub depo.
Nest.js Projesi Oluşturma
Bu kılavuz, tek bir Nest.js uygulaması olarak sorunsuz bir şekilde çalışan iki Docker konteynerini çalıştırma sürecinde size yol gösterecektir. İlk kapsayıcı, Nest.js web sunucusu Docker görüntüsünün bir örneğini tutacak, ikinci kapsayıcı ise Docker'ın PostgreSQL veritabanı görüntüsünü çalıştıracaktır.
Başlamak için Nest.js komut satırı aracını yükleyin:
npm i -g @nestjs/cli
Şimdi aşağıdaki komutu terminalinizde çalıştırarak yeni bir Nest.js projesi oluşturun.
nest new docker-nest-app
Daha sonra CLI aracı, projeyi oluşturmak için aralarından seçim yapabileceğiniz çeşitli paket yöneticileri görüntüleyecektir. Tercih ettiğiniz seçeneği seçin. Bu durumda kullanacağız npm, Düğüm Paketi Yöneticisi.
Son olarak proje dizinine gidebilir ve geliştirme sunucusunu çalıştırabilirsiniz.
cd docker-nest-app
npm run start
Veritabanı Modülünü Oluşturun
İlk önce şu bağımlılıkları yükleyin:
npm install pg typeorm @nestjs/typeorm @nestjs/config
Daha sonra projenizin kök dizininde bir .env dosyasını açın ve aşağıdaki veritabanı bağlantısı yapılandırma değerlerini ekleyin:
DATABASE_HOST="db"
DATABASE_PORT=5432
DATABASE_USER="testUser"
DATABASE_PASSWORD="mypassword123"
Son olarak devam edin ve veritabanı modülünü oluşturun.
nest g module database
Şimdi modül oluşturulduktan sonra açın. veritabanı/database.module.ts dosyanızı oluşturun ve aşağıdaki veritabanı yapılandırma kodunu ekleyin:
import { Module } from'@nestjs/common';
import { TypeOrmModule } from'@nestjs/typeorm';
import { ConfigModule, ConfigService } from'@nestjs/config';@Module({
imports: [
ConfigModule.forRoot(),
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => ({
type: 'postgres',
host: configService.get<string>('DATABASE_HOST'),
port: configService.get<number>('DATABASE_PORT'),
username: configService.get<string>('DATABASE_USER'),
password: configService.get<string>('DATABASE_PASSWORD'),
synchronize: true,
}),
inject: [ConfigService],
}),
],
})
exportclass DatabaseModule {}
Bu TypeORM yapılandırmasını kullanarak Docker PostgreSQL görüntüsünü ayarladığınızda Nest.js uygulaması veritabanına bağlantı kuracaktır.
app.module.ts Dosyasını Güncelleyin
Son olarak, veritabanı modülünün yapılandırmasını dahil etmek için ana uygulama modülü dosyasını güncelleyin.
import { Module } from'@nestjs/common';
import { ConfigModule } from'@nestjs/config';
import { AppController } from'./app.controller';
import { AppService } from'./app.service';
import { DatabaseModule } from'./database/database.module';@Module({
imports: [
ConfigModule.forRoot({
envFilePath: '.env',
}),
DatabaseModule,
],
controllers: [AppController],
providers: [AppService],
})
exportclass AppModule {}
Docker dosyası kurma
Bir Docker dosyası, Docker motorunun bir Docker görüntüsü oluşturmak için ihtiyaç duyduğu gerekli talimat kümesini yakalar. Bu görüntü, uygulamanın kaynak kodunu ve tüm bağımlılıklarını kapsar.
Projenizin kök dizininde yeni bir dosya oluşturun ve onu Dockerfile olarak adlandırın. Ardından aşağıdaki içerikleri ekleyin:
FROM node:16.3.0-alpine3.13
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY. .
RUN npm run build
CMD [ "npm", "run", "start: dev" ]
İşte her komutun temsil ettiği şey:
- İTİBAREN: Bu talimat, Docker'ın uygulamanın imajını oluşturmak için kullanması gereken temel imajı belirtir.
- İŞ YÖNÜ: Bu komut Docker'a /app kapsayıcı içindeki uygulamanın çalışma dizini olarak dizin.
- KOPYALApaket*.json./: Uygulamadaki geçerli dizinden söz konusu dosya adı biçimine sahip tüm dosyaları kopyalar. uygulama dosya.
- Npm kurulumunu ÇALIŞTIRIN: Bu komut, uygulamanın gerektirdiği gerekli paketleri ve bağımlılıkları Docker konteynerine yükleyecektir.
- KOPYALA. .: Docker'a uygulamanın tüm kaynak kodu dosyalarını geçerli dizinden kopyalaması talimatını verir. /app dosya.
- RUN npm çalıştırma derlemesi: Komut, Docker görüntüsünü oluşturmadan önce Nest.js uygulamasını oluşturur. TypeScript kodunu JavaScript'te derler ve derleme işlemi çıktısını bir uzaklık dizin.
- CMD: Konteyner başlatıldığında çalıştırılacak komutu tanımlar. Bu durumda, çalıştıracağız npm çalıştırma başlangıcı: dev Sunucuyu geliştirme modunda başlatacak komut.
Bu yapılandırma, uygulamanın kod değişikliklerini aktif olarak izlemesini sağlar. Değişiklikler algılandıktan sonra kapsayıcı otomatik olarak yeniden oluşturulacaktır.
Docker Oluşturma Dosyasını Oluşturun
Proje klasörünüzün kök dizininde yeni bir docker-compose.yml dosyasını açın ve aşağıdaki içeriği ekleyin:
version:'3.9'
services:
server:
build:.
ports:
-'3000:3000'
depends_on:
-db
db:
image:'postgres'
ports:
-'5432:5432'
environment:
POSTGRES_PASSWORD:'mypassword123'
POSTGRES_USER:'testUser'
volumes:
-data:/var/lib/postgresql/data
volumes:
data:
Docker Compose, iki görüntüyü iki Docker kapsayıcısında oluşturmak ve çalıştırmak için bu talimatları kullanacaktır. İlk kapsayıcı olan sunucu, uygulamanın görüntüsünü barındıracaktır; 3000 numaralı bağlantı noktasında çalışıyor.
İkinci konteyner PostgreSQL veritabanı imajını barındıracaktır. Bu görüntü için bir Docker dosyası belirtmenize gerek yoktur; Docker, onu oluşturmak için Docker'ın görüntü kaydındaki önceden var olan PostgreSQL görüntüsünü kullanacaktır.
Docker Container'larını başlatın
Son olarak, aşağıdaki komutu çalıştırarak görüntüleri oluşturmaya devam edin ve kapları başlatın:
docker compose up
İşlem başarıyla tamamlandıktan sonra benzer log bilgilerini terminalinizde görmelisiniz.
Artık hem web sunucunuz hem de veritabanı kapsayıcılarınız çalışır durumdayken, devam edin ve Nest.js uygulamanıza daha fazla işlevsellik ekleyin. Örneğin şunları yapabilirsiniz: Nest.js CRUD REST API'si oluşturun.
Docker Görüntülerini Docker Hub'a Aktarma
Docker görüntülerini Docker Hub'a göndermek, projeleri GitHub'a aktarmaya neredeyse benzer. Nest.js uygulaması Docker görüntüsünü Docker Hub'a göndermek için bu adımları izleyin.
- Başını aşmak Docker Merkezi, kaydolun ve hesabınızın genel bakış sayfasında oturum açın.
- Tıkla Depo oluştur düğmesine basın, deponuzun adını girin, ikisinden birini seçerek görünürlüğünü belirtin Halk veya Özelve ardından tıklayın Yaratmak.
- Şimdi aşağıdaki komutu çalıştırarak terminal aracılığıyla hesabınıza giriş yapmanız ve ardından Docker kullanıcı adınızı ve şifrenizi girmeniz gerekiyor.
docker login
- Ardından Docker'ın görüntü adını bu formatla eşleşecek şekilde güncelleyin:
/ aşağıdaki komutu çalıştırarak.docker tag
/ - Son olarak Docker imajını itin.
docker push
/
Docker'ın Konteynerizasyon Teknolojisini Geliştirmede Kullanmak
Docker'ın kapsayıcılaştırma teknolojisi, bir uygulamayı tüm bağımlılıklarıyla birlikte Docker görüntüleri halinde paketlemenize olanak tanır. Bu görüntüler daha sonra farklı geliştirme ve üretim ortamlarındaki kapsayıcılarda herhangi bir sorun olmadan sorunsuz bir şekilde çalıştırılabilir.