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

Hướng dẫn tạo Dockerfile tích hợp Redis vào image ứng dụng backend, dùng supervisor để chạy nhiều tiến trình.

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

Xin chào! Mình là BaoTrongIT – một lập trình viên đam mê chia sẻ kiến thức lập trình, đặc biệt là về JavaScript, Node.js, NestJS, và các công nghệ backend/frontend hiện đại. Trên blog này, mình thường xuyên đăng tải các bài viết thủ thuật, kinh nghiệm thực chiến, ví dụ minh họa dễ hiểu, giúp bạn tiếp cận và hiểu sâu các khái niệm tưởng như phức tạp trong lập trình.