Docker

[Docker] Dockerfile 만들어보기

맨날개발 2025. 5. 4. 10:45
비전공자도 이해할 수 있는 Docker 입문/실전 (박재성)

 

📢 Dockerfile이란?

도커 허브를 통해서 이미지를 다운 받아 컨테이너를 구성할 수 있다. 이 때 이미지를 만들기 위한 설계도와 같은 역할을 하는 것이 Dockerfile이다.

 

이미지 자체를 공유하는 것이 아닌 이미지를 생성하기 위한 스크립트를 공유함으로써 배포에 용이하다.

 

🎈 도커 이미지 생성

Dockerfile을 통해서 이미지를 생성할 수 있는데 명령어는 다음과 같다.

docker build -t [이미지명][태그명] Dockerfile경로
  • 태그명을 작성하지 않으면 자동적으로 latest 로 생성된다.

 

⚙ 명령어

1️⃣ FROM

베이스 이미지를 생성하는 역할을 한다. 컨테이너를 구성할 시 필요한 초기 이미지를 기반으로 셋팅을 하게 된다.

 

다음과 같이 FROM 뒤에 이미지 정보를 작성하면 된다.

FROM [이미지명]:[태그명]
  • 멀티스테이지 빌드 구현시 여러 이미지를 사용할 수 있다고 한다.
✨ alpine 태그는 핵심적인 내용만 남겨놓고 나머지는 모두 제거된 이미지이다. alpine 태그를 많이 사용한다.

 

 

2️⃣ 파일 복사

호스트 컴퓨터에 있는 파일을 복사해서 컨테이너로 전달이 가능하다.

 

명령어는 COPY를 사용한다.

COPY [호스트 컴퓨터 경로]:[컨테이너 경로]

 

✅ 컨테이너의 디렉토리로 복사하는 경우 경로 끝에 / 를 붙여야 한다.

COPY my-directory /my-directory/
  • 경로 뒤에 / 를 붙이지 않는 경우 해당 이름의 파일로 복사가 된다.
  • 디렉토리가 존재하지 않으면 생성도 해준다.

 

✅ 와일드카드 표현을 통해서 한번에 여러개의 파일을 복사할 수 있다.

COPY *.txt /files/
  • 해당 경로에 있는 txt 확장자 파일들 모두 /files 디렉토리로 복사하게 된다.

 

✅ 특정 폴더/파일을 제외하고 복사할 땐 .dockerignore 파일을 사용하면 된다.

readme.txt
test1.txt
  • 위와 같이 한줄에 하나씩 제외할 폴더/파일을 추가해주면 된다.

 

3️⃣ RUN

이미지를 생성하는 과정에서 명령어를 실행시켜야할 때 사용한다. docker build 할 때 한번 호출된다.

 

✅ 명령어는 RUN을 사용한다.

RUN [명령문]

RUN npm install
  • RUN은 이미지 생성과정에서 필요한 명령어를 실행시킬 때 사용
  • RUN은 FROM에서 설정한 이미지 위에서 명령어를 실행시킨다.
  • ENTRYPOINT와 헷갈리지 않도록 주의!

 

✅ 아래는 사용 예시이다.

FROM ubuntu

RUN apt update && apt install -y git

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
  • ubuntu 이미지를 베이스 이미지로 사용한다(해당 이미지 설치).
  • ubuntu에서 git을 설치한다.

 

4️⃣ WORKDIR

WORKDIR으로 작업 디렉토리를 전환하면 그 이후에 등장하는 모든 명령문은 해당 디렉토리를 기준으로 실행하게 된다.

 

✅ 즉, 작업하려는 디렉토리를 변경할 때 사용된다.

WORKDIR [작업 디렉토리로 사용할 경로]

WORKER /my-dir

 

 

5️⃣ ENTRYPOINT

해당 이미지를 사용하는 컨테이너를 시작할 때 실행되는 명령어이다.

 

✅ 명령어는 ENTRYPOINT을 사용한다.

ENTRYPOINT [명령문...]

ENTRYPOINT ["node", "dist/main.js"]
  • ENTRYPOINT는 컨테이너가 시작될 때 실행되는 명령문이다.
  • RUN과 헷갈리지 말자!

 

✅ CMD와 함께 사용해서 CMD에 명령문의 인자를 설정할 수 있다.

ENTRYPOINT ["node"]
CMD ["dist/main.js"]
  • 명령문과 인자를 분리할 수 있다.

 

✅ 컨테이너에 이미지가 정상적으로 작동되는지 확인하기

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
  • 컨테이너 내부에 실행중인 서비스가 존재하지 않으면 실행 후 종료된다.
  • 컨테이너가 정상적으로 설치되는지 확인하기 위해 logs 명령어를 통해서 확인이 가능하다.
  • 하지만, 직접 컨테이너 내부로 진입해서 확인하고 싶은 경우가 존재한다.
  • 종료된 컨테이너에는 exec를 통해 접근이 불가능하다.
  • 이때 위와 같은 명령어를 통해 일정시간동안 컨테이너가 실행중이 되도록 만들 수 있다.
  • 위의 명령문은 500초 동안 컨테이너를 실행시켜준다.

 

6️⃣ EXPOSE

컨테이너 내부에서 어떤 포트에 프로그램이 실행중인지를 문서화만 해준다.

✅ 말그대로 문서역할만 하기 때문에 해당 명령어가 동작에 영향을 주지는 않는다. -p 옵션과 같은 역할을 하는게 아니다.

EXPOSE [포트 번호]

EXPOSE 3000