[도커(Docker)] Next.js 프로젝트 도커 설치부터 이미지 파일 생성까지

2024. 8. 1. 16:18클라이언트/웹 기술

1개월 인턴 진행 중 백엔드에서 배포를 진행하기로 했는데 프론트에서 도커 이미지 파일을 생성해서 주어야 한다는 답변을 받았다. 그래서 그 과정을 기록하려고 한다.

 

1. 도커 설치 (Windows 기준)

https://www.docker.com/products/docker-desktop/

 

Docker Desktop: The #1 Containerization Tool for Developers | Docker

Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today on Mac, Windows, or Linux.

www.docker.com

링크 접속 후 다운을 받는다.

 

2. powershell 설정하기

관리자 권한으로 powershell을 실행한다.

아래 명령어를 각각 차례로 입력한다. 

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

wsl --set-default-version 2

 

+ https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

링크를 눌러 패키지를 설치해 WSL2로 업그레이드하고 재부팅.

 

 

3. docker 실행을 한다. 그럼 WSL error가 반겨준다.

Docker Desktop - Unexpected WSL error
deploying WSL2 distributions
ensuring main distro is deployed: deploying "docker-desktop": importing WSL distro
"WSL2는 현재 컴퓨터 구성에서 지원되지 않습니다.\r\n"가상 머신 플랫폼" 선택적 구성 요소를 사용하도록 설정하고
BIOS에서 가상화가 사용하도록 설정되어 있는지 확인하세요.\r\n실행하여 "가상 머신 플랫폼"을 사용하도록 설정: 
wsl.exe --install --no-distribution\r\n자세한 내용은 https://aka.ms/enablevirtualization 
참조하세요.\r\nError code: Wsl/Service/RegisterDistro/CreateVm/HCS/HCS_E_HYPERV_NOT_INSTALLED\r\n" 
output="docker-desktop": exit code: 4294967295: running WSL command wsl.exe 
C:\Windows\System32\wsl.exe --import docker-desktop <HOME>\AppData\Local\Docker\wsl\main 
C:\Program Files\Docker\Docker\resources\wsl\wsl-bootstrap.tar --version 2: WSL2는 현재 컴퓨터 구성에서 지원되지 않습니다.
"가상 머신 플랫폼" 선택적 구성 요소를 사용하도록 설정하고 BIOS에서 가상화가 사용하도록 
설정되어 있는지 확인하세요.
실행하여 "가상 머신 플랫폼"을 사용하도록 설정: wsl.exe --install --no-distribution
자세한 내용은 https://aka.ms/enablevirtualization 참조하세요.
Error code: Wsl/Service/RegisterDistro/CreateVm/HCS/HCS_E_HYPERV_NOT_INSTALLED
: exit status 0xffffffff
checking if isocache exists: CreateFile \wsl$\docker-desktop-data\isocache: The network name cannot be found.

 

4. error해결

  • 첫 번째 방법
    • windows기능 켜기/끄기 검색 후 실행
    • Linux용 Windows 하위 시스템 기능 켜기
    • 가상 머신 플랫폼 기능 켜기
    • Hyper-V기능 켜기 (윈도우 버전에 따라 없을 수 있음.)
  • 두 번째 방법
    • window 재부팅 후 DEL 또는 F12 연타를 해서 BIOS모드에 진입한다.
    • pc마다 다르지만
    • Intel (VMX) Virtualization Technology 혹은 svm mode 켜기(제조사마다 다를 수 있다.)
나는 virtual까지만 검색했다. 대충 가상환경 기능 실행 같은 문구면 켜주면 되는 것 같다.
위의 과정을 거치고 재부팅 한번 더 해준다.

 

5. 드디어 docker 실행

이제 이미지 파일을 생성할 프로젝트에 도커 코드를 작성한다.

 

  • root에 Dockerfile 생성
// Dockerfile
# 1. 베이스 이미지 설정 (Node.js 18 사용)
FROM node:18-alpine

# 2. 작업 디렉토리를 설정
WORKDIR /app

# 3. 의존성 파일을 복사하고 설치
COPY package.json yarn.lock ./
RUN yarn

# 4. 환경 변수 파일을 복사 or env를 compose로 했을 경우는 제외
COPY .env.local .env.local

# 4. 나머지 프로젝트 파일을 복사
COPY . .

# 5. start.sh 파일 복사 및 실행 권한 부여
COPY start.sh /app/start.sh
RUN chmod +x /app/start.sh

# 6. 빌드
RUN yarn build

# 7. 포트 설정
EXPOSE 3000 4000

# 8. 애플리케이션 시작 명령어 설정
CMD ["/app/start.sh"]

 

현재 프로젝트는 json-server를 사용했기 때문에 pakage.json/script에 추가한 yarn server 명령어를 같이 실행 하고 3000번과 4000번 포트를 두 개 띄워야 하는 상황이므로 CMD를 따로 설정해 주었다.

 

  • root에 start.sh 파일 생성
    여기서 app 시작 명령어를 커스텀할 수 있다.
//start.sh
# json-server 실행 (예: db.json이 데이터베이스 파일인 경우)
yarn server &

# 애플리케이션 서버 실행 (yarn start)
yarn start

 

  • root에 .dockerignore파일 생성

.gitignore와 같이 docker파일 생성에 포함시키지 않을 파일들을 지정해 준다.

//.dockerignore
node_modules
.env.local
yarn-debug.log*
yarn-error.log*
.vercel
*.tsbuildinfo
next-env.d.ts

 

  • root에 docker-compose.yml 파일 생성

.env파일을 도커 이미지 파일에 포함시키지 않기 위해 설정을 해준다.

//docker-compose.yml
version: '3'
services:
  app:
    image: your-image-name
    build: .
    ports:
      - "3000:3000"
      - "4000:4000"
    env_file:
      - .env

 

6. docker 이미지 생성

이제 이미지 생성 후 컨테이너를 실행하여 잘 동작하는지 확인하면 된다.

터미널에 아래 명령어 입력.

// 이미지 생성
docker build -t your-image-name .
// 컨테이너 실행
docker-compose up

 

 

생성된 도커 이미지 파일을 저장소에 push 하기
//터미널
docker tag <image 이름> <url>/ 원하는 이름
docker login <url> 해서 저장소 로그인
docker push <url>/ 1번에서 url뒤에 쓴 이름