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 kelocalhost: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, seperti8100:8080
untuk mengakses wadah Anda dilocalhost: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.