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
Anda harus dapat mengunjungi localhost:8080
di browser Anda untuk melihat contoh respons.
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 .gitignore
itu 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 .
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_modules
konten 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 kelocalhost: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, seperti8100:8080
untuk mengakses wadah Anda dilocalhost: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. Ituon-failure
Pengaturan berarti Docker akan secara otomatis memulai ulang wadah jika muncul dengan kode kegagalan karena aplikasi Anda mogok.
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.
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.