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 |