Triển khai Dịch vụ Backend với Docker: MySQL, Nginx, Redis và MinIO

MySQL 8.0

Cấu hình Dockerfile

FROM mysql:8.0.33

# Thiết lập múi giờ
ENV TZ=Asia/Ho_Chi_Minh
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# Cấu hình cơ sở dữ liệu
ENV MYSQL_DATABASE=quanly_doanhthu \
    MYSQL_ROOT_PASSWORD=docker_secure2024 \
    MYSQL_ROOT_HOST=%

# Sao chép file khởi tạo
COPY init_db.sql /docker-entrypoint-initdb.d/

EXPOSE 3306

Thiết lập hệ thống

Tạo cấu trúc thư mục cần thiết:

mkdir -p /app/mysql/{data,conf}
touch /app/mysql/conf/my.cnf

Nội dung my.cnf tối giản:

[mysqld]
skip-name-resolve
default-authentication-plugin=mysql_native_password
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

Lệnh khởi chạy

docker build -t db-mysql:latest . && \
docker run -d -p 3307:3306 \
  -v /app/mysql/data:/var/lib/mysql \
  -v /app/mysql/conf:/etc/mysql/conf.d \
  --name mysql-service db-mysql:latest

Nginx với SSL

Dockerfile cơ bản

FROM nginx:1.25.1

# Thiết lập môi trường
ENV TZ=Asia/Ho_Chi_Minh
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime

# Sao chép cấu hình
COPY nginx.conf /etc/nginx/nginx.conf
COPY sites-enabled/ /etc/nginx/conf.d/

Cấu trúc thư mục

/app/nginx/
├── html
├── logs
├── certs
└── conf
    └── sites-enabled

Cấu hình SSL (sites-enabled/default.conf)

server {
    listen 443 ssl;
    server_name api.example.com;

    ssl_certificate /etc/nginx/certs/example.pem;
    ssl_certificate_key /etc/nginx/certs/example.key;
    ssl_protocols TLSv1.2 TLSv1.3;

    location / {
        root /usr/share/nginx/html;
        try_files $uri $uri/ /index.html;
    }
}

server {
    listen 80;
    server_name api.example.com;
    return 301 https://$host$request_uri;
}

Lệnh triển khai

docker run -d -p 80:80 -p 443:443 \
  -v /app/nginx/html:/usr/share/nginx/html \
  -v /app/nginx/logs:/var/log/nginx \
  -v /app/nginx/certs:/etc/nginx/certs \
  -v /app/nginx/conf:/etc/nginx/conf.d \
  --name web-server nginx:latest

Redis 7.0

Dockerfile tối ưu

FROM redis:7.0

# Cấu hình bảo mật
ENV REDIS_PASSWORD=redis_docker@2024

# Sao chép file cấu hình
COPY redis.conf /usr/local/etc/redis/redis.conf

CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]

redis.conf tối giản

bind 0.0.0.0
protected-mode yes
port 6379
requirepass "${REDIS_PASSWORD}"
maxmemory 512mb
maxmemory-policy allkeys-lru

Triển khai không trạng thái

docker run -d -p 6379:6379 \
  -e REDIS_PASSWORD=redis_docker@2024 \
  --name cache-service \
  redis:7.0 --save 900 1 --loglevel warning

MinIO Object Storage

Lệnh chạy trực tiếp

docker run -d -p 9000:9000 -p 9001:9001 \
  -e MINIO_ROOT_USER=minio_admin \
  -e MINIO_ROOT_PASSWORD=minio_strong!2024 \
  -v /app/minio/data:/data \
  --name object-storage \
  minio/minio server /data --console-address :9001

Triển khai Ứng dụng Java

Thư mục làm việc

/app/java/
├── app.jar
└── config/application.yml

Dockerfile cho Spring Boot

FROM eclipse-temurin:17-jre

WORKDIR /app
COPY app.jar /app/
COPY config /app/config

EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]

Chạy ứng dụng

docker build -t java-app:1.2 . && \
docker run -d -p 8080:8080 \
  -v /app/java/config:/app/config \
  --name app-service java-app:1.2

Thẻ: docker-compose mysql-8.0 nginx-ssl redis-7.0 MinIO

Đăng vào ngày 17 tháng 7 lúc 03:33