Cách Dockerize API REST của Node.js
Quá trình triển khai và chạy các ứng dụng trong các môi trường khác nhau có thể gặp rắc rối vì có một số yếu tố cần xem xét, chẳng hạn như thiết lập các biến môi trường để định cấu hình các phụ thuộc cần thiết và các phiên bản cụ thể của các gói phần mềm khác nhau.
Tuy nhiên, bằng cách sử dụng công nghệ bộ chứa của Docker, bạn có thể triển khai các ứng dụng trong các môi trường khác nhau với nỗ lực tối thiểu với tất cả các phụ thuộc cần thiết trong hình ảnh docker. Có nghĩa là bạn không phải lo lắng về việc thực hiện bất kỳ cấu hình nào. Điều này làm cho quá trình triển khai và chạy các ứng dụng trong các môi trường khác nhau trở nên dễ dàng.
Mục Lục
Docker là gì?
Docker là một nền tảng phát triển cung cấp các công cụ và môi trường để đóng gói các ứng dụng dưới dạng hình ảnh di động có thể chạy dưới dạng các thành phần thực thi độc lập trong vùng chứa.
Các vùng chứa này cấu thành mã của ứng dụng và các thành phần phụ thuộc bắt buộc để ứng dụng chạy thành công trên các môi trường thời gian chạy khác nhau mà không gặp bất kỳ sự cố nào.
Trước khi bắt đầu, hãy cài đặt Docker trên máy cục bộ của bạn. Kiểm tra các điều kiện tiên quyết dành riêng cho nền tảng và hướng dẫn cài đặt từ tài liệu chính thức.
Tạo API REST của Node.js
Để bắt đầu, hãy tạo một máy chủ web Node.js.
Tiếp theo, cài đặt các gói cần thiết cho dự án này.
npm install morgan pg knex
Các trang gói được sử dụng để thiết lập kết nối với cơ sở dữ liệu PostgreSQL. đầu gốimặt khác, cung cấp một API đơn giản để tương tác với PostgreSQL — bạn sẽ sử dụng nó để viết các truy vấn SQL.
Cuối cùng, bạn sẽ sử dụng cơ quanmột phần mềm trung gian ghi lại các yêu cầu và phản hồi HTTP trên bảng điều khiển, để gỡ lỗi và giám sát ứng dụng của bạn đang chạy trong vùng chứa Docker.
Cuối cùng, mở index.js tệp và thêm mã bên dưới để triển khai API REST đơn giản với ba tuyến đường.
const express = require("express")
const morgan = require("morgan")
const app = express()
const db = require('./db')
const PORT = process.env.PORT || 5000app.use(morgan('dev'))
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.get("https://www.smartreviewaz.com/", (req, res) => res.send('Hello World!' ))
app.get('/users', async (req, res) => {
const users = await db.select().from('users')
res.json(users)
})
app.post('/users', async (req, res) => {
const user = await db('users').insert({ name: req.body.name }).returning('*')
res.json(user)
})
app.listen(PORT, () => console.log(`Server up at PORT:${PORT}`))
Định cấu hình kết nối cơ sở dữ liệu
API REST sẽ tương tác với phiên bản PostgreSQL của Docker, tuy nhiên, trước tiên bạn cần định cấu hình kết nối cơ sở dữ liệu trong ứng dụng của mình. Trong thư mục gốc của thư mục dự án của bạn, hãy tạo một db.js tập tin và thêm mã dưới đây.
const knex = require('knex')
module.exports = knex({
client: 'postgres',
connection: {
host: 'db',
user: 'testUser',
password: 'mypassword123',
database: 'testUser',
},
})
Thiết lập các tệp Migrate.js và seed.js
Hai tệp này sẽ cho phép tạo bảng trong cơ sở dữ liệu và điền dữ liệu thử nghiệm vào bảng đó thông qua API. Tạo một thư mục mới, kịch bảntrong thư mục gốc của dự án của bạn và thêm hai tệp: di chuyển.js Và seed.js.
bên trong di chuyển.js tập tin, thêm mã dưới đây:
const db = require('../db');
(async () => {
try {
await db.schema.dropTableIfExists('users')
await db.schema.withSchema('public').createTable('users', (table) => {
table.increments()
table.string('name')
})
console.log('Created users table!')
process.exit(0)
} catch (err) {
console.log(err)
process.exit(1)
}
})()
Đoạn mã này sẽ tạo ra một người dùng bảng có cột id tăng tự động và tên cột trong cơ sở dữ liệu.
Tiếp theo, trong seed.js tập tin, thêm mã dưới đây:
const db = require('../db');
(async () => {
try {
await db('users').insert({ name: 'Test User1' })
await db('users').insert({ name: 'Test User2' })
console.log('Added dummy users!')
process.exit(0)
} catch (err) {
console.log(err)
process.exit(1)
}
})()
Mã này triển khai một chức năng không đồng bộ sẽ chèn hai người dùng vào cơ sở dữ liệu PostgreSQL.
Cuối cùng, thêm các lệnh này vào gói.json tài liệu.
"scripts": {
"start": "node index.js",
"migrate": "node scripts/migrate.js",
"seed": "node scripts/seed.js" },
Vì bạn chưa định cấu hình ứng dụng khách nên để kiểm tra API, bạn sẽ cần chạy hai tệp dưới dạng tập lệnh cùng với chạy npm yêu cầu.
Thiết lập Dockerfile
Dockerfile xác định các hướng dẫn mà công cụ Docker yêu cầu để xây dựng hình ảnh Docker. Trong thư mục gốc của dự án của bạn, tạo một tệp mới và đặt tên cho nó, Dockerfile. Sau đó, thêm các hướng dẫn sau để xây dựng hình ảnh Docker cho ứng dụng Node.js.
FROM node:16.3.0-alpine3.13
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8000
CMD [ "node", "index.js" ]
Hãy chia nhỏ nó ra:
- TỪ – Hướng dẫn này đặt hình ảnh cơ sở cho ứng dụng, đó là hình ảnh Node.js Alpine, một phiên bản nhẹ của hình ảnh Node.js có thể tìm thấy trong sổ đăng ký Docker.
- HƯỚNG DẪN LÀM VIỆC – bộ /ứng dụng thư mục làm thư mục làm việc.
- SAO CHÉP gói*.json./ – hướng dẫn Docker sao chép tất cả các tệp có định dạng tên tệp đó từ thư mục hiện tại sang thư mục /ứng dụng thư mục.
- CHẠY – thực hiện và xây dựng hình ảnh.
- SAO CHÉP . . – sao chép các tập tin nguồn vào /ứng dụng thư mục.
- PHƠI RA – điều này hướng dẫn Docker hiển thị một cổng trong vùng chứa ra môi trường bên ngoài, trong trường hợp này là máy chủ.
- cmd – chỉ định lệnh sẽ được thực thi khi bộ chứa Docker được tạo từ hình ảnh.
Tạo tệp soạn thảo Docker
Để ứng dụng Node.js tương tác với phiên bản PostgreSQL của Docker, hai ứng dụng cần chạy trong bộ chứa Docker trong cùng một môi trường mạng.
Vì lý do này, bạn cần xác định và xây dựng cả hình ảnh của ứng dụng và phiên bản PostgreSQL bằng cách sử dụng Docker Compose — một công cụ cho phép bạn xây dựng và quản lý nhiều bộ chứa Docker.
Nói một cách đơn giản, bằng cách sử dụng Docker Compose, bạn có thể xác định các dịch vụ tạo nên ứng dụng của mình dưới dạng một đơn vị, trong trường hợp này là API REST của Node.js và cơ sở dữ liệu PostgreSQL.
Tạo một tệp mới, docker-compose.ymltrong thư mục gốc và thêm đoạn mã dưới đây:
version: '3.9'services:
server:
build: .
ports:
- '5000:5000'
depends_on:
- db
db:
image: 'postgres'
ports:
- '4321:5432'
environment:
POSTGRES_PASSWORD: 'mypassword123'
POSTGRES_USER: 'testUser'
volumes:
- data:/var/lib/postgresql/data
volumes:
data:
Mã này sẽ tạo và chạy hai bộ chứa Docker. Thùng chứa đầu tiên, máy chủDocker Compose sử dụng Dockerfile để xây dựng hình ảnh cho vùng chứa này.
Nó cũng chỉ định rằng bộ chứa máy chủ phụ thuộc vào db thùng đựng hàng. Ý nghĩa, sự máy chủ thùng chứa phải được bắt đầu sau khi db container để kết nối với nó.
Vùng chứa thứ hai là vùng chứa cơ sở dữ liệu PostgreSQL. Bạn không cần chỉ định Dockerfile cho vùng chứa này vì nó sẽ được tạo từ hình ảnh PostgreSQL trên sổ đăng ký hình ảnh của Docker.
Xây dựng hình ảnh Docker
Sử dụng lệnh Docker Compose để tạo hình ảnh và khởi động hai vùng chứa.
docker-compose up -d
Bạn sẽ thấy phản hồi tương tự sau khi quá trình hoàn tất thành công.
Kiểm tra API REST
Chạy lệnh bên dưới để kiểm tra API REST đang chạy trong bộ chứa Docker. Nó sẽ tạo một bảng trong cơ sở dữ liệu PostgreSQL.
docker exec docker_node-server-1 npm run migrate
Bạn sẽ thấy một phản hồi tương tự.
Chia sẻ hình ảnh Docker
Bước cuối cùng là đẩy hình ảnh Docker cho ứng dụng Node.js của bạn lên Docker Hub. Điều này tương tự như đẩy các dự án của bạn lên GitHub.
- Truy cập Docker Hub và đăng ký tài khoản và đăng nhập vào bảng điều khiển người dùng.
- Tiếp theo, bấm vào Tạo một kho lưu trữ. Cung cấp tên kho lưu trữ của bạn và đặt mức độ hiển thị của nó thành một trong hai Công cộng hoặc Riêng tư và sau đó bấm Tạo nên.
- Để đẩy hình ảnh Docker của ứng dụng của bạn lên Docker Hub, trước tiên bạn cần đăng nhập vào tài khoản của mình thông qua thiết bị đầu cuối, sau đó cung cấp tên người dùng và mật khẩu của bạn.
docker login
- Tiếp theo, cập nhật tên của hình ảnh Docker của bạn để phù hợp với định dạng này:
/ . Chạy lệnh bên dưới để thực hiện thay đổi này:
docker tag <image> <your docker username>/<repo name>
- Cuối cùng, đẩy hình ảnh Docker của bạn.
docker push <image>/< repo name>
Sử dụng Docker trong phát triển
Hướng dẫn này chỉ đề cập đến một phần tiềm năng mà Docker có thể mang lại. Tuy nhiên, giờ đây bạn có thể sử dụng công nghệ bộ chứa của Docker để đóng gói bất kỳ ứng dụng nào và tất cả các phần phụ thuộc của nó dưới dạng hình ảnh có thể được triển khai trong các môi trường phát triển cũng như sản xuất khác nhau như đám mây mà không gặp bất kỳ trục trặc nào.