Meng-docker aplikasi web Node.js

Tujuan dari contoh ini adalah untuk menunjukkan kepada Anda cara memasukkan aplikasi Node.js ke dalam Docker Container. Panduan ini ditujukan untuk pengembangan, dan bukan untuk penerapan produksi. Panduan ini juga mengasumsikan Anda memiliki Panduan ini juga mengasumsikan Anda memiliki Instalasi Docker yang berfungsi dan dasar pemahaman tentang bagaimana aplikasi Node.js terstruktur.

Di bagian pertama panduan ini kita akan membuat aplikasi web sederhana di Node.js, lalu kita akan membangun image Docker untuk aplikasi itu, dan terakhir kita akan membuat instance container dari image itu.

Docker memungkinkan Anda untuk mengemas aplikasi dengan lingkungannya dan semua dependensinya ke dalam "kotak", yang disebut container. Biasanya, container terdiri dari aplikasi yang berjalan dalam versi sistem operasi Linux yang dilucuti ke dasar. Image adalah cetak biru untuk container, container adalah instance image yang sedang berjalan.

Buat aplikasi Node.js

Pertama, buat direktori baru tempat semua file akan hidup. Di direktori ini buat file package.json yang menjelaskan aplikasi Anda dan dependensinya:

{
  "name": "docker_web_app",
  "version": "1.0.0",
  "description": "Node.js on Docker",
  "author": "First Last <first.last@example.com>",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "express": "^4.18.2"
  }
}

Dengan file package.json baru Anda, jalankan npm install. Jika Anda menggunakan npm versi 5 atau lebih baru, ini akan menghasilkan file package-lock.json yang akan disalin ke image Docker Anda.

Kemudian, buat file server.js yang mendefinisikan aplikasi web menggunakan Kerangka kerja Express.js:

'use strict';
 
const express = require('express');
 
// Constants
const PORT = 8080;
const HOST = '0.0.0.0';
 
// App
const app = express();
app.get('/', (req, res) => {
  res.send('Hello World');
});
 
app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

Pada langkah selanjutnya, kita akan melihat bagaimana Anda dapat menjalankan aplikasi ini di dalam Docker container menggunakan image Docker resmi. Pertama, Anda harus membangun Docker image pada aplikasi Anda.

Membuat Dockerfile

Buat file kosong bernama Dockerfile:

touch Dockerfile

Buka Dockerfile di editor teks favorit Anda

Hal pertama yang perlu kita lakukan adalah menentukan dari gambar apa kita ingin membangun. Di sini kita akan menggunakan versi terbaru LTS (dukungan jangka panjang) 18 dari node tersedia dari Docker Hub:

FROM node:18

Selanjutnya kita membuat direktori untuk menyimpan kode aplikasi di dalam image, ini akan menjadi direktori kerja untuk aplikasi Anda:

# Create app directory
WORKDIR /usr/src/app

Image ini dilengkapi dengan Node.js dan NPM yang sudah terpasang, jadi hal berikutnya yang kami lakukan yang perlu dilakukan adalah menginstal dependensi aplikasi Anda menggunakan biner npm. Silahkan perhatikan bahwa jika Anda menggunakan npm versi 4 atau sebelumnya, package-lock.json file tidak akan dihasilkan.

# Menginstal dependensi aplikasi
# Wildcard digunakan untuk memastikan package.json DAN package-lock.json disalin
# jika tersedia (npm@5+)
COPY package*.json ./

RUN npm install
# Jika Anda membangun kode untuk produksi
# Jalankan npm ci --omit=dev

Perhatikan bahwa, daripada menyalin seluruh direktori kerja, kami hanya menyalin berkas package.json. Ini memungkinkan kami untuk memanfaatkan Docker yang di-cache lapisan. bitJudo memiliki penjelasan yang bagus tentang ini di sini. Selanjutnya, perintah npm ci, yang ditentukan dalam komentar, membantu menyediakan build yang lebih cepat, andal, dan dapat direproduksi untuk lingkungan produksi. Anda dapat membaca lebih lanjut tentang ini di sini.

Untuk menggabungkan kode sumber aplikasi Anda di dalam Docker image, gunakan COPY petunjuk:

# Bundle app source
COPY . .

Aplikasi Anda mengikat ke port 8080 sehingga Anda akan menggunakan instruksi EXPOSE untuk memetakannya oleh daemon docker:

EXPOSE 8080

Terakhir, tetapi tidak kalah penting, tentukan perintah untuk menjalankan aplikasi Anda menggunakan CMD yang mendefinisikan runtime Anda. Di sini kita akan menggunakan node server.js untuk memulai server Anda:

CMD [ "node", "server.js" ]

Dockerfile Anda sekarang akan terlihat seperti ini:

FROM node:18

# Buat direktori aplikasi
WORKDIR /usr/src/app

# Instal dependensi aplikasi
# Wildcard digunakan untuk memastikan package.json DAN package-lock.json disalin
# jika tersedia (npm@5+)
COPY package*.json ./

RUN npm install
# Jika Anda membangun kode untuk produksi
# RUN npm ci --omit=dev

# Bundle app source
COPY . .

EXPOSE 8080
CMD [ "node", "server.js" ]

.dockerignore file

Buat file .dockerignore di direktori yang sama dengan Dockerfile Anda dengan konten berikut:

node_modules
npm-debug.log

Ini akan mencegah modul lokal dan log debug Anda disalin ke Image Docker dan mungkin menimpa modul yang dipasang di dalam image Anda.

Membangun citra Anda

Buka direktori yang memiliki Dockerfile Anda dan jalankan perintah berikut untuk membangun Docker image. Penanda -t memungkinkan Anda menandai image Anda sehingga lebih mudah untuk temukan nanti menggunakan perintah docker images berikut:

docker build . -t <your username>/node-web-app

Image Anda sekarang akan terdaftar oleh Docker:

$ docker images

# Example
REPOSITORY                      TAG        ID              CREATED
node                            18         78b037dbb659    2 weeks ago
<your username>/node-web-app    latest     d64d3505b0d2    1 minute ago

Jalankan image

Menjalankan image Anda dengan -d akan menjalankan container dalam mode terpisah, meninggalkan container berjalan di latar belakang. Penanda-p mengalihkan port publik ke port pribadi di dalam container. Jalankan image yang Anda buat sebelumnya:

docker run -p 49160:8080 -d <your username>/node-web-app

Hasil output aplikasi Anda:

# Get container ID
$ docker ps

# Print app output
$ docker logs <container id>

# Example
Running on http://localhost:8080

Jika Anda perlu masuk ke dalam container, Anda dapat menggunakan perintah exec:

# Enter the container
$ docker exec -it <container id> /bin/bash

Uji

Untuk menguji aplikasi Anda, dapatkan port aplikasi Anda yang dipetakan oleh Docker:

$ docker ps

# Example
ID            IMAGE                                COMMAND    ...   PORTS
ecce33b30ebf  <your username>/node-web-app:latest  npm start  ...   49160->8080

Pada contoh di atas, Docker memetakan port 8080 di dalam container untuk port 49160 pada mesin Anda.

Sekarang Anda dapat memanggil aplikasi Anda menggunakan curl (install diperlukan melalui: sudo apt-get install curl):

$ curl -i localhost:49160

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 12
ETag: W/"c-M6tWOb/Y57lesdjQuHeB1P/qTV0"
Date: Mon, 13 Nov 2017 20:53:59 GMT
Connection: keep-alive

Hello world

Matikan image

Untuk mematikan aplikasi yang kami mulai, kami menjalankan perintah kill. Ini memerlukan ID container, sebagai contoh kami mendapatkan ID container:ecce33b30ebf.

# Kill our running container
$ docker kill <container id>
<container id>

# Confirm that the app has stopped
$ curl -i localhost:49160
curl: (7) Failed to connect to localhost port 49160: Connection refused

Kami harap tutorial ini membantu Anda membuat dan menjalankan aplikasi Node.js sederhana di Docker.

Anda dapat menemukan informasi lebih lanjut tentang Docker dan Node.js di Docker di tempat-tempat berikut:

Gulir ke atas