본문 바로가기
Docker

[Docker] Dockerfile (도커 강의 정리 #4)

by dbs_ 2025. 4. 30.

 

 


 

Dockerfile이란?

  • 도커 이미지 생성을 위해 필요한 파일

 

FROM : 베이스 이미지 생성

  • FROM : 베이스 이미지를 생성하는 역할
  • Docker 컨테이너를 특정 초기 이미지(베이스 이미지)를 기반으로 추가적인 세팅을 할 수 있다.
# 예시
FROM openjdk:17-jdk

FROM node

 

도커파일 이미지로 빌드

docker build -t my-jdk17-server {상대경로}
# -t : 태그명 지정
# 지정하지 않으면 latest
# 상대경로 작성
  • docker run -d my-jdk17-server
    • 이렇게 입력했을 때 바로 Exited 상태가 된다
      • 이유 : 도커 파일에서 컨테이너가 내부적으로 해야 하는 작업들이 끝나면 자동으로 컨테이너가 종료된다.
  • docker logs 명령어는 실행중인 컨테이너만 가능하다.

 

COPY : 파일 복사(이동)

  • COPY : 호스트 컴퓨터에 있는 파일을 복사해서 컨테이너로 전달
# 문법
COPY [호스트 컴퓨터에 있는 복사할 파일의 경로] [컨테이너에서 파일이 위치할 경로]

# 예시
COPY app.txt /app.txt

# 디렉토리 복사 시에는 뒤에 / 붙여줘야함
COPY *.txt /text-files/
  • 특정 파일이나 폴더만 제외하고 복사하기
    • .dockerignore 파일 생성
FROM ubuntu

COPY ./ / # 컨테이너의 루트경로에 전부 다 복사된다

 

ENTRYPOINT : 컨테이너가 시작할 때 실행되는 명령어

  • ENTRYPOINT : 컨테이너 시작 시에 바로 실행되었으면 하는 명령어 작성
FROM ubuntu

COPY *.txt /text-files/

ENTRYPOINT ["/bin/bash", "-c", "echo hello"]
# 위 내용 출력시켰으니까 docker logs 해도 남아있는 것을 볼 수 있다.
  • 일반적으로 리눅스 명령어 입력하기

 

RUN : 이미지를 생성하는 과정에서 사용할 명령문 실행

RUN : 이미지 생성 과정에서 명령어를 실행시켜야 할 때 사용

RUN [명령문]

RUN npm install

RUN과 ENTRYPOINT 비교

  • 공통점 : 둘 다 명령어를 실행시킬 때 사용
  • 차이점
    • RUN : 이미지 생성 과정에서 필요한 명령어를 실행시킬 때 사용
    • ENTRYPOINT : 생성된 이미지를 기반으로 컨테이너 생성한 직후에 명령어 실행

예시

  • 내가 필요한게 우분투랑 깃이랑 모두 깔아져 있는 이미지가 필요
  • 그런데 저 두개 모두 합쳐진 base 이미지는 없으니까
  • base이미지를 우분투로 하고, run으로 git을 설치해 준다.
FROM ubuntu

RUN apt update && apt install -y git # 이미지 생성에 필요

ENTRYPOINT ["/bin/bash", "-c", "echo hello"] # 컨테이너 실행 후 필요

 

WORKDIR : 작업 디렉토리를 지정

  • WORKDIR : 직업 디렉터리르 전환하면 그 이후에 등장하는 모든 RUN, CMD, ENTRYPOINT, COPY, ADD 명령문은 해당 디렉터리를 기준으로 실행된다.
    • 사용 이유 : 컨테이너 내부 폴더 깔끔하게 정리하려고
WORKDIR [작업 디렉토리로 사용할 절대 경로]

WORKDIR /usr/src/app
  • 최초 경로로 설정도 가능
    • 예) docker exec -it [id] bash 했을 때 바로 저 WORKDIR에 접근한다

 

EXPOSE : 컨테이너 내부에서 사용 중인 포트를 문서화하기

  • EXPOSE : 컨테이너 내부에서 어떤 포트에 프로그램이 실행되는지를 문서화하는 역할
    • 작동에는 영향 주지 않는다
    • 그냥 문서화하는 역할
EXPOSE [포트 번호]

EXPOSE 3000 # 이 이미지에서 실행되는 프로그램은 3000 포트에서 실행할거야 알아둬 느낌