Docker
:Container
기반의 오픈소스 가상화 플랫폼으로 소프트웨어를Container
라는 표준화된 유닛으로 패키징하며,Container
에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다.
Docker
를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있다.Docker Image
: Docker
에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶은 형태.
Layer
: 기존 이미지에 추가적인 파일이 필요할 때 다시 다운로드 받는 방법이 아닌 해당 파일을 추가하기 위한 개념
docker run <image>
를 통해 이미지로 컨테이너를 생성하면 기존의 이미지 레이어들 위해 layer
가 생성된다. (commit 할 때마다 새로운 내용을 레이어에 쌓아감)layer
는 Read-Only
, 기존 layer
위에 새로 생성된 layer
는 Read-Write
이다.Dockerfile
: Docker Image
를 생성하기 위한 스크립트.
Dockerfile
을 작성해서 빌드 하게되면, Docker
가 Dockerfile
에 적힌 명령어들을 차례대로 실행하여 Docker Image
를 생성한다.Container
: Docker Image
를 실행한 상태로, 응용프로그램의 종속성과 함께 응용프로그램 자체를 패키징
하여 격리된 공간에서 프로세스를 동작 시키는 기술이다.
먼저, 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 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 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 // 컨테이너 접속