GNU/Linux >> Belajar Linux >  >> Panels >> Docker

Cara Dockerisasi Aplikasi Web Node.js

Docker adalah platform containerization yang menyederhanakan pengemasan dan eksekusi aplikasi. Kontainer berjalan sebagai proses yang terisolasi dengan sistem file mereka sendiri tetapi berbagi kernel host mereka. Docker menjadi terkenal sebagai cara untuk mengimplementasikan lingkungan pengembangan yang dapat direproduksi dan arsitektur penerapan 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 kita akan menggunakan Docker untuk menampung aplikasi Node.js sederhana yang dibuat dengan kerangka kerja web Express yang populer. Docker adalah cara yang baik untuk menerapkan sistem berbasis Node karena menghasilkan 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 penerapan aplikasi Anda. Buat direktori untuk proyek Anda dan tambahkan beberapa kode server di dalamnya. Ini app.js dasar yang mendengarkan pada port 8080 dan merespons setiap permintaan dengan respons yang di-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 bekerja:

node app.js

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

Menulis Dockerfile

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

Berikut 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 basisnya melalui FROM penyataan. Gambar mewarisi semua yang ada di pangkalan, lalu menambahkan konten tambahan melalui petunjuk berikut.

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

Memasang Dependensi

Tahap selanjutnya adalah menambahkan package.json npm dan jalankan 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 node_modules yang ada 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 konten repositori kontrol sumber Anda. Jika file atau folder ada di .gitignore . Anda , itu tidak boleh direferensikan dalam COPY Dockerfile instruksi.

Menyalin Kode Aplikasi

Setelah npm ci telah berjalan, kode aplikasi Anda disalin ke dalam gambar. Penempatan COPY . ini instruksi setelah RUN , memisahkannya dari salinan sebelumnya, adalah disengaja. Setiap instruksi membuat layer baru di gambar Anda; Proses build Docker menyimpan cache setiap layer untuk mempercepat build berikutnya. Setelah konten dari satu lapisan berubah, cache dari semua lapisan berikutnya akan dibatalkan.

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

Menyetel Perintah Gambar

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

Membangun Gambar Anda

Selanjutnya Anda perlu membangun citra Anda:

docker build -t node-app:latest .

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

Pengoptimalan Pembuatan

Salah satu cara untuk meningkatkan kinerja build adalah dengan menambahkan .dockerignore file ke root proyek Anda. Berikan file konten berikut:

node_modules/

File ini mendefinisikan jalur di direktori kerja Anda yang tidak dimasukkan dalam konteks pembangunan. Anda tidak akan dapat mereferensikannya di dalam Dockerfile Anda. Dalam kasus node_modules , konten direktori ini tidak relevan dengan build karena kami menginstal dependensi baru melalui RUN npm ci petunjuk. Secara khusus mengecualikan node_modules sudah ada di direktori kerja Anda, kecuali harus menyalin semua file itu ke lokasi konteks build sementara Docker. Hal ini meningkatkan efisiensi dan mengurangi waktu yang dihabiskan untuk mempersiapkan build.

Memulai Kontainer

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

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

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

Gambar yang dibangun pada langkah sebelumnya dirujuk sebagai argumen terakhir ke docker run memerintah. ID kontainer akan dipancarkan ke 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 yang diinstal pada host Anda.

Ringkasan

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

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

Anda mungkin menginginkan rutinitas yang sedikit berbeda dalam produksi. Meskipun Anda dapat menggunakan instalasi Docker biasa dengan docker run , ini cenderung 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 di dalam repositori Anda.

Mekanisme ini menghilangkan kebutuhan untuk mengulang docker run menandai setiap kali Anda memulai penampung baru. Mereka juga memfasilitasi replikasi container untuk menskalakan layanan Anda dan menyediakan redundansi. Jika Anda men-deploy ke host jarak jauh, Anda juga harus mendorong image Anda ke registry Docker sehingga dapat "ditarik" dari mesin produksi Anda.

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


Docker
  1. Cara Menginstal Node.js dan npm di Debian 11

  2. Bagaimana Cara Membuat Jshint Bekerja?

  3. Cara memasang Aplikasi Web

  1. Cara Menginstal Node.js dan NPM di Mac

  2. Cara menginstal Node.js dan NPM di CentOS

  3. Cara Menginstal Node.js dan npm di Ubuntu 20.04

  1. Cara Menginstal Node.js &NPM di Ubuntu 18.04 dan 20.04

  2. Cara Menginstal Node.js dan NPM di Windows

  3. Cara Instal Node.js dan NPM di CentOS 7