개요
이 가이드는 Docker, Next.js(TypeScript, Tailwind CSS, App Router), 및 Nginx를 사용하여 효율적인 웹 개발 환경을 설정하는 방법을 설명합니다.
Nginx를 리버스 프록시로 활용하며, Next.js 컨테이너는 내부 포트만 사용하고 외부에 노출되지 않도록 설정됩니다.
1. 프로젝트 생성 및 설정
Next.js 애플리케이션 생성
터미널에서 아래 명령어를 실행하여 Next.js 프로젝트를 생성합니다:
npx create-next-app@latest nextjs-app
생성 과정에서 선택해야 하는 값:
√ Would you like to use TypeScript? ... Yes
√ Would you like to use ESLint? ... Yes
√ Would you like to use Tailwind CSS? ... Yes
√ Would you like your code inside a `src/` directory? ... No
√ Would you like to use App Router? (recommended) ... Yes
√ Would you like to use Turbopack for `next dev`? ... Yes
√ Would you like to customize the import alias (`@/*` by default)? ... Yes
√ What import alias would you like configured? ... @/*
디렉토리 구조
프로젝트 생성 후 디렉토리 구조는 아래와 같습니다:
project-root/
├── docker-compose.yml
├── nginx/
│ └── conf.d/
│ │ └── defualt.conf
│ ├── Dockerfile
├── nextjs-app/
│ ├── Dockerfile
│ ├── package.json
│ ├── tsconfig.json
│ ├── tailwind.config.js
│ ├── postcss.config.js
│ ├── next.config.ts
│ ├── app/
│ │ ├── page.tsx
│ └── public/
2. Tailwind CSS 설정 확인
Tailwind CSS는 프로젝트 생성 시 자동으로 구성됩니다.
tailwind.config.js
파일이 다음과 같이 생성됩니다:
import type { Config } from "tailwindcss";
export default {
content: [
"./pages/**/*.{js,ts,jsx,tsx,mdx}",
"./components/**/*.{js,ts,jsx,tsx,mdx}",
"./app/**/*.{js,ts,jsx,tsx,mdx}",
],
theme: {
extend: {
colors: {
background: "var(--background)",
foreground: "var(--foreground)",
},
},
},
plugins: [],
} satisfies Config;
3. Next.js 기본 페이지 작성
app/page.tsx
파일을 작성하여 Tailwind CSS 스타일을 포함한 기본 페이지를 구성합니다:
export default function Home() {
return (
<div className="flex items-center justify-center h-screen bg-gray-100">
<h1 className="text-4xl font-bold text-blue-500">
Welcome to Next.js (TypeScript + Tailwind CSS) with Docker and Nginx!
</h1>
</div>
);
}
4. Next.js 애플리케이션을 독립 실행형으로 배포 설정
Next.js 애플리케이션을 Docker와 같은 컨테이너 환경에 배포하려면, next.config.js
파일에 output: 'standalone'
옵션을 추가해야 합니다.
이 설정을 통해 Next.js는 애플리케이션을 독립 실행형으로 빌드하여 필요한 모든 파일을 포함한 패키지를 생성합니다.
다음과 같이 next.config.js
파일에 추가합니다:
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
/* config options here */
output: 'standalone', // 독립 실행형 배포를 위한 설정
/* 다른 설정들 */
};
export default nextConfig;
이 설정을 적용하면 Docker에서 쉽게 배포할 수 있는 독립적인 실행 환경이 구성됩니다.
5. Next.js Dockerfile 작성
nextjs-app/Dockerfile
파일을 작성하여 Next.js 앱의 Docker 이미지를 정의합니다:
FROM node:18-alpine AS base
# Install dependencies only when needed
FROM base AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
RUN \
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
elif [ -f package-lock.json ]; then npm ci; \
elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \
else echo "Lockfile not found." && exit 1; \
fi
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN \
if [ -f yarn.lock ]; then yarn run build; \
elif [ -f package-lock.json ]; then npm run build; \
elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \
else echo "Lockfile not found." && exit 1; \
fi
FROM base AS runner
WORKDIR /app
ENV NODE_ENV=production
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
RUN mkdir .next
RUN chown nextjs:nodejs .next
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
ENV PORT=3000
CMD ["node", "server.js"]
6. Nginx 설정 파일 작성
nginx/conf.d/default.conf
파일을 작성하여 Nginx를 리버스 프록시로 설정합니다:
server {
listen 80;
location / {
proxy_pass http://nextjs-app:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
7. Nginx Dockerfile 작성
Docker에서 nginx
를 설정할 때, 별도의 volume
을 사용하지 않고 직접 설정 파일을 컨테이너에 복사할 수 있습니다.
이를 위해 Dockerfile
에서 COPY
명령어를 사용하여 로컬의 conf.d
폴더 내 설정 파일들을 Nginx 컨테이너의 /etc/nginx/conf.d/
디렉토리로 복사합니다.
다음과 같이 Dockerfile
에 설정을 추가합니다:
FROM nginx:latest
RUN rm /etc/nginx/conf.d/default.conf
COPY ./conf.d/ /etc/nginx/conf.d/
이렇게 설정하면 nginx
컨테이너는 ./conf.d/
폴더 내의 모든 설정 파일을 자동으로 로드하게 됩니다.
이를 통해 Nginx의 설정을 보다 간편하게 관리할 수 있습니다.
8. docker-compose.yml
작성
루트 디렉토리에 docker-compose.yml
파일을 작성합니다. 이 파일은 Next.js 및 Nginx 컨테이너를 정의하며, Next.js 포트를 외부에 노출하지 않습니다:
version: '3.8'
services:
nextjs-app:
container_name: nextjs-app
build:
context: ./nextjs-app/
dockerfile: Dockerfile
restart: always
networks:
- app-network
nginx:
container_name: nginx
build:
context: ./nginx/
dockerfile: Dockerfile
ports:
- "80:80"
depends_on:
- nextjs-app
networks:
- app-network
networks:
app-network:
9. Docker 환경 실행
Docker 컨테이너를 빌드하고 실행하려면 프로젝트 루트에서 아래 명령어를 실행합니다:
docker-compose up -d --build
10. 애플리케이션 확인
브라우저에서 http://localhost
로 이동하여 애플리케이션이 정상적으로 실행되는지 확인합니다.
Tailwind CSS 스타일이 적용된 페이지가 표시됩니다.

최종 결과
이 가이드는 Next.js (TypeScript + Tailwind CSS, App Router)와 Nginx를 활용한 Docker 기반의 개발 환경 설정 방법을 제공합니다.
Next.js 포트는 외부에 노출되지 않으며, Nginx가 요청을 Next.js 컨테이너로 안전하게 전달합니다.
이 설정은 효율적이고 확장 가능한 애플리케이션 개발을 지원합니다. 🎉
참고자료
- https://nextjs.org/docs/app/getting-started
- https://tailwindcss.com/docs/installation
- https://github.com/vercel/next.js
- https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile