Docker를 처음 사용할 때 가장 많이 헷갈리는 명령어가 바로 docker build와 docker run이다.
둘 다 자주 같이 나오기 때문에 비슷해 보이지만, 역할은 완전히 다르다.
결론부터 말하면 이거 하나로 끝난다.
- docker build = 이미지를 만드는 명령어
- docker run = 컨테이너를 실행하는 명령어
즉, build는 “준비 단계”, run은 “실행 단계”다.

docker build는 무엇을 할까
docker build는 Dockerfile을 읽어서 이미지를 만드는 명령어다.
즉, 내가 만든 프로그램을 Docker에서 실행할 수 있는 형태로 변환하는 과정이다.
예를 들어 이런 Dockerfile이 있다고 해보자.
FROM node:18
WORKDIR /app
COPY . .
RUN npm install
CMD ["node", "server.js"]
이 상태에서 build를 실행하면:
docker build -t myapp:1.0 .
Docker는 이 파일을 읽고:
- Node.js 환경 만들고
- 코드 복사하고
- npm install 실행하고
최종적으로 하나의 이미지(myapp:1.0)를 만든다.
즉, 아직 실행은 안 된 상태다.
docker run은 무엇을 할까
docker run은 이미 만들어진 이미지를 실행해서 컨테이너를 만드는 명령어다.
즉, 실제로 프로그램이 돌아가기 시작하는 단계다.
docker run -d -p 3000:3000 myapp:1.0
이 명령어를 실행하면:
- 이미지를 가져와서
- 컨테이너를 만들고
- 프로그램을 실행한다
그래서 이 순간부터 서버가 실제로 동작하게 된다.
전체 흐름으로 보면 이렇게 된다
Docker의 전체 흐름은 항상 이 순서를 따른다.
Dockerfile → docker build → Image → docker run → Container
즉:
- build = 설계도를 실제 제품으로 만드는 단계
- run = 그 제품을 사용하는 단계
라고 보면 된다.
비유하면 이렇게 이해하면 쉽다
이걸 요리로 비유하면 정말 이해가 쉽다.
- Dockerfile = 레시피
- docker build = 요리 준비해서 밀키트 만들기
- Image = 만들어진 밀키트
- docker run = 실제로 요리해서 먹기
즉, build는 “만드는 과정”, run은 “먹는 과정”이다.
둘을 같이 써야 하는 이유
docker run만으로는 내가 만든 프로그램을 실행할 수 없다.
왜냐하면 실행할 이미지가 없기 때문이다.
그래서 항상:
- 먼저 build로 이미지 만들고
- 그 다음 run으로 실행한다
이 순서를 따른다.
단, nginx처럼 이미 만들어진 이미지를 사용할 경우에는 build를 생략하고 바로 run을 쓸 수 있다.
docker run nginx
이건 Docker Hub에 이미 이미지가 있기 때문이다.
자주 헷갈리는 포인트
많은 사람들이 이렇게 착각한다.
- build 하면 실행되는 줄 앎
- run 하면 이미지까지 만들어지는 줄 앎
하지만 실제로는:
- build = 실행 안 됨 (이미지만 생성)
- run = 실행만 함 (이미지는 필요)
이다.
그래서 둘은 절대 같은 역할이 아니다.
한눈에 정리
|
명령어 |
역할 |
|---|---|
| docker build | Dockerfile → Image 생성 |
| docker run | Image → Container 실행 |
한 줄로 정리하면
docker build는 이미지를 만드는 명령어이고, docker run은 그 이미지를 실행해서 컨테이너를 만드는 명령어다. 즉, build는 준비, run은 실행이다.