Tích hợp Redis vào Docker Image – Phần 2: Viết Dockerfile tích hợp Redis từ đầu đến cuối
Phần 2: Viết Dockerfile tích hợp Redis vào cùng ứng dụng – Hướng dẫn từ đầu đến cuối
Tóm tắt: Trong phần này, chúng ta sẽ viết một Dockerfile tích hợp Redis vào cùng Docker Image với ứng dụng backend. Bạn sẽ hiểu rõ cách cài Redis trong image, khởi động Redis song song với ứng dụng, và kiểm tra Redis hoạt động như thế nào trong môi trường này.
1. Tại sao lại tích hợp Redis?
Redis là một in-memory database cực kỳ nhanh, thường được dùng làm cache, queue, session store,... Tuy nhiên, trong môi trường on-premise hoặc local deployment, việc phải chạy Redis riêng biệt lại gây rắc rối và tốn công.
→ Tích hợp Redis trực tiếp vào Docker image giúp bạn:
- Deploy bằng duy nhất 1 lệnh
docker run
- Giảm yêu cầu cài đặt Redis thủ công
- Test nhanh trong môi trường dev, staging
2. Kiến trúc Docker container sau khi tích hợp
Chúng ta muốn tạo một image có cấu trúc như sau:
+----------------------------+ | Docker Image | | | | +----------------------+ | | | Redis Server | | | +----------------------+ | | || | | +----------------------+ | | | App Backend | | | +----------------------+ | | | +----------------------------+
Lưu ý: Docker chỉ chạy được 1 tiến trình chính → chúng ta cần dùng supervisord
để chạy cả Redis lẫn App cùng lúc.
3. Chuẩn bị: Backend app ví dụ
Giả sử bạn có một ứng dụng backend đơn giản viết bằng Node.js (có thể thay bằng Spring Boot, Python,...). Sau đây là một file index.js
ví dụ:
// index.js const express = require("express"); const redis = require("redis"); const app = express(); const client = redis.createClient({ url: "redis://localhost:6379" }); client.connect().catch(console.error); app.get("/", async (req, res) => { const views = await client.incr("page:views"); res.send(`Hello! This page has ${views} views.`); }); app.listen(3000, () => console.log("App running on http://localhost:3000"));
Thư mục dự án của bạn trông như sau:
project/ ├── index.js ├── package.json ├── supervisord.conf └── Dockerfile
4. Viết file supervisord.conf
Supervisor là công cụ giúp quản lý và chạy nhiều tiến trình trong một container. File cấu hình của nó như sau:
; supervisord.conf [supervisord] nodaemon=true [program:redis] command=redis-server autostart=true autorestart=true [program:app] command=node /app/index.js autostart=true autorestart=true
5. Viết Dockerfile tích hợp Redis
Giờ đến phần chính: Dockerfile. Mục tiêu của ta là:
- Cài đặt Redis
- Cài đặt Node.js app
- Cài Supervisor
- Khởi động Redis + App cùng lúc
# Dockerfile FROM node:18-slim # Cài Redis & Supervisor RUN apt-get update && \ apt-get install -y redis-server supervisor && \ apt-get clean # Tạo thư mục app WORKDIR /app # Copy app vào container COPY package.json ./ RUN npm install COPY . . # Copy cấu hình supervisor COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf # Mở port cho app EXPOSE 3000 # Lệnh chạy chính CMD ["/usr/bin/supervisord"]
6. Build và chạy Docker image
Sau khi viết xong Dockerfile, chạy lệnh sau để build image:
docker build -t myapp-with-redis .
Chạy container:
docker run -p 3000:3000 myapp-with-redis
Bây giờ bạn có thể truy cập http://localhost:3000
và thấy số lượng views tăng lên – được lưu trong Redis nội bộ container.
7. Kiểm tra Redis bên trong container
Để kiểm tra Redis đang hoạt động:
docker exec -it <container_id> redis-cli 127.0.0.1:6379> get page:views
Nếu thấy số lượng truy cập, tức Redis đã hoạt động tốt trong cùng image.
8. Những lưu ý thực tế
- Redis chạy trong image này không có mật khẩu – chỉ nên dùng trong môi trường dev/staging
- Nếu muốn persist dữ liệu Redis, bạn cần mount volume vào
/var/lib/redis
- Không nên dùng image này để scale trên production nếu cần hiệu suất Redis cao
9. Tổng kết
Chúng ta vừa xây dựng một Dockerfile tích hợp Redis và Node.js app vào một image duy nhất, quản lý bằng Supervisor. Đây là bước đầu để hướng tới mô hình deploy "tự chạy" — chỉ cần docker run
là hệ thống đầy đủ Redis và app backend cùng chạy ổn định.
Trong phần tiếp theo, chúng ta sẽ tiếp tục tích hợp Elasticsearch vào cùng image – vốn phức tạp hơn do yêu cầu Java, cấu hình bộ nhớ, và index volume.
Tiếp tục đọc: Phần 3: Tích hợp Elasticsearch vào Docker image – Xử lý Java, bộ nhớ và volume
Tham gia cuộc trò chuyện