[Infra] Docker로 local에서 Next.js 실행하기

Hoon·2023년 9월 20일
0

Infra

목록 보기
9/10
post-thumbnail

Docker : Container 기반의 오픈소스 가상화 플랫폼으로 소프트웨어를 Container 라는 표준화된 유닛으로 패키징하며, Container 에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다.

  • Docker 를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있다.

Docker Image : Docker 에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶은 형태.

  • 특정 프로세스를 실행하기 위한(컨테이너 생성, 실행에 필요한) 모든 파일과 설정값(환경)을 지닌 것 (더 이상의 의존성 파일을 컴파일하거나 설치할 필요 없는 상태의 파일)

Layer : 기존 이미지에 추가적인 파일이 필요할 때 다시 다운로드 받는 방법이 아닌 해당 파일을 추가하기 위한 개념

  • docker run <image> 를 통해 이미지로 컨테이너를 생성하면 기존의 이미지 레이어들 위해 layer 가 생성된다. (commit 할 때마다 새로운 내용을 레이어에 쌓아감)
  • 기존 이미지의 layerRead-Only, 기존 layer 위에 새로 생성된 layerRead-Write 이다.

Dockerfile : Docker Image 를 생성하기 위한 스크립트.

  • Dockerfile 을 작성해서 빌드 하게되면, DockerDockerfile 에 적힌 명령어들을 차례대로 실행하여 Docker Image 를 생성한다.

Container : Docker Image 를 실행한 상태로, 응용프로그램의 종속성과 함께 응용프로그램 자체를 패키징 하여 격리된 공간에서 프로세스를 동작 시키는 기술이다.


Dockerfile

먼저, Docker Image 생성을 위해 아래와 같이 Dockerfile 을 작성해준다.

# 가져올 이미지를 정의
FROM node:20.5.0-alpine

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

# 종속성 파일 복사
COPY package.json .
COPY yarn.lock .

# 종속성 설치
RUN yarn install

# 현재 디렉토리의 모든 파일을 도커 컨테이너의 워킹 디렉토리에 복사
COPY . .

# Build
RUN yarn build

# 3000번 포트 노출 (docker run -p 를 해줘야 의미가있음, 사실상 명시의 의미)
EXPOSE 3000

# 컨테이너 실행 시 실행될 명령 설정
CMD ["yarn", "start"]

그리고 .dockerignore 도 작성해준다.

// .dockerignore
node_modules
.next

Docker Try

이제 아래의 명령어를 통해 Docker Image 를 생성해준다.

$ docker build -t [Docker Image 이름:태그] .

아래의 명령어를 통해 생성된 Docker Image 를 확인할 수 있다.

$ docker images

이제 Docker 를 실행할 수 있다.

$ docker run -d -p 3000:3000 [실행할 Docker Image 이름]
  • -d : Container 를 백그라운드에서 실행

  • -p : 호스트와 컨테이너의 포트를 연결. <호스트 포트>:<컨테이너 포트>

3000 Port 로 접속시 프로젝트가 돌아가는 것을 확인할 수 있다.


Docker 명령어

$ docker images // 이미지 확인

$ docker ps // 동작중인 컨테이너 확인
$ docker ps -a // 모든 컨테이너 확인

$ docker start [컨테이너ID 또는 컨테이너명] // 컨테이너 실행
$ docker stop [컨테이너ID 또는 컨테이너명] // 컨테이너 종료

$ docker rm (-f 강제삭제) [컨테이너ID 또는 컨테이너명] // 컨테이너 삭제
$ docker rmi (-f 강제삭제) [이미지ID 또는 이미지명] // 이미지 삭제

$ docker exec -it [컨테이너ID] sh // 컨테이너 접속
profile
4년차 개발자 Hoon입니다

0개의 댓글