Docker
컨테이너 기술을 제공하는 컨테이너 런타임 기술 중 하나로, 컨테이너를 생성하고, 컨테이너에 자신만의 표준화된 실행 환경을 구성할 수 있다. 컨테이너 엔진(Container Engine)인 Docker Engine을 통해 호스트 운영체제(Host OS)의 커널을 공유하여 CPU나 메모리 등의 자원을 격리한 가상의 공간인 '컨테이너(Container)'를 생성한다.
따라서 Docker로 컨테이너화된 애플리케이션은 어느 환경에서든 똑같이 실행된다.
여기서 컨테이너(Container)란?
도커 이미지로부터 만들어진 실행 중인 인스턴스로, 독립된 환경에서 애플리케이션이 동작하도록 한다. 애플리케이션의 소스 코드 및 Application이 동작하는 운영 체제(OS) 및 라이브러리, 종속 항목(Dependancy) 등을 조합한 것을 말한다.
1. Dockerfile 생성
멀티 스테이지 빌드 구조로 Dockerfile을 작성했다.
FROM node:18-alpine AS builder
RUN apk add --no-cache libc6-compat
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build
# 2단계: 실행 단계 (production 모드)
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app ./
ENV NODE_ENV=production
# Next.js가 외부 접근 가능하도록 0.0.0.0에 바인딩
EXPOSE 3000
CMD ["npx", "next", "start", "-p", "3000", "-H", "0.0.0.0"]
빌드 단계
nextJS 앱 빌드 컨테이너
FROM node:18-alpine AS builder # 가볍고 빠른 Alpine Linux 기반 이미지 사용
RUN apk add --no-cache libc6-compat # 라이브러리 호환성을 확보를 위해 사용
WORKDIR /app # 이후 명령어의 실행 디렉토리를 /app으로 설정
# 패키지 의존성 복사 및 설치
COPY package.json package-lock.json ./
RUN npm install
# 프로젝트의 전체 파일을 컨테이너의 /app에 복사
COPY . .
# Next.js 프로젝트를 빌드
RUN npm run build
실행 단계
런타임 전용 컨테이너
# 새 이미지 사용
FROM node:18-alpine
# 작업 디렉토리 지정
WORKDIR /app
# 빌더 컨테이너에서 /app 전체 내용을 복사
COPY --from=builder /app ./
# Node.js가 프로덕션 모드로 실행되도록 설정. devdependency 무시하게 됨.
ENV NODE_ENV=production
# 3000 포트에서 요청을 받음
EXPOSE 3000
# 컨테이너가 시작될 때 실행할 명령어
CMD ["npx", "next", "start", "-p", "3000", "-H", "0.0.0.0"]
멀티 스테이지 빌드 구조란?
하나의 Dockerfile 안에서 여러 개의 FROM 절을 사용하는 방식
- 첫 번째 스테이지에서는 빌드만 전담
- 마지막 스테이지에서는 실행에 필요한 파일만 복사해서 최종 이미지를 만듦
목적은 간단하다.
불필요한 빌드 툴, 테스트 파일, dev dependencies를 런타임 이미지에 포함하지 않기 위해서!
2. dockerignore 생성
불필요한 파일 복사를 막기 위해 dockerignore를 생성한다.
node_modules
.next
Dockerfile
.dockerignore
.git
.gitignore
README.md
3. 빌드 및 실행
docker build -t front-woori-design-web .
docker run -d -p 8080:3000 --name woori-next front-woori-design-web
🔗 참고자료
http://nextjs.org/docs/app/building-your-application/deploying#docker-image
728x90