Notice
Recent Posts
Recent Comments
Link
관리 메뉴

look-forest

Dockerfile 활용해 이미지 직접 만들기 본문

Infra/Docker

Dockerfile 활용해 이미지 직접 만들기

studyHub 2025. 8. 15. 20:57

Dockerfile이란?

Dockerfile이란 Docker 이미지를 만들게 해주는 파일이다.

 

Dockerfile이라는 걸 활용해서 Docker 이미지를 만들 수 있다. Dockerhub의 이미지들도 누군가 만들어놓은 것이다.

내가 만든 Spring Boot 프로젝트 자체를 Docker 이미지로 만들고 싶을 때에도 Dockerfile을 활용하면 나만의 Docker 이미지를 만들 수 있게 된다.

 

Dockerfile을 기반으로 이미지 만들기

1. Dockerfile이라는 이름으로 파일을 만든다.

2. Dockerfile 문법으로 문서를 작성한다.

3. Dockerfile을 기반으로 이미지를 만든다.

$ docker build -t my-jdk17-server . # Dockerfile의 위치

4. 이미지를 기반으로 컨테이너를 띄운다.

 

종료된 컨테이너에 들어가서 디버깅하고 싶을 때

컨테이너의 특성상 명령어 처리가 다 끝나는대로 컨테이너가 종료된다.

docker exec -it은 실행 중인 컨테이너에만 쓸 수 있는 명령어이다.

FROM openjdk:17-jdk

...

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 500초 동안 시스템을 일시정지 시키는 명령어

위 명령어를 추가함으로써 컨테이너가 바로 종료되는 걸 막을 수 있다. 

그런 뒤에 docker exec -it를 활용해 컨테이너 내부에 직접 들어가서 디버깅을 하면 된다. 


Dockerfile 문법

FROM : 베이스 이미지 생성

FROM은 베이스 이미지를 생성하는 역할을 한다. Docker 컨테이너를 특정 초기 이미지를 기반으로 추가적인 셋팅을 할 수 있다.

# 문법
FROM [이미지명]
FROM [이미지명]:[태그명]

 

 

COPY : 파일 복사(이동)

COPY는 호스트 컴퓨터에 있는 파일을 복사해서 컨테이너로 전달한다.

호스트 컴퓨터의 파일을 이미지 빌드 과정 중에 컨테이너 내부로 복사하는 명령어이다.

# COPY [호스트 컴퓨터에 있는 복사할 파일의 경로] [컨테이너에서 파일이 위치할 경로]
COPY app.txt /app.txt

# 폴더 안에 있는 모든 파일들 복사 (끝에 / 붙이기)
COPY my-app /my-app/

# 와일드 카드 사용
COPY *.txt /text-files/
  • 주의) /text-files라고 적으면 안 되고 /text-files/라고 적어야 text-files라는 디렉토리 안에 파일들이 정상적으로 복사된다. 
  • 특정 파일 또는 폴더만 COPY를 하고 싶지 않을 수 있다. 그럴 때 .dockerignore를 활용한다. 
    .dockerignore 파일에 명시된 파일이나 폴더는 docker build 시 컨텍스트에서 제외되어 이미지에 복사되지 않는다.

ENTRYPOINT : 컨테이너가 시작할 때 실행되는 명령어

ENTRYPOINT는 컨테이너가 생성되고 최초로 실행할 때 수행되는 명령어를 뜻한다. 

쉽게 설명하자면 ENTRYPOINT에는 미니 컴퓨터의 전원을 키고나서 실행시키고 싶은 명령어를 적으면 된다. 

# ENTRYPOINT [명령문...]
# 명령어를 띄어쓰기 기준으로 입력
ENTRYPOINT ["node", "dist/main.js"]

# /bin/bash -c "echo hello"
ENTRYPOINT ["/bin/bash", "-c", "echo hello"]

 

RUN : 이미지를 생성하는 과정에서 사용할 명령문 실행

RUN은 이미지 생성 과정에서 명령어를 실행시켜야 할 때 사용한다. 

이미지 빌드 과정 중 특정 명령(예: 패키지 설치)을 실행하고자 할 때 사용하는 명령어이다.

 

RUN vs ENTRYPOINT

  • RUN은 ‘이미지 생성 과정’에서 필요한 명령어를 실행시킬 때 사용하고, 
  • ENTRYPOINT는 생성된 이미지를 기반으로 컨테이너를 생성한 직후에 명령어를 실행시킬 때 사용한다. 
# RUN [명령문]
RUN npm install


# Dockerfile 예시
FROM ubuntu

RUN apt update && apt install -y git

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]

 

 

WORKDIR : 작업 디렉토리를 지정

WORKDIR으로 작업 디렉터리를 전환하면 그 이후에 등장하는 모든 RUN, CMD, ENTRYPOINT, COPY, ADD 명령문은 해당 디렉터리를 기준으로 실행된다. 작업 디렉터리를 굳이 지정해주는 이유는 컨테이너 내부의 폴더를 깔끔하게 관리하기 위해서이다.

# WORKDIR [작업 디렉토리로 사용할 절대 경로]
WORKDIR /usr/src/app


# /my-dir 하위에 호스트 컴퓨터의 파일이 COPY 된다
FROM ubuntu

WORKDIR /my-dir

COPY ./ ./

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]

 

 

EXPOSE : 컨테이너 내부에서 사용 중인 포트를 문서화하기

EXPOSE는 컨테이너 내부에서 어떤 포트에 프로그램이 실행되는 지를 문서화하는 역할만 한다.

쓰나 안 쓰나 작동하는 방식에는 영향을 미치지 않는다. 

# EXPOSE [포트 번호]
EXPOSE 3000

 


[실습] spring boot 프로젝트를 Docker로 실행시키기

1. 로컬에서 jar를 build.

2. build된 jar를 컨테이너로 옮긴다.

3. 컨테이너를 시작할때 jar를 실행한다.

4. 이미지를 실행한다. (포트 매핑 필요)

이를 Dockerfile로 만들면 아래와 같다.

FROM openjdk:17-jdk

COPY build/libs/*SNAPSHOT.jar app.jar

ENTRYPOINT ["java", "-jar", "/app.jar"]

 

 



참고 자료 & 이미지 출처
비전공자도 이해할 수 있는 Docker 입문·실전