Giới thiệu
Docker là một công cụ mạnh mẽ giúp bạn tạo ra môi trường phát triển nhất quán cho ứng dụng của mình. Trong bài viết này, chúng ta sẽ tìm hiểu cách Docker hóa một ứng dụng Node.js bằng cách sử dụng một Dockerfile tùy chỉnh. Chúng ta sẽ xây dựng một ứng dụng Node.js đơn giản, lấy dữ liệu từ GitHub và phục vụ nó qua máy chủ Express. Bạn sẽ được hướng dẫn từng bước, từ việc thiết lập dự án đến việc chạy nó trong Docker.
Tại sao nên Docker hóa ứng dụng?
Docker hóa ứng dụng giúp bạn:
- Đảm bảo tính nhất quán: Ứng dụng chạy giống nhau trên mọi hệ thống.
- Dễ dàng chia sẻ và triển khai: Chỉ cần một lệnh để chạy ứng dụng mà không cần cài đặt thêm phần mềm.
- An toàn và cách ly: Ứng dụng chạy trong một môi trường riêng biệt, không xung đột với các ứng dụng khác.
Cài đặt môi trường
Trước khi bắt đầu, hãy đảm bảo bạn đã cài đặt Docker. Bạn có thể tham khảo hướng dẫn cài đặt tại đây.
Dockerfile là gì?
Dockerfile là một tệp văn bản đơn giản mô tả cách xây dựng và chạy ứng dụng bên trong một Docker image. Nó bao gồm các chỉ thị như:
- Hình ảnh cơ sở để bắt đầu từ đâu.
- Các tệp cần sao chép vào image.
- Các lệnh để chạy trong quá trình thiết lập.
- Cách bắt đầu ứng dụng khi container chạy.
1. Tạo ứng dụng Node.js
Chúng ta sẽ docker hóa một ứng dụng Node.js sử dụng Express. Bước đầu tiên là tạo một thư mục có tên stars_generator và thêm hai tệp vào trong đó:
package.jsonserver.js
1.1 Tệp package.json
Tệp này định nghĩa metadata cho ứng dụng, bao gồm các phụ thuộc cần thiết và cách khởi động ứng dụng. Chúng ta sẽ sử dụng express và axios. Tạo tệp package.json với nội dung sau:
json
{
"name": "docker-node-advanced",
"version": "1.0.0",
"scripts": {
"start": "node server.js"
},
"dependencies": {
"express": "^4.18.2",
"axios": "^1.4.0"
}
}
1.2 Tệp server.js
Đây là điểm vào chính của ứng dụng. Nó sử dụng Express để phục vụ một trang chủ, lấy dữ liệu từ GitHub bằng Axios và hiển thị số lượng sao trong trình duyệt.
Thêm đoạn mã sau vào server.js:
javascript
const express = require('express');
const axios = require('axios');
const app = express();
const PORT = process.env.PORT || 3000;
app.get('/', async (req, res) => {
try {
const response = await axios.get('https://api.github.com/repos/nodejs/node');
res.send(`<h1>Node.js GitHub Stars</h1><p>This repo has ${response.data.stargazers_count} ⭐️ stars.</p>`);
} catch (error) {
res.status(500).send('Failed to fetch data from GitHub');
}
});
app.listen(PORT, () => {
console.log(`Server running on http://localhost:${PORT}`);
});
2. Chạy ứng dụng để kiểm tra
Trước khi docker hóa, hãy chạy ứng dụng cục bộ để đảm bảo mọi thứ hoạt động như mong đợi.
Trong terminal, hãy chạy:
npm install
node server.js
Mở trình duyệt và truy cập:
http://localhost:3000
Nếu ứng dụng không phản hồi đúng cách, hãy sửa lỗi trước khi tiếp tục.
3. Docker hóa ứng dụng
Bây giờ chúng ta sẽ docker hóa ứng dụng Node.js. Bước đầu tiên là tạo một Dockerfile.
3.1 Tạo một Dockerfile
Tạo tệp tên là Dockerfile trong thư mục gốc của dự án (cùng cấp với server.js và package.json). Cấu trúc thư mục của bạn sẽ như sau:
stars_generator/
├── Dockerfile
├── package.json
└── server.js
Thêm nội dung sau vào Dockerfile:
dockerfile
# Bắt đầu với hình ảnh Node.js 22 Alpine
FROM node:22-alpine
# Đặt thư mục làm việc trong container
WORKDIR /usr/src/app
# Sao chép package.json và cài đặt phụ thuộc
COPY package.json ./
RUN npm install
# Sao chép mã nguồn còn lại của ứng dụng
COPY . .
# Mở cổng mà ứng dụng chạy trên đó
EXPOSE 3000
# Khởi động ứng dụng
CMD ["npm", "start"]
3.2 Tạo tệp .dockerignore
Tạo tệp .dockerignore trong thư mục gốc của dự án với nội dung sau:
node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
*.md
.env
3.3 Xây dựng và chạy container
Bây giờ chúng ta sẽ xây dựng hình ảnh Docker và chạy container.
Xây dựng hình ảnh Docker
Trong terminal, từ thư mục gốc của dự án, chạy:
docker build -t stars_generator .
Chạy container
Sau khi hình ảnh đã được xây dựng, hãy chạy container bằng lệnh:
docker run -p 3000:3000 stars_generator
4. Tại sao nên Docker hóa ứng dụng Node.js?
Docker hóa giúp bạn:
- Chạy ứng dụng với môi trường nhất quán.
- Dễ dàng chia sẻ và triển khai ứng dụng mà không cần cài đặt Node.js.
- Cách ly ứng dụng khỏi hệ thống của bạn.
5. Đẩy hình ảnh Docker lên Docker Hub
Bước này không bắt buộc nhưng rất hữu ích. Để thực hiện:
5.1 Tạo tài khoản Docker Hub
Truy cập Docker Hub và tạo tài khoản.
5.2 Đánh dấu hình ảnh
docker tag stars_generator <your_dockerhub_username>/stars_generator
5.3 Đăng nhập vào Docker
docker login
5.4 Đẩy hình ảnh lên Docker Hub
docker push <your_dockerhub_username>/stars_generator
Kết luận
Docker hóa ứng dụng Node.js không chỉ giúp bạn phát triển nhưng còn đảm bảo tính nhất quán và dễ dàng triển khai. Hãy thử nghiệm với các ứng dụng khác và tận dụng sức mạnh của Docker để tối ưu hóa quy trình phát triển của bạn. Đừng quên chia sẻ hình ảnh của bạn trên Docker Hub để cộng đồng có thể khám phá và sử dụng ứng dụng của bạn!
Câu hỏi thường gặp
Docker là gì?
Docker là một nền tảng cho phép bạn đóng gói, phân phối và chạy ứng dụng trong các container.
Tại sao nên sử dụng Docker?
Docker giúp đảm bảo tính nhất quán giữa các môi trường phát triển, kiểm thử và sản xuất.
Làm thế nào để chạy ứng dụng trong Docker?
Chạy lệnh docker run để khởi động container với hình ảnh đã xây dựng.