Manfaatkan Docker dan Docker Compose untuk menerapkan dan menjalankan aplikasi Nest.js Anda dengan lancar.

"Tapi itu berfungsi di komputer saya..." lelucon pengembang dengan sempurna menyoroti tantangan penerapan dan menjalankan aplikasi di sistem yang berbeda.

Kerumitan sebenarnya terletak pada konfigurasi dependensi yang diperlukan dan memastikan versi perangkat lunak kompatibel dengan aplikasi Anda. Solusi terbaik untuk masalah ini melibatkan penggunaan teknologi containerisasi seperti Docker.

Hal ini memungkinkan Anda untuk dengan mudah menyebarkan dan menjalankan aplikasi—dengan semua dependensi yang diperlukan—dalam image container; menghilangkan kebutuhan konfigurasi ekstensif dalam sistem produksi.

Memahami Docker dan Docker Compose

Buruh pelabuhan adalah platform pengembangan sumber terbuka yang menyediakan teknologi containerisasi yang digunakan dalam membangun dan mengemas aplikasi beserta dependensinya sebagai image portabel.

Gambar-gambar ini kemudian dijalankan sebagai komponen yang dapat dieksekusi dalam lingkungan kontainer yang terisolasi. Menjalankan aplikasi dalam kontainer ini menjamin kinerja aplikasi yang konsisten di berbagai sistem produksi tanpa masalah kompatibilitas apa pun.

instagram viewer

Di samping itu, Docker Compose adalah sebuah alat yang digunakan bersama dengan Docker untuk menyederhanakan proses pendefinisian dan pengelolaan aplikasi multi-kontainer.

Meskipun Docker terutama digunakan untuk mengelola kontainer individual, Docker Compose memungkinkan Anda mengelola konfigurasi beberapa kontainer yang perlu dijalankan sebagai satu aplikasi.

Hal ini sangat berguna ketika aplikasi terdiri dari beberapa layanan yang perlu bekerja sama, seperti beberapa layanan API yang bergantung, dan database, antara lain.

Sebelum Anda menyelami kodenya, Anda perlu menginstal Desktop Docker di mesin lokal Anda. Pelajari persyaratan khusus sistem dan langkah-langkah instalasi dari dokumentasi resmi.

Anda dapat menemukan kode aplikasi ini di dalamnya GitHub gudang.

Siapkan Proyek Nest.js

Panduan ini akan memandu Anda melalui proses pembuatan dua container Docker yang berfungsi dengan lancar sebagai satu aplikasi Nest.js. Kontainer pertama akan menampung instance image Docker server web Nest.js, sedangkan kontainer kedua akan mengeksekusi image database PostgreSQL Docker.

Untuk memulai, instal alat baris perintah Nest.js:

npm i -g @nestjs/cli

Sekarang, buat proyek Nest.js baru dengan menjalankan perintah di bawah ini di terminal Anda.

nest new docker-nest-app

Selanjutnya, alat CLI akan menampilkan beberapa manajer paket yang dapat Anda pilih untuk membuat proyek. Pilih opsi pilihan Anda. Dalam hal ini, kami akan menggunakan npm, Manajer Paket Node.

Terakhir, Anda dapat menavigasi ke direktori proyek, dan menjalankan server pengembangan.

cd docker-nest-app
npm run start

Buat Modul Basis Data

Pertama, instal dependensi ini:

npm install pg typeorm @nestjs/typeorm @nestjs/config

Selanjutnya, di direktori root proyek Anda, buat a .env file, dan tambahkan nilai konfigurasi koneksi database berikut:

DATABASE_HOST="db"
DATABASE_PORT=5432
DATABASE_USER="testUser"
DATABASE_PASSWORD="mypassword123"

Terakhir, lanjutkan dan buat modul database.

nest g module database

Sekarang, setelah modul dibuat, buka database/database.module.ts file dan sertakan kode konfigurasi database berikut:

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 {}

Setelah Anda menyiapkan image Docker PostgreSQL menggunakan konfigurasi TypeORM ini, aplikasi Nest.js akan membuat koneksi ke database.

Perbarui File app.module.ts

Terakhir, perbarui file modul aplikasi utama untuk memasukkan konfigurasi modul database.

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 {}

Siapkan Dockerfile

Dockerfile menangkap serangkaian instruksi yang diperlukan oleh mesin Docker untuk membuat image Docker. Gambar ini mencakup kode sumber aplikasi dan semua dependensinya.

Di direktori root proyek Anda, buat file baru dan beri nama, Dockerfile. Kemudian, tambahkan konten berikut:

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" ]

Inilah yang diwakili oleh setiap perintah:

  1. DARI: Instruksi ini menentukan image dasar yang harus digunakan Docker untuk membangun image aplikasi.
  2. KERJADIR: Perintah ini menginstruksikan Docker untuk mengatur /app direktori sebagai direktori kerja untuk aplikasi dalam wadah.
  3. MENYALINpaket*.json./: Menyalin semua file dengan format nama file tersebut dari direktori saat ini dalam aplikasi ke aplikasi map.
  4. JALANKAN instalasi npm: Perintah ini akan menginstal paket dan dependensi yang diperlukan oleh aplikasi dalam container Docker.
  5. MENYALIN. .: Menginstruksikan Docker untuk menyalin semua file kode sumber aplikasi dari direktori saat ini ke dalam /app map.
  6. JALANKAN npm jalankan build: Perintah ini membangun aplikasi Nest.js sebelum membuat image Docker. Ini mengkompilasi kode TypeScript ke dalam JavaScript dan menyimpan output proses pembangunan di a dist direktori.
  7. CMD: Mendefinisikan perintah untuk dijalankan ketika kontainer dimulai. Dalam hal ini, kami akan menjalankan npm jalankan mulai: dev perintah, yang akan memulai server dalam mode pengembangan.

Konfigurasi ini memungkinkan aplikasi untuk secara aktif memantau perubahan kode. Setelah perubahan terdeteksi, kontainer akan secara otomatis menjalani pembangunan kembali.

Buat File Tulis Docker

Di direktori root folder proyek Anda, buat yang baru buruh pelabuhan-compose.yml file, dan tambahkan konten berikut:

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 akan menggunakan instruksi ini untuk membuat dan menjalankan dua image dalam dua container Docker. Wadah pertama, server, akan menampung gambar aplikasi; berjalan pada port 3000.

Kontainer kedua akan menampung image database PostgreSQL. Anda tidak perlu menentukan Dockerfile untuk image ini—Docker akan menggunakan image PostgreSQL yang sudah ada di registri image Docker untuk membuatnya.

Mulai Kontainer Docker

Terakhir, lanjutkan untuk membuat image dan memulai container dengan menjalankan perintah berikut:

docker compose up

Setelah proses berhasil diselesaikan, Anda akan melihat informasi log serupa di terminal Anda.

Sekarang, setelah server web dan container database Anda aktif dan berjalan, lanjutkan dan tambahkan lebih banyak fungsi ke aplikasi Nest.js Anda. Misalnya, Anda bisa membangun API REST CRUD Nest.js.

Mendorong Gambar Docker ke Docker Hub

Mendorong image Docker ke Docker Hub hampir mirip dengan mendorong proyek ke GitHub. Ikuti langkah-langkah berikut untuk mendorong image Docker aplikasi Nest.js ke Docker Hub.

  1. Pergilah ke Pusat Docker, daftar, dan masuk ke halaman ikhtisar akun Anda.
  2. Klik Buat repositori tombol, isi nama repositori Anda, tentukan visibilitasnya dengan memilih salah satu Publik atau Pribadi, lalu klik Membuat.
  3. Sekarang, Anda perlu masuk ke akun Anda melalui terminal dengan menjalankan perintah di bawah ini, lalu masukkan nama pengguna dan kata sandi Docker Anda.
    docker login
  4. Selanjutnya, perbarui nama image Docker agar sesuai dengan format ini: / dengan menjalankan perintah di bawah ini.
    docker tag /
  5. Terakhir, dorong image Docker.
    docker push /

Memanfaatkan Teknologi Kontainerisasi Docker dalam Pengembangan

Teknologi kontainerisasi Docker memungkinkan Anda menggabungkan aplikasi beserta semua dependensinya ke dalam image Docker. Gambar-gambar ini kemudian dapat berjalan dengan lancar di dalam container di lingkungan pengembangan dan produksi yang berbeda tanpa masalah apa pun.