Các Dockerfile Phổ Biến Cho Nhiều Dự Án Khác Nhau

Docker là một công cụ ảo hóa nhẹ giúp phát triển, triển khai và chạy ứng dụng trong các container. Nó cho phép bạn đóng gói ứng dụng và tất cả các phụ thuộc của nó vào một container duy nhất, giúp dễ dàng triển khai trên bất kỳ môi trường nào mà không cần lo lắng về sự khác biệt giữa các môi trường.

Đây là một số Dockerfile cho các dự án thường gặp, bạn có thể tham khảo và điều chỉnh theo nhu cầu của mình.

Nội dung bài viết được tổng hợp và tích góp từ nhiều nguồn khác nhau, bao gồm cả các dự án thực tế mà mình đã làm.

Dockerfile cho Node.js

Dockerfile cho Node.js rất quan trọng khi triển khai ứng dụng JavaScript phía server. Đây là một Dockerfile đã được tối ưu cho một dự án Node.js điển hình:

# Stage 1: Build
FROM node:18-alpine AS build

WORKDIR /app
COPY package*.json ./

RUN npm ci --only=production

COPY . .

RUN npm run build

# Stage 2: Run
FROM node:18-alpine

WORKDIR /app
COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app .

ENV NODE_ENV=production
ENV PORT=3000

EXPOSE 3000
CMD ["node", "server.js"]

Cách 2, sử dụng pm2. Về cơ bản thì cách này nhẹ hơn kha khá so với npm

# Stage 1: Build
FROM node:18-alpine AS build

WORKDIR /app

COPY package*.json ./

RUN npm ci --only=production

COPY . .

RUN npm run build

# Stage 2: Run
FROM node:18-alpine

RUN npm install -g pm2

WORKDIR /app
COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app .

ENV NODE_ENV=production
ENV PORT=3000

EXPOSE 3000
CMD ["pm2-runtime", "start", "server.js"]

Dockerfile NodeJS (NestJS)

# Stage 1: Build
FROM node:18-alpine AS build

WORKDIR /app

COPY package*.json ./

RUN npm ci

COPY . .

RUN npm run build

# Stage 2: Run
FROM node:18-alpine

WORKDIR /app

COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/dist ./dist

EXPOSE 3000
CMD ["node", "dist/main"]

Dockerfile NodeJS (Express.js)

# Stage 1: Build
FROM node:18-alpine AS build

WORKDIR /app

COPY package*.json ./

RUN npm ci

COPY . .

# Stage 2: Run
FROM node:18-alpine

WORKDIR /app

COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app .

EXPOSE 3000
CMD ["node", "index.js"]

Dockerfile ReactJs

Có thể sử dụng Dockerfile này cho các dự án như Vue, Angular,...

Lưu ý: ở đây thư mục chứa nginx/nginx.conf đặt cùng cấp với Dockerfile

# Stage 1: Build
FROM node:18-alpine AS build
WORKDIR /app

COPY package*.json ./

RUN npm ci

COPY . .

RUN npm run build

# Stage 2: Run
FROM nginx:alpine

COPY --from=build /app/build /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 3000
CMD ["nginx", "-g", "daemon off;"]

Dockerfile cho PHP với Laravel

Lưu ý: thư mục conf/nginx.confconf/supervisord.conf cùng cấp với Dockerfile

# Stage 1: Composer Dependencies
FROM composer:2 AS composer

WORKDIR /app
COPY composer.json composer.lock ./

RUN composer install --no-dev --optimize-autoloader --no-interaction

# Stage 2: Build
FROM php:8.2-fpm-alpine AS php

WORKDIR /var/www/html
COPY --from=composer /app/vendor ./vendor
COPY . .

RUN apk add --no-cache \
        libzip-dev \
        libpng-dev \
        libjpeg-turbo-dev \
        freetype-dev \
        && docker-php-ext-configure gd --with-freetype --with-jpeg \
        && docker-php-ext-install -j$(nproc) gd pdo_mysql zip opcache

RUN { \
        echo 'opcache.enable=1'; \
        echo 'opcache.revalidate_freq=0'; \
        echo 'opcache.validate_timestamps=1'; \
        echo 'opcache.max_accelerated_files=10000'; \
        echo 'opcache.memory_consumption=192'; \
        echo 'opcache.max_wasted_percentage=10'; \
        echo 'opcache.interned_strings_buffer=16'; \
        echo 'opcache.fast_shutdown=1'; \
    } > /usr/local/etc/php/conf.d/opcache-recommended.ini

RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache

# Stage 3: Nginx và Supervisord
FROM nginx:alpine AS nginx

WORKDIR /var/www/html
COPY --from=php /var/www/html /var/www/html
COPY conf/nginx.conf /etc/nginx/conf.d/default.conf

RUN apk add --no-cache supervisor

COPY conf/supervisord.conf /etc/supervisor/conf.d/supervisord.conf

EXPOSE 80
CMD ["supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

Dockerfile cho NextJs

# Stage 1: Build
FROM node:18-alpine AS build

WORKDIR /app
COPY package*.json ./

RUN npm ci

COPY . .

RUN npm run build

# Stage 2: Run
FROM node:18-alpine

WORKDIR /app
COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app .

ENV NODE_ENV=production
ENV PORT=3000

EXPOSE 3000
CMD ["npm", "start"]

Đang cập nhật...

Nếu bạn có các cấu hình hoặc Dockerfile khác muốn chia sẻ, vui lòng gửi email về [email protected]. Mình rất trân trọng điều đó.