[Docker] Dockerfile 작성법과 이미지 빌드(Build) 최적화 가이드

2026. 2. 4. 20:34·개발 환경 | 도구/Docker | 컨테이너

1. 개요

지금까지는 남들이 만들어 둔 이미지(Nginx, MySQL 등)를 가져다 쓰기만 하는 '소비자'였습니다. 하지만 개발자의 진짜 업무는 내가 짠 코드를 서버에 배포하는 것입니다.

이번 글에서는 Dockerfile이라는 '제조 명세서'를 작성하여, 내 애플리케이션을 도커 이미지로 만드는(Build) 방법과 빌드 속도를 획기적으로 줄이는 캐싱(Caching) 원리를 다룹니다.


2. 전체 구조 요약 (Build Process)

소스 코드가 이미지가 되기까지의 흐름입니다.

[ 내 컴퓨터 (Source Code) ]
   app.js, package.json
          +
    [ Dockerfile ]          --->   [ Docker Daemon ]
 (이미지 생성 레시피)                (docker build)
                                         ↓
                                 [ Docker Image ]
                               (Layer A + Layer B...)
                                         ↓
                                 [ Container ]
                               (docker run으로 실행)

3. 구성 준비물

항목 설명
Node.js 프로젝트 실습용 간단한 웹 서버 코드 (없으면 아래 예제 복사)
Dockerfile 확장자 없는 텍스트 파일
.dockerignore 이미지에 넣지 말아야 할 파일 목록
Terminal 빌드 명령어 실행용

4. 단계별 구성 절차

4-1. 예제 애플리케이션 준비 (Node.js)

실습을 위해 아주 간단한 웹 서버 코드를 만듭니다. (Node.js가 없어도 파일만 만들면 됩니다.)

파일명: `app.js`

const http = require('http');
const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.end('Hello! This is my first Docker Image!');
});
server.listen(3000, () => {
  console.log('Server running on port 3000');
});

(※ 별도의 package.json 없이도 실행 가능한 내장 모듈 코드입니다.)

4-2. Dockerfile 작성 (핵심 ⭐)

프로젝트 최상단에 확장자 없이 Dockerfile이라는 파일을 만들고 아래 내용을 적습니다.
(명령어는 대문자로 쓰는 것이 관례입니다.)

# 1. 베이스 이미지 선택 (OS + 런타임)
FROM node:18-alpine

# 2. 작업 디렉터리 설정 (컨테이너 내부 경로)
WORKDIR /app

# 3. 파일 복사 (호스트 -> 컨테이너)
# 문법: COPY [내컴퓨터경로] [컨테이너경로]
COPY . .

# 4. (필요 시) 라이브러리 설치
# RUN npm install

# 5. 실행 명령어 정의 (컨테이너가 켜질 때 실행)
CMD ["node", "app.js"]

4-3. 이미지 빌드하기 (Build)

작성한 Dockerfile을 바탕으로 이미지를 생성합니다.

# 문법: docker build -t [이미지이름:태그] [Dockerfile위치]
docker build -t my-node-app:v1 .
  • -t: 태그(Tag) 설정. 보통 이름:버전 형식을 씁니다.
  • . : 현재 폴더(Current Context)에 있는 Dockerfile을 쓰겠다는 뜻입니다.

4-4. 내가 만든 이미지 실행하기

docker run -d -p 3000:3000 --name my-app my-node-app:v1

브라우저에서 localhost:3000에 접속하여 메시지가 뜨는지 확인하세요.


5. 운영 및 최적화 고려 사항 (꿀팁)

5-1. 레이어 캐싱 (Layer Caching) 활용

도커는 빌드할 때 각 명령어를 '레이어(Layer)'라는 층으로 저장합니다. 변경되지 않은 층은 재사용(Cache)합니다.
따라서 변경이 적은 파일부터 먼저 복사해야 빌드 속도가 빨라집니다.

[비효율적인 Dockerfile]

COPY . .           # 소스코드(자주 바뀜)를 먼저 복사하면
RUN npm install    # 코드가 바뀔 때마다 npm install을 다시 수행함 (느림)

[최적화된 Dockerfile]

COPY package.json . 
RUN npm install    # 의존성 파일만 먼저 복사해서 설치 (캐시 활용)
COPY . .           # 소스 코드는 나중에 복사

5-2. .dockerignore 파일 필수 생성

.gitignore처럼, 이미지를 만들 때 제외할 파일을 정의합니다. 이걸 안 하면 node_modules 같은 거대한 폴더나 .env 같은 비밀 파일이 이미지에 들어가 버립니다.

파일명: `.dockerignore`

node_modules
.git
.env
Dockerfile

5-3. Alpine 이미지 사용

베이스 이미지를 node:18 대신 node:18-alpine을 쓰면 용량이 1GB에서 50MB 수준으로 줄어듭니다. (리눅스 경량화 버전)


6. 결론

이제 여러분은 남의 것을 쓰는 단계를 넘어, 나만의 서비스를 컨테이너화하는 능력을 갖췄습니다.

  • FROM: 베이스 깔기
  • COPY: 파일 옮기기
  • RUN: 세팅하기
  • CMD: 실행하기

이 4가지 명령어만 알면 세상의 모든 프로그램을 이미지로 만들 수 있습니다.

하지만, "DB도 띄우고 웹 서버도 띄우려면 docker run을 두 번 해야 하나?" 라는 의문이 드실 겁니다.
다음 마지막 4부에서는 이 귀찮음을 해결해 줄 Docker Compose에 대해 다루겠습니다.

'개발 환경 | 도구 > Docker | 컨테이너' 카테고리의 다른 글

[Kubernetes] 쿠버네티스가 너무 어렵다면? 초경량 MicroK8s(마이크로 k8s)로 입문하기  (0) 2026.02.08
[Docker] 도커 컴포즈(Docker Compose)로 멀티 컨테이너 한방에 관리하기  (0) 2026.02.04
[Docker] 도커 명령어 완전 정복 및 컨테이너 생명주기(Lifecycle) 관리  (0) 2026.02.01
[Docker] 도커(Docker)란? 가상머신과의 차이점 및 완벽 기초 개념 정리  (0) 2026.01.28
'개발 환경 | 도구/Docker | 컨테이너' 카테고리의 다른 글
  • [Kubernetes] 쿠버네티스가 너무 어렵다면? 초경량 MicroK8s(마이크로 k8s)로 입문하기
  • [Docker] 도커 컴포즈(Docker Compose)로 멀티 컨테이너 한방에 관리하기
  • [Docker] 도커 명령어 완전 정복 및 컨테이너 생명주기(Lifecycle) 관리
  • [Docker] 도커(Docker)란? 가상머신과의 차이점 및 완벽 기초 개념 정리
알쓸신개
알쓸신개
  • 알쓸신개
    알아두면 쓸모있는 신기한 개발지식
    알쓸신개
  • 전체
    오늘
    어제
    • 분류 전체보기 (92)
      • 웹 기초 | 디자인 (2)
        • HTML (0)
        • CSS (0)
        • 반응형 (0)
        • 웹 지식 | 웹 표준 | 접근성 (2)
      • 프론트엔드 (6)
        • JavaScript (6)
        • DOM 조작 | AJAX (0)
        • TypeScript (0)
        • Vue.js | React | JSX (0)
        • Webpack | Vite | 웹 컴포넌트 (0)
      • 백엔드 (28)
        • PHP (6)
        • Laravel (18)
        • CodeIgniter (0)
        • JAVA (0)
        • Spring (0)
        • 디자인 패턴 (2)
        • 테스트 코드 작성 (0)
        • 보안 | 인증 (1)
      • 데이터베이스 (5)
        • SQL 기초 (1)
        • MariaDB | MySql (0)
        • 데이터베이스 설계 (1)
        • 쿼리 최적화(튜닝) (0)
      • 실무 | 성장 (11)
        • 프로젝트 사례 (2)
        • 트러블슈팅 | 개발팁 (9)
        • 커리어 관련 (0)
        • 코드 리뷰 | 스터디 (0)
        • 애자일 | 스크럼 | 작업 방법론 (0)
      • 개발 환경 | 도구 (36)
        • 버전관리 (Git) (3)
        • 개발 도구 (IDE, 에디터 등) (3)
        • 서버 | 인프라 | 배포 | 운영 (14)
        • Docker | 컨테이너 (5)
        • CI | CD (2)
        • 클라우드 환경 (AWS | GCP) (9)
      • 보안 (3)
        • 보안 | 인증 전반 (2)
        • CSRF | XSS 대응 (0)
        • SQL 인젝션 (0)
        • 암호화 | 해시 (0)
        • 보안 취약점 분석 (1)
      • AI & 머신러닝 (0)
        • AI 툴의 특성 (0)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
알쓸신개
[Docker] Dockerfile 작성법과 이미지 빌드(Build) 최적화 가이드
상단으로

티스토리툴바