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.
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.conf và conf/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 đó.