Dockerfile 이란??
Docker 이미지는 Dockerhub을 통해 다운받아서 사용할 수 있다.
이 Docker 이미지들도 누군가 만들어서 Dockerhub에 올려놓은 것이다. 그럼 도대체 이 Docker 이미지는 어떻게 만드는 것인지 보겠다.
Dockerfile이라는 걸 활용해서 Docker 이미지를 만들 수 있다
Dockerhub에 올려놓은 Docker 이미지가 아닌, 나만의 Docker 이미지를 만들고 싶을 수 있다
예를 들어, 내가 만든 Spring Boot 프로젝트가 있다. 내가 만든 Spring Boot 프로젝트 자체를 Docker이미지로 만들고 싶을 수 있다
이럴 때에도 Dockerfile을 활용하면 나만의 Docker 이미지를 만들 수 있게 된다
정리 -> Dockerfile이란 Docker 이미지를 만들게 해주는 파일이다
FROM : 베이스 이미지 생성
의미 : FROM은 베이스 이미지를 생성하는 역할을 한다. Docker 컨테이너를 특정 초기 이미지를 기반으로 추가적인 셋팅을 할 수 있다.
여기서 얘기한 '특정 초기 이미지'가 곧 베이스 이미지이다
조금 더 쉽게 설명해보겠다
우리가 윈도우 컴퓨터를 새로 사서 실행시켜보면 기본 프로그램들(인터넷, 그림판, 메모장 등)이 많이 깔려있다.
베이스 이미지도 이와 똑같다. 컨테이너를 새로 띄어서 미니 컴퓨터 환경을 구축할 때 기본 프로그램이 어떤게 깔려있으면 좋겠는 지 선택하는 옵션이라고 생각하면 된다
누군가는 JDK가 깔려있는 컴퓨터 환경이 셋팅되기를 바랄 수도 있고, 누군가는 Node가 깔려있는 컴퓨터 환경이 셋팅되기를 바랄 수도 있다. -> 필요에 따라 베이스 이미지를 고르면 된다.
✅ 사용법
# 문법
FROM [이미지명]
FROM [이미지명] : [태그명]
- 태그명을 적지 않으면 해당 이미지의 최신(latest) 버전을 사용한다
[실습] : FROM : 베이스 이미지 생성
이제부터 실습을 해보겠다
1. Dockerfile 만들기
https://hub.docker.com/_/openjdk
# JDK 17
FROM openjdk: 17-jdk
2. Dockerfile을 기반으로 이미지 만들기
-> Dockerfile로 이미지(Image) 생성하는 문법
# docker build -t [이미지명]:[태그명] [Dockerfile이 존재하는 디렉터리 경로]
docker build -t sample .
docker build -t sample:1.0 .
- 태그명을 적지 않으면 latest로 설정된다
docker build -t my-jdk17-server .
주의) 여기서 . 은 현재 디렉터리에 포함한다는 의미이다
3. 이미지를 기반으로 컨테이너 띄우기
docker run -d my-jdk17-server
4. 컨테이너 조회하기
docker ps # 실행되고 있는 컨테이너가 없다
docker ps -a # 확인해보니 컨테이너가 종료되어 있다
5. 컨테이너 내부로 들어가서 jdk가 잘 깔렸는지 확인해보기
종료된 컨테이너에 들어가서 디버깅하고 싶을 때
프로그래밍을 할 때 중간중간 잘 작동하는 지 확인하는 습관은 굉장히 중요하다. 어떤 명령어를 입력하고 난 뒤에 명령어가 정상적으로 수행됐는 지 어떻게 확인할 수 있는 지 방법을 찾아봐야 한다.
이 습관이 몸에 익으면 어떤 명령어를 수행하더라도 그 명령어가 어떻게 작동하는 지 파헤칠 수 있게 된다. 또한 어떤 명령어를 실행시킨 뒤에 에러게 생기더라도 금방 발견할 수 있어서 디버깅도 훨씬 수월하다
Docker를 사용하면 대부분의 코드가 컨테이너 내부에서 작동한다. 그러다보니 어떤 과정으로 처리됐는 지, 잘 처리는 됐는 지를 직접적으로 눈에 보이지 않는다. 이 때문에 Docker 학습에 어려움을 겪는다
이를 해결하기 위해 우리는 2가지 방법을 이미 익혔다
- docker logs를 활용해 컨테이너 로그 확인하기
- docker exec -it를 활용해 컨테이너 내부에 직접 들어가보기
위 방법 중 docker exec -it은 실행 중인 컨테이너에만 쓸 수 있는 명령어이다. 종료된 컨테이너는 아래와 같은 에러가 발생함

하지만 이미지를 만들면서 컨테이너를 실행시켜보면, 컨테이너의 특성상 명령어 처리가 다 끝나는대로 컨테이너가 종료된다
그러다보니 내부적으로 어떻게 컨테이너가 형성됐는 지 디버깅을 하는데 어려움을 겪는다
어떻게 해야 할까?
Dockerfile
FROM openjdk:17-jdk
...
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 500초 동안 시스템을 일시정지 시키는 명령어
위 명령어를 추가함으로써 컨테이너가 바로 종료되는 걸 막을 수 있다.
그런 뒤에 docker exec -it를 활용해 컨테이너 내부에 직접 들어가서 디버깅을 하면 된다
docker build -t my-jdk17-server . # 이미지 빌드
docker run -d my-jdk17-server # 컨테이너 실행
docker ps # 실행 중인 컨테이너 조회
docker exec -it [컨테이너 ID] bash # 컨테이너 접속
java -version # JDK 설치되어 있는 지 확인

Node 베이스 이미지로 컨테이너 띄워보기
1. Dockerfile 만들기
FROM node
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
2. 이미지를 만들고 컨테이너 띄우기
docker build -t my-node-server . # 이미지 생성
docker run -d my-node-server # 이미지를 기반으로 컨테이너 생성
docker ps # 실행 중인 컨테이너 조회
docker exec -it [컨테이너 ID] bash # 컨테이너 접속
node -v # Node 설치되어 있는 지 확인
'Docker' 카테고리의 다른 글
| [Docker] Docker Compose를 사용하는 이유 (0) | 2026.08.13 |
|---|---|
| [Docker] Nginx 이미지로 프론트엔드 서버 실행하기 (0) | 2026.08.12 |
| [Docker] RUN·WORKDIR·EXPOSE로 Nest.js 실행하기 (0) | 2026.08.12 |
| [Docker] COPY·ENTRYPOINT 명령어와 Spring Boot 배포 실습 (0) | 2026.08.12 |
| [Docker] 컨테이너, CLI, Volume (0) | 2026.08.04 |