Server & Network/Docker & Kubernetes

[Docker] 도커(docker) 빌드(build) 및 실행(run)하기 - Dockerfile

AustinProd 2023. 2. 12. 22:11

이번 포스트에서 도커를 사용해 이미지를 빌드하고 실행하는 방법을 정리하고자 한다. 본문에서 NodeJS 환경에서 빌드와 실행을 진행한 예제 코드를 소개한다. 여기서, dockerfile이라는 설정 파일을 사용하게 되는데, 파일 내부에서 이미지를 만드는데 필요한 설정값을 작성한다. 자세한 내용은 주석과 함께 작성했다.

 

진행하기 앞서, PC에 도커 데스크탑(Docker Desktop)이 설치되어 있는지 확인하자. 아직 설치하지 않았다면 [ 링크 ]  를  통해 데스크탑용 도커를 미리 설치하도록 하자.

 

* 도커 데스크탑(Docker Desktop)이란?
도커 데스크탑(Docker Desktop)은 로컬에서 이미지를 빌드하고 컨테이너를 만들기 위해 필요한 도커 엔진(Docker Engine)을 사용하게 도와주는 툴이다.

 

도커 데스크탑 ( Docker Desktop ) 실행 화면

 

 

1. 도커 파일 (Dockerfile)

도커 파일(Dockerfile)은 도커 이미지를 생성에 필요한 설정값을 담고 있는 스크립트 파일이다. 내부에 명시된 옵션값에 따라 실행될 컨테이너의 런타임 환경, 의존성 패키지, 실행 명령어가 정의된다.

 

참고
도커 파일의 위치는 워크 스페이스의 루트 경로로 지정한다.

 

아래 코드 블록은 테스트용으로 작성한 도커 파일이다. 옵션은 다음과 같다.

 

  • FROM : 컨테이너 런타임 환경 ( 버전을 명시하지 않으면, 최신 버전을 사용한다. 예, FROM node:14 )
  • WORKDIR : 도커 컨테이너의 워크 스페이스. 스크립트 파일에 명시한 파일이 읽고 쓰여질 경로
  • RUN : 이미지 빌드 시점에 실행할 CLI 명령어 ( 나의 경우 package.json 파일을 읽어 의존성 패키지를 설치하게 했다. )
  • EXPOSE : 컨테이너 실행 시 프로세스 포트
  • CMD : 컨테이너 실행 시 실행 명령어 ( RUN과 실행 시점이 다르다. RUN은 이미지 빌드할 때이다. )

 

 

# ============================================================
#                    Dockerfile 내부 스크립트
# ============================================================

# 실행환경
FROM node

# 도커 컨테이너 Work Directory 
#   - 명령어 실행 Default 경로 설정
WORKDIR /app


# COPY는 일종의 코드 스냅샷과 같음. Build 명령어로 이미지가 만들어졌다면, 수정이 어려움 ( Image = Read-only )
#
# 2개의 경로
#   (1) 이미지화 시킬 파일 경로, 이미지로 만들 때 읽을 파일 경로
#   (2) 도커 내부 이미지 저장 경로 ( root 경로는 권장하지 않음 )
#       - Work Directory를 따로 지정하지 않으면, 명령어는 해당 경로에서 실행
#       - WORKDIR 지정 시, 상대 경로로 사용됨
#
# 빌드 시, Layer 캐싱 활용 (소스코드만 변경될 경우 저장된 캐시 사용)
COPY package.json /app


# 실행 명령어
RUN npm install


# 포트 지정 ( From Isolated System to Local System)
#   - 문서로서 기록 ( 어떤 포트에서 동작하면 좋은지 가이드 용도) > 실제 동작은 하지 않음
#   - docker run -p 3000:80 [ 이미지 ID ]
#   - -p = publish > 로컬 PC와 컨테이너를 연결
EXPOSE 80


# RUN vs CMD
#   - RUN : 이미지 생성 시, 실행
#           문자열 형식
#   - CMD : 이미지로부터 컨테이너 실행 시, 실행 ( 항상 마지막에 명시 )
#           배열 형식
CMD ["node", "server.js"]

 

2. 도커 빌드 ( build )

도커 파일 작성이 끝나면, 터미널에서 빌드 명령어를 입력한다. 빌드 명령어는 docker build [ 도커 파일 경로 ] 다. 아래 코드 블록을 보면, 입력된 5개의 명령어가 순서대로 잘 실행되었음을 확인할 수 있다. 만약, 에러가 터졌다면, 도커 파일 경로나 파일 이름의 문제일 수 있다.

 

* 주의
도커 파일 이름은 Dockerfile 혹은 dockerfile 이다. 철자와 대소문자에 주의하자. 잘못된 예시로 파일이름으로 docker_file, dockerFile 이라고 명시하면 에러가 발생한다.

 

 

# 빌드 명령어 ( 워크 스페이스 루트 경로에서 실행 )
docker build .

# 빌드 로그
[+] Building 20.7s (10/10) FINISHED                                                                                                              
 => [internal] load build definition from Dockerfile                                                                                       
 => => transferring dockerfile: 167B                                                                                                       
 => [internal] load metadata for docker.io/library/node:14                                                                                 
 => [1/5] FROM docker.io/library/node:14@sha256:eb709cd9ccbc70f194353d7f4227c52406a9dc671                           
 => [2/5] WORKDIR /app
 => [3/5] COPY package.json .
 => [4/5] RUN npm install
 => [5/5] COPY package.json /app
 => exporting to image
 => => exporting layers
 => => writing image sha256:19d66bf50e255c52f66bbd405403ef6233ad8f894be212

 

3. 도커 실행 ( run ) - 컨테이너 생성 및 실행

실행 명령어는 docker run [포트]:[포트] [이미지 ID] 이다. 자세한 내용은 주석을 참고하면 된다. run 명령어는 이미지를 읽고, 컨테이너 생성 및 실행을 진행한다.

 

# 도커 실행
#   - 로컬 PC에서 읽을 포트
#   - 컨테이너 내부 실행 포트
#   - 생성된 이미지 ID ( 빌드 로그 제일 마지막에 sha256 이라는 키워드가 붙여 표기된 값 )
docuer run -p [Local Port]:[Process Port in Container] [ Image ID ]

# 도커 실행 명령어 예제
#   - 컨테이너 실행 포트 = 80
#   - 로컬 PC에서 읽을 포트 = 3000
#   - 도커 이미지 ID = 19d66bf50e2 ( 모든 ID를 입력하지 않고, 앞자리 몇개만 입력해도된다. )
docuer run -p 3000:80 19d66bf50e2

 

* 참고
docker run과 docker start 명령어의 차이점은 컨테이너 생성 유무에 있다. run은 컨테이너 생성과 실행을 함께 진행하고, start는 이미 생성된(하지만, 실행이 중지된) 컨테이너를 실행시킨다.

 

4. 실행 확인 ( ps )

실행 중인 컨테이너 목록을 확인하는 방법은 두 가지가 있다. 터미널에서 확인하는 방법과 도커 데스크탑을 사용하는 방법이다. GUI를 선호한다면 데스크탑 앱이 더 편할 것이다.

 

# 도커 실행 목록 ( 실행중인 컨테이너를 확인할 수 있다. )
docker ps

CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                    NAMES
c500aaa38916   19d66bf50e2   "docker-entrypoint.s…"   57 seconds ago   Up 57 seconds   0.0.0.0:3000->80/tcp   vigorous_feynman

 

도커 데스크탑에서 확인한 실행 컨테이너 목록

5. 실행 종료 ( stop )

종료 역시 CLI나 데스크탑 앱 모두 가능하다. 만약, CLI 환경에서 진행한다면, 실행과 다르게 이미지 ID가 아닌 컨테이너 이름을 옵션으로 전달해줘야 한다.

 

* 참고
컨테이너 이름은 이미지 실행 시점에 따로 지정해주지 않았다면, 도커 엔진이 랜덤하게 생성한다.

 

# 컨테이너 실행 종료
#   - ps 명령어에서 확인한 NAME 항목 입력
docker stop vigorous_feynman