MMeshOps
Docker와 Docker Compose: 개발 환경을 하나로 통일하는 도구
4예상 8입문

나만의 도커 레시피: Dockerfile 이해하기

내 소스 코드를 도커 이미지로 굽기 위해 필요한 레시피 파일인 Dockerfile의 기본 명령어들을 학습합니다.

이전 에피소드에서 '도커 이미지'는 붕어빵 틀과 같다고 배웠습니다. 그렇다면 나만의 소스 코드가 담긴 나만의 붕어빵 틀(이미지)은 도대체 어떻게 만드는 걸까요? 이때 필요한 것이 바로 Dockerfile입니다. Dockerfile은 내 컴퓨터에 있는 파일들을 어떤 순서로 어떻게 조합해서 도커 이미지로 구워낼지 적어두는 레시피(요리법) 문서입니다. 이번 에피소드에서는 이 레시피를 작성하는 핵심 문법들을 알아보고, 간단한 Dockerfile을 직접 읽어보는 방법을 배웁니다.

Dockerfile이란 무엇인가?

Dockerfile은 확장자가 없는 단순한 텍스트 파일입니다. (파일 이름이 정확히 `Dockerfile`이어야 합니다.) 이 파일 안에는 위에서부터 아래로 한 줄씩, 도커 엔진이 순서대로 실행해야 할 명령들이 적혀 있습니다.

이미지를 만드는 레시피

요리를 할 때 "1. 냄비에 물을 붓는다. 2. 라면을 넣는다. 3. 3분간 끓인다."와 같은 순서가 있듯이, Dockerfile에도 "1. 리눅스 환경을 준비한다. 2. 파이썬을 설치한다. 3. 내 소스 코드를 복사한다. 4. 프로그램을 실행한다."라는 순서가 기록됩니다. 도커는 이 파일에 적힌 레시피를 그대로 따라 하면서 차곡차곡 이미지를 만들어냅니다.

자동화된 설치 스크립트

과거에는 서버 관리자가 밤을 새워가며 명령어들을 직접 타이핑해서 서버 환경을 세팅했습니다. Dockerfile은 인간이 치던 그 명령어들을 문서에 기록해 둔 자동화 스크립트입니다. 문서로 남겨져 있기 때문에 실수할 일이 없고, 다른 사람과 코드로 공유하기도 매우 쉽습니다.

Dockerfile의 핵심 명령어들

Dockerfile에서 사용하는 명령어는 모두 대문자로 쓰는 것이 관례입니다. 가장 자주 쓰이는 5가지 핵심 명령어를 살펴보겠습니다.

Dockerfile 주요 명령어 이해하기

dockerfile
FROM ubuntu:22.04

WORKDIR /app

COPY . /app

RUN apt-get update && apt-get install -y python3

CMD ["python3", "app.py"]
  1. 1FROM 문은 항상 Dockerfile의 첫 번째 줄에 위치하며, 어떤 운영체제나 환경을 베이스로 시작할지 결정합니다.
  2. 2WORKDIR은 컨테이너 내부에서 앞으로 작업할 기본 폴더 위치를 지정합니다.
  3. 3COPY는 내 컴퓨터(호스트)에 있는 파일을 도커 이미지 안으로 복사해 넣습니다.
  4. 4RUN은 이미지를 만드는 과정 중에 필요한 프로그램을 설치하거나 명령을 실행합니다.
  5. 5CMD는 이미지가 완성되고 나서, 훗날 컨테이너가 켜질 때 최종적으로 실행할 단 하나의 기본 명령을 지정합니다.

FROM: 어떤 베이스를 사용할 것인가

`FROM`은 마치 도화지를 고르는 것과 같습니다. 완전히 빈 공간에서 모든 것을 스스로 설치하는 것은 너무 어렵습니다. 그래서 누군가 미리 만들어둔 기본 이미지를 가져와서 그 위에서 작업을 시작합니다. 예를 들어 `FROM node:20`이라고 적으면, 이미 리눅스 운영체제와 Node.js 20버전이 완벽하게 세팅된 상태에서 출발하겠다는 뜻입니다. 바이브코딩을 할 때는 대부분 프레임워크에 맞는 공식 베이스 이미지를 가져다 씁니다.

WORKDIR: 작업 디렉토리 설정

`WORKDIR`은 도커 컨테이너 안에서 내가 코드를 놔둘 기준 폴더를 만드는 명령어입니다. `WORKDIR /app`이라고 적으면, 도커 내부에 `/app`이라는 방을 만들고, 앞으로 복사하는 파일이나 실행하는 명령어는 모두 이 방 안에서 이루어지도록 설정합니다. 폴더 구조를 깔끔하게 유지하기 위해 필수적입니다.

COPY: 내 파일들을 도커로 복사하기

`COPY`는 내 컴퓨터에 있는 소스 코드 파일들을 도커 이미지 내부로 집어넣는 명령어입니다. `COPY . .` 이라는 명령어를 자주 보게 될 텐데, 이는 "내 컴퓨터의 현재 폴더(`.`)에 있는 모든 것을 도커 내부의 현재 폴더(`.`)로 복사해라"라는 의미입니다.

RUN과 CMD: 명령어 실행의 차이

초보자가 가장 많이 헷갈리는 것이 `RUN`과 `CMD`의 차이입니다.

  • `RUN`: 붕어빵 틀(이미지)을 만드는 과정(Build)에서 실행됩니다. 주로 패키지나 라이브러리를 다운로드하고 설치할 때 씁니다. (예: `npm install`)
  • `CMD`: 붕어빵(컨테이너)이 완성되어 구워져 나왔을 때(Run), 즉 컨테이너가 켜지자마자 실행될 기본 프로그램입니다. (예: `npm start`) 이미지 빌드 때는 실행되지 않고 기다립니다.

Node.js 웹 앱을 위한 전형적인 Dockerfile

# 1. Node.js 20버전이 설치된 기본 환경을 가져옵니다.
FROM node:20

# 2. 도커 내부에 /app 이라는 폴더를 만들고 그곳으로 이동합니다.
WORKDIR /app

# 3. 프로젝트의 패키지 정보 파일을 먼저 복사합니다.
COPY package.json .

# 4. 이미지 빌드 과정에서 필요한 라이브러리들을 설치합니다. (RUN)
RUN npm install

# 5. 나머지 내 소스 코드 전부를 /app 폴더 안으로 복사합니다.
COPY . .

# 6. 이 이미지로 컨테이너를 실행할 때, 서버를 켜는 명령을 지정합니다. (CMD)
CMD ["npm", "start"]

Dockerfile 작성 시 주의할 점

AI가 Dockerfile을 알아서 짜주더라도, 레시피가 어떻게 돌아가는지 눈으로 읽을 수 있으면 문제를 해결하기 훨씬 쉬워집니다.

Dockerfile 작성 팁

권장

  • 공식 베이스 이미지를 사용할 것 (예: `node:20`, `python:3.11`)
  • 이미지 크기를 줄이기 위해 불필요한 캐시 파일이나 임시 파일은 생성 후 삭제할 것
  • 파일이 변경되지 않는 라이브러리 설치를 위쪽에, 자주 변하는 소스 코드 복사를 아래쪽에 배치할 것

주의

  • 비밀번호나 API 키 같은 민감한 정보를 Dockerfile 안에 텍스트로 하드코딩하지 말 것
  • 하나의 Dockerfile에서 너무 여러 개의 복잡한 서비스를 억지로 다 실행하려고 시도하지 말 것

개념 퀴즈

퀴즈 답을 맞춰야 학습 완료가 됩니다.

Dockerfile 명령어 중에서, 이미지가 모두 만들어진 후 컨테이너가 처음 실행될 때 작동하는 기본 명령어를 지정하는 것은 무엇인가요?

3줄 요약

  1. 1Dockerfile은 내 소스 코드와 실행 환경을 도커 이미지로 만들기 위해 작성하는 요리 레시피 문서입니다.
  2. 2FROM(기반 환경), WORKDIR(작업 폴더), COPY(파일 복사), RUN(설치), CMD(실행)가 가장 핵심적인 명령어입니다.
  3. 3RUN은 붕어빵 틀(이미지)을 깎아 만들 때 실행되고, CMD는 붕어빵(컨테이너)이 완성되어 세상에 나왔을 때 실행됩니다.