Search

[Docker] Dockerfile이란?

Docker의 핵심 기능 중 하나인 Dockerfile에 대해서 정리해 보면서 내가 만든 간단한 Spring Boot 프로젝트를 이미지화 해서 컨테이너에 띄어보는 것 까지 실습을 해보도록 하겠다.

Dockerfile 정리

Dockerfile이란?

컨테이너를 만들기 위한 설계도를 이미지라고 했다면, 이미지를 만들기 위한 파일이 Dockerfile이다.
Dockerfile 👉 이미지 생성 👉 이미지로 컨테이너 실행
Bash
복사
Dockerfile에서는 어떤 OS를 기반으로 이미지를 만들지, 해당 이미지로 컨테이너를 실행한 뒤 어떤 명령어를 실행할지 등의 설정이 가능하다.

Dockerfile의 기본 구조

# 1. 어떤 OS나 이미지 기반으로 만들건지 FROM node:18 # 2. 작성자 정보 (선택) LABEL maintainer="hong@gmail.com" # 3. 컨테이너 안에 코드 복사 COPY . /app # 4. 현재 디렉토리 설정 WORKDIR /app # 5. 패키지 설치 등 명령 실행 RUN npm install # 6. 컨테이너 시작 시 실행할 명령어 ENTRYPOINT ["npm", "start"]
Docker
복사

Dockerfile의 주요 명령어

FROM : 기반으로 할 이미지 지정 ( ex. jdk, nginx, tomcat … )
LABEL : 메타 데이터 ( 작성자, 설명 등 … ) ( 선택사항 )
WORKDIR : 컨테이너 내의 작업 디렉토리 설정
COPY : 호스트의 파일 or 디렉토리 → 컨테이너로 복사
RUN : 컨테이너 생성 중 실행할 명령어
ENV : 환경 변수 설정
ENTRYPOINT : 컨테이너 생성 후 실행할 명령어
참고사항
1.
RUN vs ENTRYPOINT
RUN은 이미지를 만들 때 실행되는 명령어이고, ENTRYPOINT 는 컨테이너가 다 올라온 뒤 실행시키고 싶은 명령어 이다.
2.
RUN할 때 여러 명령어를 사용하고 싶으면?
RUN apt update && apt install … 처럼 &&로 연결해서 사용하면 된다.

이미지 빌드 및 실행

(상세한 이미지 빌드 방법과 실행은 아래 내가 만든 Spring Boot 프로젝트 이미지를 만들면서 다시 한번 보도록 하겠다.)
1.
이미지 만들기
$ docker build -t my-app .
Bash
복사
-t my-app : 이미지의 이름을 my-app으로 지정
. : 현재 경로에서 Dockerfile을 찾겠다는 의미
2.
생성된 이미지 확인
$ docker image ls
Bash
복사
3.
컨테이너 실행
$ docker run -p 8080:8080 my-app
Bash
복사

Spring Boot 프로젝트 이미지 빌드 및 컨테이너 기동 실습

Spring Boot 프로젝트 build

1.
아래와 같이 / 로 접근 시 Hello Spring Boot라는 메시지를 보여주는 컨트롤러가 존재하는 프로젝트를 생성한 뒤 프로젝트를 build하여 jar파일을 생성한다.
2.
최상위 디렉토리에 Dockerfile 이라는 이름으로 파일을 생성한 뒤 내용을 작성한다. 최소한의 테스트를 위해 아래와 같이 작성했다.
FROM openjdk:17-jdk : jdk17을 기본 베이스로 이미지를 생성한다.
COPY build/libs/demo-0.0.1-SNAPSHOT.jar /app.jar : 빌드 된 jar 파일을 /app.jar 로 COPY한다.
ENTRYPOINT ["java", "-jar", "/app.jar"] : java -jar /app.jar 명령어를 실행시켜 프로젝트를 실행한다.

이미지 생성

인텔리제이 터미널을 켜서 docker build -t my-app . 명령어를 실행시켜 이미지를 생성한다.
docker image ls 로 이미지 목록을 확인해 보면 내가 생성한 이미지가 있는 것을 확인할 수 있다.

컨테이너 기동 후 접속 확인

docker run -p 8080:8080 my-app 으로 내가 만든 이미지로 컨테이너를 실행시켰다.
이후 localhost:8080으로 접근 시 아래와 같이 정상 동작 하는 모습을 확인 할 수 있다.

Reference