Cara Dockerisasi Aplikasi Web Node.js

Docker adalah platform containerization yang menyederhanakan pengemasan dan eksekusi aplikasi. Kontainer berjalan sebagai proses yang terisolasi dalam sistem file mereka sendiri tetapi berbagi kernel host mereka. Docker telah mendapatkan popularitas sebagai cara menerapkan lingkungan pengembangan yang dapat direproduksi dan arsitektur penyebaran terdistribusi.

Node.js adalah runtime JavaScript terkemuka untuk pengembangan backend. Berhasil meluncurkan layanan web Node.js mengharuskan Anda memiliki lingkungan dengan runtime yang diinstal, kode aplikasi Anda tersedia, dan mekanisme yang menangani restart otomatis jika terjadi crash.

Dalam panduan ini, kami akan menggunakan Docker untuk menerapkan aplikasi Node.js sederhana yang dibuat menggunakan kerangka kerja web Express yang populer. Docker adalah cara yang bagus untuk menerapkan sistem berbasis Node karena ia menciptakan lingkungan yang konsisten yang mencakup semua yang Anda butuhkan untuk menjalankan layanan Anda. Daemon Docker memiliki dukungan terintegrasi untuk memulai ulang container yang gagal saat proses latar depan mogok, memecahkan salah satu tantangan penerapan Node.js.

Membuat Proyek Node Anda

Kami akan melewatkan detail implementasi aplikasi Anda. Buat direktori untuk proyek Anda dan tambahkan beberapa kode server di dalamnya. Inilah yang dasar app.js yang mendengarkan pada port 8080 dan merespons setiap permintaan dengan respons hardcode:

const express = require("express");
 
const app = express();
app.get("*", (req, res) => res.send("<p>It works!</p>"));
app.listen(8080, () => console.log("Listening on 8080"));

Tambahkan Express ke proyek Anda menggunakan npm:

npm init
npm install --save express

Mulai aplikasi Anda untuk mengujinya berfungsi:

node app.js

gambar aplikasi contoh Node.js yang sedang berjalan

Anda harus dapat mengunjungi localhost:8080 di browser Anda untuk melihat contoh respons.

gambar aplikasi contoh Node.js yang sedang berjalan

Menulis file Docker

Sekarang saatnya untuk memulai Dockerizing proyek Anda. Pertama, Anda memerlukan gambar untuk aplikasi Anda. Gambar menyertakan kode dan dependensi Anda sebagai paket yang Anda gunakan untuk memulai instance container. Instruksi di Dockerfile Anda menentukan status sistem file awal wadah Anda.

Ini adalah Dockerfile yang berfungsi untuk aplikasi sampel:

FROM node:16
WORKDIR /app

COPY package.json .
COPY package-lock.json .
RUN npm ci

COPY app.js .
CMD ["app.js"]

Dockerfile ini memilih image resmi Node.js Docker sebagai dasarnya dengan FROM penyataan. Gambar mewarisi semua yang ada di pangkalan, lalu menambahkan konten tambahan melalui instruksi berikut.

Direktori kerja diatur ke /app melalui WORKDIR garis. Pengikut COPY pernyataan akan menyimpan file ke /app direktori di dalam gambar kontainer.

Menginstal Dependensi

Tahap selanjutnya adalah menambahkan npm’s package.json dan lari npm ci. Ini akan menginstal dependensi npm proyek Anda – Express dalam kasus ini – di dalam sistem file container.

Jangan gunakan COPY node_modules/ . untuk menyalin yang ada node_modules folder di direktori proyek Anda – ini akan mencegah Anda menggunakan kembali Dockerfile di lingkungan build lainnya. Dockerfiles seharusnya memungkinkan Anda membuat build yang konsisten hanya dengan menggunakan konten repositori kontrol sumber Anda. Jika file atau folder ada di .gitignoreitu tidak boleh direferensikan dalam Dockerfile COPY pengajaran.

Menyalin Kode Aplikasi

Kemudian npm ci dijalankan, kode aplikasi Anda disalin ke gambar. Penempatannya COPY mengajar setelah RUN, pemisahannya dari salinan sebelumnya, adalah disengaja. Setiap instruksi membuat layer baru di gambar Anda; Proses build Docker menyimpan cache setiap layer untuk mempercepat build berikutnya. Ketika konten dari suatu lapisan berubah, cache dari semua lapisan berikut akan menjadi tidak valid.

Inilah sebabnya mengapa kode aplikasi harus disalin setelahnya npm ci dieksekusi. Kode biasanya berubah lebih sering daripada konten npm lockfile Anda. Pembuatan ulang gambar yang hanya melibatkan perubahan kode akan secara efektif melewati RUN npm ci stage (dan semua tahapan sebelumnya), mempercepat proses secara drastis ketika Anda memiliki banyak dependensi.

Mengatur Urutan Gambar

Tahap terakhir dari Dockerfile menggunakan CMD petunjuk untuk menjalankan aplikasi Anda secara otomatis saat penampung dimulai. Ini berfungsi karena gambar dasar Node.js dikonfigurasi untuk menggunakan node proses sebagai titik masuknya. Itu CMD ditambahkan ke titik masuk yang diwarisi, menghasilkan node app.js jalankan sebagai proses latar depan untuk gambar baru Anda.

Membangun Gambar Anda

Selanjutnya Anda perlu membangun gambar Anda:

docker build -t node-app:latest .

foto dari "membangun buruh pelabuhan" keluaran log

Docker akan mengambil Dockerfile di direktori kerja Anda, jalankan instruksi di dalamnya, dan beri tag pada gambar yang dihasilkan sebagai node-app:latest. Akhir . (waktu) merujuk ke direktori kerja Anda sebagai konteks pembuatan gambar. Ini menentukan jalur yang dapat direferensikan oleh COPY instruksi di Dockerfile Anda.

Kembangkan Optimasi

Salah satu cara untuk meningkatkan performa build adalah dengan menambahkan a .dockerignore file di root proyek Anda. Berikan file konten berikut:

node_modules/

File ini menentukan jalur di direktori kerja Anda untuk membuat Tidak termasuk dalam konteks pembangunan. Anda tidak akan dapat mereferensikannya di dalam Dockerfile Anda. Dalam kasus node_moduleskonten direktori ini tidak relevan dengan build karena kami menginstal ulang dependensi melalui RUN npm ci pengajaran. Secara khusus tidak termasuk node_modules sudah ada di direktori kerja Anda menghemat harus menyalin semua file itu ke lokasi sementara dari konteks build Docker. Ini meningkatkan efisiensi dan mengurangi waktu yang dihabiskan untuk menyiapkan bangunan.

Memulai Wadah

Pada titik ini Anda siap menjalankan aplikasi Anda menggunakan Docker:

docker run -d 
    -p 8080:8080 
    --name my-app 
    --restart on-failure 
    node-app:latest

Itu docker run Perintah ini digunakan untuk memulai instance container baru dari image yang ditentukan. Beberapa tanda tambahan telah ditambahkan untuk mengonfigurasi wadah dengan benar untuk kasus penggunaan yang dimaksudkan:

  • -d – Menghapus shell Anda dari proses latar depan wadah, menjalankannya secara efektif sebagai server latar belakang.
  • -p – Mengikat port 8080 di host Anda ke port 8080 di dalam wadah (tempat aplikasi sampel Express kami dikonfigurasi untuk mendengarkan). Ini berarti lalu lintas ke localhost:8080 akan diteruskan ke pelabuhan peti kemas yang bersangkutan. Anda dapat mengubah posting host ke nilai yang berbeda dengan mengubah bagian pertama dari definisi ikatan, seperti 8100:8080 untuk mengakses wadah Anda di localhost:8100.
  • --name – Menetapkan nama ramah wadah yang dapat Anda gunakan untuk merujuknya ke perintah CLI Docker lainnya.
  • --restart – Memilih kebijakan mulai ulang untuk diterapkan ke penampung. Itu on-failure Pengaturan berarti Docker akan secara otomatis memulai ulang wadah jika muncul dengan kode kegagalan karena aplikasi Anda mogok.

gambar memulai wadah Docker dengan "lari ke dermaga"

Gambar yang dibangun pada langkah sebelumnya dirujuk sebagai argumen terakhir untuk docker run memesan ID kontainer akan ditampilkan di jendela terminal Anda; Anda seharusnya dapat mengakses aplikasi Node.js Anda dengan mengunjungi localhost:8080 lagi. Kali ini server berjalan di dalam wadah Docker, alih-alih menggunakan node proses diinstal pada host Anda.

gambar aplikasi contoh Node.js yang sedang berjalan

Ringkasan

Docker membantu Anda menerapkan layanan web Node.js dengan menempatkan wadah di sekitar seluruh lingkungan aplikasi. Anda dapat memulai wadah dari gambar Anda menggunakan satu docker run perintah pada setiap host dengan Docker diinstal. Ini menghilangkan kerumitan dalam mempertahankan versi Node.js, menginstal modul npm, dan memantau situasi di mana proses aplikasi Anda perlu dimulai ulang.

Setelah Anda membuat perubahan kode dan ingin meluncurkan pembaruan, bangun kembali gambar Docker Anda dan hapus wadah lama Anda dengan docker rm <container-name>. Anda kemudian dapat memulai instance pengganti yang menggunakan gambar yang dimodifikasi.

Anda mungkin menginginkan rutinitas produksi yang sedikit berbeda. Meskipun Anda dapat menggunakan instalasi Docker biasa dengan docker run, ini mungkin berat untuk semua aplikasi kecuali yang paling sederhana. Lebih umum menggunakan alat seperti Docker Compose atau Kubernetes untuk menentukan konfigurasi container dalam file yang dapat diversi dalam repositori Anda.

Mekanisme ini menghilangkan kebutuhan untuk mengulang docker run menandai setiap kali Anda memulai wadah baru. Mereka juga memfasilitasi replikasi container untuk menskalakan layanan Anda dan menyediakan redundansi. Jika Anda menerapkan ke host jarak jauh, Anda juga harus mendorong gambar Anda ke registri Docker sehingga dapat “diambil” dari mesin produksi Anda.

Pertimbangan khusus produksi lainnya adalah bagaimana Anda mengarahkan lalu lintas ke kontainer Anda. Pengikatan port mungkin cukup pada awalnya tetapi pada akhirnya Anda akan mencapai situasi di mana Anda menginginkan beberapa kontainer pada satu host, masing-masing mendengarkan pada port yang sama. Dalam hal ini, Anda dapat menggunakan proxy terbalik untuk merutekan lalu lintas ke port container individual berdasarkan atribut permintaan seperti nama domain dan header.

Leave a Comment

Your email address will not be published. Required fields are marked *