Dockerfile

WAS·2025년 5월 19일
0

도커

목록 보기
4/6

Dockerfile

  • Docker 이미지를 만들게 해주는 파일

Docker 이미지는 DockerHub을 통해 다운 받을 수 있다
하지만 이 Docker 이미지들은 누군가가 만들어서 DockerHub에 올려놓은 것이다
Docker 이미지를 만드는 방법으로 Dockerfile 이 있다


FROM : 베이스 이미지 생성

  • Docker 컨테이너를 특정 초기 이미지를 기반으로 추가적인 세팅을 하는 것

쉽게 이야기하면 윈도우 컴퓨터를 새로 구매하면 기본 프로그램들(인터넷, 그림판, 메모장) 등이 설치되있는데, 컨테이너도 미니 컴퓨팅 환경을 구성할 때 기본 프로그램이 어떤게 깔려있으면 좋겠는지 선택하는 옵션 이라고 생각하면 된다

EX) JDK 가 깔려있는 환경, Node가 깔려있는 환경 -> 필요에 따라 베이스 이미지를 고르기

사용 방법

  • FROM [이미지명]
  • FROM [이미지명]:[태그명]
  • 태그명을 적지 않으면 해당 이미지의 최신 버전을 사용

EX) FROM openjdk:17-jdk


Dockerfile 을 기반으로 이미지 만들기

  • 새로운 이미지를 직접 생성하는 명령어
  • 내가 원하는 환경이나 애플리케이션이 포함된 이미지를 직접 커스터마이즈해서 만들 때 사용
  • docker build -t 이미지명:tag이름 경로
    ex) docker run -d my-jdk17-server . -> .은 현재경로를 나타냄

Docketfile을 기반으로 이미지를 만들었으면 컨테이너를 뛰운다 -> docker run -d my-jdk-server
그 후 컨테이너를 조회했을때, 만약 컨테이너가 종료되어있으면 내부적으로 필요한
명령을 다 수행하면 컨테이너가 자동으로 종료되었다는 의미이다


✅ 종료된 컨테이너에 들어가서 디버깅하는 방법

기존에 컨테이너를 디버깅하기 위해서는 두개의 방법이 있다
docker logs를 활용해 컨테이너 로그를 확인하는 방법과
docker exec -it 를 활용해 컨테이너 내부에 직접 들어가는 방법이 있다
하지만 로그에 문제가 따로 없거나, 컨테이너가 실행되지 않는 상태에서는 내부에 들어갈 수 없다

그럴 때는 Dockerfile 에 명령어를 추가해서 컨테이너가 바로 죵로되는것을 막을 수 있다

FROM openjdk:17-jdk

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 500초 동안 시스템을 일시정지 시키는 명령어

결국 500초동안 시스템을 일시정지 시키는 작업이 있기때문에 컨테이너는 종료되지 않는다
그 후 docker exec -it 명령어로 컨테이너 내부에 접속할 수 있다

ENTRYPOINT

  • 컨테이너가 생성되고 최초로 실행할 때 수행되는 명령어
    ex) ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]

RUN

  • 이미지 생성 과정에서 사용하는 명령어
    ex) RUN npm install

COPY : 파일복사

  • 호스트 컴퓨터에 있는 파일을 복사해서 컨테이너에 전달한다
  • COPY [호스트 컴퓨터에 있는 복사할 파일의 경로] [ [컨테이너에서 파일이 위치할 경로]
    ex) COPY app.txt /app.txt : 호스트 컴퓨터 안의 app.txt 파일을 컨테이너에 app.txt 명칭으로 복사
    ex) COPY *.txt /text-files/ : 모든 파일들을 컨테이너의 text-files 폴더를 만들고 그 안에 복사

폴더를 의미할 경우 항상 /로 시작해서 /로 끝나야함

만약 특정 파일이나 폴더를 COPY 하고 싶지 않을 경우 .dockerignore 파일을 만든 후
그 파일안에 제외할 파일이나 폴더명을 적는다 -> ex) readme.txt


WORKDIR

  • 작업 디렉터리를 설정하는 명령어
  • 명령어를 입력할 때 매번 경로를 쓰는 것이 번거로워서 사용
  • WORKDIR 를 설정하면, 이후 명령어는 모두 해당 디렉토리 기준으로 실행됨
  • WORKDIR [작업 디렉토리로 사용할 절대 경로]
    EX) WORKDIR /usr/src/app

WORKDIR 경로 입력 후 COPY 명령어로 복사를 해주면
만들어진 컨테이너에서 보면 my-dird 폴더 안에 복사한 파일들이 일괄 들어가 있는것을 볼 수 있다
!! 순서 중요 -> COPY 후 WORKDIR 하면 복사를 먼저해서 my-dird 안에 복사가 되지 않음


✅ EXPOSE

  • 컨테이너 내부에서 어떤 포트에 프로그램이 실행되는지를 문서화하는 역할을 함
  • docker run -p 8080:8080 과 같이 실제 포트를 바인딩하는 역할이 아님
  • 이 명령어를 사용하나 안하나 컨테이너 작동 방식에는 영향이 없음
  • 실제 포트를 여는 것이 아니라, 컨테이너가 어떤 포트를 사용할 것인지 명시하는 메타 데이터
  • 협업이나 자동화도구에서 유용하게 사용됨
  • EXPOSE [포트 번호]
    EX) EXPOSE 3000
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글