
Dockerfile이란?
💡 Docker 이미지는 Docker hub를 통해 다운받아서 사용할 수 있다.
위 Docker 이미지들도 누군가 만들어서 Dockerhub에 올려놓은 것이다.
Docker 이미지는 Dockerfile이라는 스크립트 파일을 활용해서 Docker 이미지를 만들 수 있다.
Dockerfile 명령어
| FROM | 설명 |
| FROM | 베이스 이미지 생성 |
| RUN | 명령어 실행 (예: 패키지 설치) |
| COPY | 파일 복사(이동) |
| ENTRYPOINT | 컨테이너가 시작할 떄 실행되는 명령어 |
| WORKDIR | 작업 디렉토리 설정 |
| CMD | 컨테이너 시작할 때 실행되는 명령어 (1개만 작성 가능) |
| ENV | 환경 변수 설정 |
| EXPOSE | 컨테이너에서 노출할 포트 |
FROM : 베이스 이미지 생성
💡 FROM은 베이스 이미지를 생성하는 역할을 한다.
Docker 컨테이너를 특정 초기 이미지를 기반으로 추가적인 셋팅을 할 수 있다.
여기서 얘기한 '특정 초기 이미지'가 곧 베이스 이미지이다.
즉, 컨테이너를 새로 띄워서 구축할 때 기본 프로그램이 어떤게 깔려있으면 좋겠는지 선택하는 옵션이다.
누군가는 JDK가 또 다른 누군가는 Node가 셋팅되기를 바랄 수도 있다. 필요에 따라 베이스 이미지를 고르면 된다.
✔ 사용법
# 문법
FROM {이미지 명}
FROM {이미지 명}:{태그명}
- 태그명을 적지 않으면 해당 이미지의 최신(latest) 버전을 사용한다.

위 예제는 jdk 17로 진행 할 예정이며, Intellij로 빌드 해볼것이다.
✔ Dockerfile을 기반으로 이미지 만들기
# docker build -t {이미지명}:{태그명} {Dockerfile이 존재하는 디렉토리 경로}
$ docker build -t sample .
$ docker build -t sample:1.0 .
$ docker build -t my-jdk17-server .
$ docker build -t my-jdk17-server:beta .
-t 옵션은 내가 만들고자 하는 이미지명을 작성하면 된다.

정상적으로 이미지가 빌드된 모습이다.
✔ 이미지를 기반으로 컨테이너 띄우기
$ docker run -d my-jdk17-server
✔ 컨테이너 조회하기
# 실행되고 있는 컨테이너가 없다.
$ docker ps
# 확인해보니 컨테이너가 종료되어 있다.
$ docker ps -a
Docker의 컨테이너는 내부적으로 필요한 명령을 다 수행하면 컨테이너가 자동으로 종료된다.
✔ 컨테이너 내부로 들어가서 jdk 설치 확인하기

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 500초 동안 시스템을 일시정지
위 명령어를 추가함으로써 컨테이너가 바로 종료되는 걸 막을 수 있다. 이후 docker exec -it를 활용해서
컨테이너 내부에 직접 들어가서 디버깅을 하면 된다.

COPY : 파일 복사 (이동)
💡 호스트 컴퓨터에 있는 파일이나 디렉토리를 Docker 이미지로 복사한다.
로컬 파일 시스템에서만 작동하며, 다른 원격 소스에서 직접 파일 복사는 불가능하다.
✔ 사용법
# 문법
COPY {호스트 컴퓨터에 있는 복사할 파일의 경로} {컨테이너에서 파일이 위치할 경로}
# 예시
COPY app.txt /app.txt

✔ Dockerfile 만들어서 이미지 생성 및 컨테이너 실행
FROM ubuntu
COPY app.txt /app.txt
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
$ docker build -t my-server .
$ docker run -d my-server
$ docker exec -it {컨테이너 ID} bash
$ ls

✔ 폴더 안에 있는 모든 파일들 복사

FROM ubuntu
COPY my-app /my-app/
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
$ docker build -t my-server .
$ docker run -d my-server
$ docker exec -it {컨테이너 ID} bash
$ ls

✔ 와일드 카드 사용해보기

FROM ubuntu
# 디렉토리로 복사할 때 뒤에 /를 붙여줘야 한다.
COPY *.txt /text-files/
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
- /text-files라고 적으면 안되고 /text-files/ 라고 적어야 text-files 라는 디렉토리 안에 파일들이 복사된다.
✔ dockerIgnore 사용해보기

.gitIgnore처럼 제외하고자 하는 파일 및 디렉토리를 명시해주면 된다.
ENTRYPOINT : 컨테이너가 시작할 때 실행되는 명령어
💡 컨테이너가 생성되고 최초로 실행할 때 수행되는 명령어를 뜻한다.
쉽게 설명하면 ENTRYPOINT에는 미니 컴퓨터의 전원을 키고나서 실행시키고 싶은 명령어를 적으면 된다.
✔ 사용법
# 문법
ENTRYPOINT [명령문...]
# 예시
ENTRYPOINT ["node", "dist/main.js"]
✔ 예제
# ubuntu 이미지 생성
FROM ubuntu
# 컨테이너 실행 순간 명령어 실행
ENTRYPOINT ["/bin/bash", "-c", "echo hello"]
$ docker build -t my-server .
$ docker run -d my-server
$ docker ps -a
$ docker logs {컨테이너 ID}

RUN : 이미지를 생성하는 과정에서 사용할 명령문 실행
💡 이미지 생성 과정에서 명령어를 실행시켜야 할 때 사용한다.
✔ 사용법
# 문법
RUN [명령문]
# 예시
RUN npm install
⚠ RUN vs ENTRYPOINT
RUN 명령어와 ENTRYPOINT 명령어를 헷갈릴 때가 있다. 둘 다 같이 명령어를 실행시키기 때문이다.
엄연히 둘의 사용 용도는 다르다.
- RUN : 이미지 생성 과정에서 필요한 명령어를 실행시킬 때 사용한다.
- ENTRYPOINT : 생성된 이미지를 기반으로 컨테이너를 생성한 직후에 명령어를 실행시킬 때 사용한다.
✔ 예제
미니 컴퓨터 환경이 ubuntu로 구성되었으면 좋겠고 git이 깔려있으면 좋겠다고 가정하자.
이런 환경을 구성하기 위해 Dockerfile을 활용해 ubuntu, git이 깔려있는 이미지를 만들면 된다.
# Dockerfile
FROM ubuntu
RUN apt update && apt install -y git
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
✔ 이미지 빌드 및 컨테이너 실행
$ docker build -t my-server .
$ docker run -d my-server
$ docker exec -it {컨테이너 ID} bash
# 컨테이너 내에 git이 잘 설치되었는지 확인
$ git -v

WORKDIR : 작업 디렉토리를 지정
💡 WORKDIR으로 작업 디렉토리를 전환하면 그 이후에 등장하는 모든
RUN, CMD, ENTRYPOINT, COPY, ADD 명령문은 해당 디렉토리를 기준으로 실행된다.
작업 디렉토리를 굳이 지정해주는 이유는 컨테이너 내부의 폴더를 깔끔하게 관리하기 위해서이다.
컨테이너도 미니 컴퓨터와 같기 때문에 Dockerfile을 통해 생성되는 파일들을 특정 폴더에 정리해두는 것이
추후에 관리가 쉽다. 만약 WORKDIR을 쓰지 않으면 컨테이너 내부에 존재하는 기존 파일들과 섞여버린다.
✔ 사용법
# 문법
WORKDIR [작업 디렉토리로 사용할 절대 경로]
# 예시
WORKDIR /usr/src/app
✔ 예제
# Dockerfile
FROM ubuntu
WORKDIR /my-dir
COPY ./ ./
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
WORKDIR를 지정해야 다른 파일들과 섞이지 않고, /my-dir 이라는 디렉토리에 COPY해둔 파일들이 복사된다.

EXPOSE : 컨테이너 내부에서 사용 중인 포트를 문서화 하기
💡 컨테이너 내부에서 어떤 포트에 프로그램이 실행되는 지를 문서화 하는 역할만 한다.
docker -p 8080:8080 와 같은 명렁어의 -p 옵션과 같은 역할은 일체 하지 않는다.
쉽게 표현하자면 EXPOSE 명령어는 쓰나 안 쓰나 작동하는 방식에는 영향을 미치지 않는다.
✔ 사용법
# 문법
EXPOSE [포트 번호]
# 예시
EXPOSE 3000
위 이미지에서 실행되는 프로그램은 3000번에서 실행될거야 라는 참고용 목적만 한다.
'DevOps > Docker' 카테고리의 다른 글
| [Docker] 웹 프론트엔드 프로젝트 Next.js를 Docker로 배포해보자 (0) | 2026.01.14 |
|---|---|
| [Docker] 백엔드 프로젝트 Next.js를 Docker로 실행시켜보자 (0) | 2026.01.14 |
| [Docker] Docker로 MongoDB 실행 + 볼륨(Volumn) 적용 (0) | 2026.01.13 |
| [Docker] Docker로 PostgreSQL 실행 + 볼륨(Volumn) 적용 (0) | 2026.01.13 |
| [Docker] Docker로 MySQL 실행시켜보기 (0) | 2026.01.13 |