본문 바로가기
카테고리 없음

Dockerfile은 무엇이고 왜 필요할까

by by_merry 2026. 4. 26.

Docker를 공부하다 보면 어느 순간 이미지와 컨테이너는 어느 정도 이해가 된다. 그런데 그다음에 꼭 나오는 것이 하나 있다. 바로 Dockerfile이다.

처음 보면 그냥 텍스트 몇 줄 적어놓은 파일처럼 보인다. 그래서 “이게 그렇게 중요한가?” 싶을 수 있다. 나도 처음에는 그냥 명령어 모아놓은 메모장 같은 건 줄 알았다.

그런데 Docker를 조금만 더 써보면 금방 알게 된다. Dockerfile은 단순한 메모장이 아니라, Docker 이미지를 만드는 공식 설명서 같은 존재다.

쉽게 말하면 Docker 이미지가 ‘설계도’라면, Dockerfile은 그 설계도를 글로 적어놓은 제작 방법서다.

 

Dockerfile은 정확히 무엇일까

Dockerfile은 Docker 이미지를 만들기 위해 필요한 내용을 적어놓은 파일이다.

예를 들어:

  • 어떤 운영체제를 바탕으로 할지
  • 어떤 프로그램을 설치할지
  • 어떤 파일을 복사할지
  • 어떤 명령어로 실행할지

를 차례대로 적는다.

즉, Dockerfile은 “이 컨테이너를 어떻게 만들 것인가”를 한 줄씩 설명하는 파일이다.

예를 들어 아주 간단한 Dockerfile은 이런 식으로 생긴다.

FROM node:18
WORKDIR /app
COPY . .
RUN npm install
CMD ["node", "server.js"]

이걸 보면 대충 이런 뜻이다.

  • Node.js 18이 들어 있는 이미지를 바탕으로 하고
  • 작업 폴더를 /app으로 정하고
  • 현재 파일들을 복사한 뒤
  • npm install을 실행하고
  • 마지막에 server.js를 실행한다

즉, 사람이 직접 하나하나 설치하지 않아도 Docker가 이 파일을 읽고 자동으로 이미지를 만들어준다.

왜 Dockerfile이 필요할까

처음에는 “그냥 docker run으로 실행하면 되는 거 아니야?”라는 생각이 들 수 있다. 실제로 Nginx나 MySQL처럼 이미 준비된 이미지는 바로 실행할 수 있다.

하지만 내가 만든 프로그램을 Docker로 실행하려면 이야기가 달라진다.

예를 들어 Node.js 웹서버를 Docker로 실행하고 싶다면:

  • 어떤 Node 버전을 쓸지
  • 어떤 파일을 넣을지
  • 어떤 패키지를 설치할지
  • 실행 명령어는 무엇인지

를 Docker에게 알려줘야 한다.

그 역할을 하는 것이 Dockerfile이다.

즉, Dockerfile이 없으면 “내 프로그램을 어떤 환경에서 어떻게 실행해야 하는지”를 자동으로 재현하기가 어렵다.

Dockerfile이 있으면 무엇이 편해질까

Dockerfile의 가장 큰 장점은 같은 환경을 언제든 다시 만들 수 있다는 점이다.

예를 들어 내가 노트북에서 만든 서버를 다른 사람 컴퓨터에서도 똑같이 실행하고 싶다고 해보자.

Dockerfile이 없으면 이렇게 해야 할 수도 있다.

  • Node.js 18 설치하세요
  • npm install 하세요
  • 환경변수도 맞추세요
  • 실행은 node server.js 하세요

이 과정에서 버전이 다르거나, 한 단계를 빼먹으면 오류가 생길 수 있다.

하지만 Dockerfile이 있으면:

  • 그 파일 그대로 이미지를 만들고
  • 컨테이너를 실행하면
  • 어디서든 거의 같은 환경이 만들어진다

그래서 개발 환경, 테스트 환경, 운영 서버를 훨씬 쉽게 맞출 수 있다.

개발할 때 왜 특히 중요할까

프로그래밍을 하다 보면 정말 자주 나오는 문제가 있다.

“내 컴퓨터에서는 잘 되는데 서버에서는 안 됨”

이 문제는 대부분 환경이 다르기 때문에 생긴다.

예를 들어 내 컴퓨터는 Node.js 18인데, 서버는 Node.js 16이면 같은 코드여도 문제가 생길 수 있다.

그런데 Dockerfile을 사용하면 아예 처음부터 “무조건 Node.js 18을 써라”라고 고정할 수 있다.

그래서 환경 차이 때문에 생기는 오류를 크게 줄일 수 있다.

나도 처음에는 Docker를 그냥 실행 도구 정도로만 생각했다. 그런데 Dockerfile을 써보고 나서야 “아, 진짜 중요한 건 컨테이너를 만드는 과정 자체를 기록하는 거구나”라는 걸 알게 됐다.

Dockerfile은 결국 자동 설치 스크립트와 비슷하다

Dockerfile을 가장 쉽게 이해하는 방법은 “자동 설치 설명서”라고 생각하는 것이다.

원래 서버를 직접 세팅하려면:

  • 운영체제 정하고
  • 프로그램 설치하고
  • 파일 복사하고
  • 실행 명령어를 입력해야 한다

그런데 Dockerfile은 그 과정을 전부 적어두고, Docker가 대신 실행하게 만든다.

그래서 사람이 매번 반복 작업을 하지 않아도 된다.

즉, Dockerfile은 단순한 설정 파일이 아니라 “이 서버를 만드는 과정을 통째로 저장한 파일”에 가깝다.

Dockerfile에서 자주 보는 명령어들

Dockerfile은 보통 몇 가지 기본 명령어만 알아도 흐름을 이해할 수 있다.

명령어 역할
FROM 기본이 되는 이미지 선택
WORKDIR 작업할 폴더 지정
COPY 파일 복사
RUN 설치 명령 실행
CMD 컨테이너 시작 시 실행할 명령어

예를 들어:

FROM python:3.11
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

이 Dockerfile은 Python 3.11 환경에서 앱 파일을 복사하고, 필요한 패키지를 설치한 뒤, app.py를 실행하라는 뜻이다.

즉, Dockerfile만 읽어도 이 컨테이너가 어떻게 만들어지는지 대충 보인다.

Dockerfile과 이미지는 어떤 관계일까

이 부분이 가장 중요하다.

흐름은 보통 이렇게 된다.

Dockerfile 작성 → 이미지 생성 → 컨테이너 실행

즉:

  • Dockerfile = 만드는 방법
  • Image = 만들어진 결과물
  • Container = 그 결과물을 실제로 실행한 상태

이다.

쉽게 비유하면:

  • Dockerfile = 레시피
  • Image = 완성된 밀키트
  • Container = 실제로 요리해서 먹는 상태

라고 생각하면 꽤 이해가 쉽다.

그럼 Dockerfile 없이 이미지를 만들 수는 없을까

아예 불가능한 것은 아니다. 이미 실행 중인 컨테이너를 저장해서 이미지처럼 만들 수도 있다.

하지만 그렇게 하면:

  • 어떻게 만들었는지 기록이 잘 안 남고
  • 다른 사람이 보기 어렵고
  • 다시 수정하거나 재현하기가 불편하다

그래서 실제 개발이나 운영에서는 거의 항상 Dockerfile을 사용한다.

즉, Dockerfile은 단순히 편한 정도가 아니라, 이미지를 관리 가능하게 만들어주는 핵심 도구라고 봐도 된다.

한 줄로 정리하면

Dockerfile은 Docker 이미지를 만들기 위한 설명서다. 어떤 환경에서, 어떤 파일과 프로그램을 넣고, 어떻게 실행할지를 기록해두기 때문에 어디서든 같은 컨테이너를 다시 만들 수 있게 해준다.