관리 메뉴

ballqs 님의 블로그

[Docker] Dockerfile 작성 본문

코딩 공부/Docker

[Docker] Dockerfile 작성

ballqs 2024. 9. 27. 11:30

Dockerfile 이란?

이미지를 생성하기 위한 용도로 작성하는 파일이다. 이 파일을 통해 Docker에 사용할 Image를 생성한다.


Dockerfile 사용방법

Dockerfile 기본적인 틀

# Dockerfile
FROM ubuntu:latest
MAINTAINER Your Name <your-email@example.com>
RUN apt-get update && apt-get install -y nginx
COPY index.html /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
  • FROM: 베이스 이미지를 선택
  • MAINTAINER: 이미지를 만든 사람의 정보를 입력
  • RUN: 이미지에 명령을 실행하여 파일을 추가하거나 삭제
  • COPY: 파일을 이미지에 복사
  • EXPOSE: 컨테이너가 노출할 포트를 설정
  • CMD: 컨테이너가 실행될 때 실행할 명령을 설정

Dockerfile 상세 설명

  • FROM: 베이스 이미지를 지정
    • ex) FROM ubuntu:22.04
  • MAINTAINER: Dockerfile을 작성한 사람의 정보를 입력
    • ex) MAINTAINER naebaecaem <nbcamp@spartacoding.co>
  • LABEL: 이미지에 메타데이터를 추가
    • ex) LABEL purpose='nginx test'
  • RUN: 이미지를 생성하는 동안 실행할 명령어를 입력
    • 사용자를 지정하지 않은 상태라면, root 로 실행
    • ex) RUN apt update && apt upgrade -y && apt autoremove && apt autoclean
    • ex) RUN apt install openjdk-21-jdk
  • CMD: 컨테이너를 생성할 때, 실행할 명령어를 입력
    • 컨테이너를 생성할 때만 실행
    • 추가적인 명령어에 따라 설정한 해당 명령어 수정 가능
    • ex) CMD ["nginx", "-g", "daemon off;"]
  • ENTRYPOINT: 컨테이너 시작할 때, 실행할 명령어를 입력
    • 컨테이너를 시작할 때마다 실행
    • 추가적인 명령어 존재 여부와 상관 없이 무조건 실행
    • ex) ENTRYPOINT ["npm", "start"]
  • ENV: 환경 변수를 설정
    • 이미지 안에 각종 환경 변수를 지정
    • ex) ENV STAGE staging
    • ex) ENV JAVA_HOME /usr/lib/jvm/java-8-oracle
  • WORKDIR: 작업 디렉터리를 지정
    • ex) WORKDIR /app
  • COPY: 파일을 복사
    • 호스트의 파일이나 디렉토리를 이미지 안에 복사
    • Docker Context, 즉, 빌드 작업 디렉토리 내 파일만 복사 가능
    • ex) COPY index.html /usr/share/nginx/html
  • USER: 사용자를 설정
    • Container의 기본 사용자는 root 에요. root 권한이 필요 없는 application이라면 다른 사용자로 변경하여 사용해야 해요.
    • RUN ["useradd", "user"] USER user RUN ["/bin/bash, "-c", "ls"]
  • EXPOSE: 컨테이너에서 노출할 포트를 지정
    • ex) EXPOSE 80
    • ex) EXPOSE 443

Docker Image 생성 명령어

docker build -t [Image 이름]:[Tag 이름] .

Dockerfile 최적화

왜 최적화를 해야 하는가?

  1. 빠른 생성을 위해
  2. 이미지 크기 줄이기
  3. 재사용성 높이기
  4. 보안 강화
  5. 유지보수 쉽게

사용 예제

주석 없음 버전

# Build stage
FROM gradle:8.5-jdk17-alpine AS builder
WORKDIR /app
COPY ./ ./
RUN gradle clean bootJar

# App stage
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=builder /app/build/libs/spring-boot-0.0.1-SNAPSHOT.jar .
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "spring-boot-0.0.1-SNAPSHOT.jar"]

 

주석 버전

# Build stage
FROM gradle:8.5-jdk17-alpine AS builder
# 자바 17을 지원하는 Gradle 이미지를 기반으로 빌드 단계를 시작합니다.
WORKDIR /app
# 작업 디렉토리를 /app으로 설정합니다.
COPY ./ ./
# 현재 디렉토리의 모든 파일을 Docker 이미지 내부의 /app 디렉토리로 복사합니다.
RUN gradle clean bootJar
# Gradle을 사용하여 프로젝트를 빌드하고 실행 가능한 JAR 파일을 생성합니다.

# App stage
FROM eclipse-temurin:17-jre-alpine
# 자바 17 JRE를 포함한 Eclipse Temurin 이미지를 기반으로 실행 단계를 시작합니다.
WORKDIR /app
# 작업 디렉토리를 /app으로 설정합니다.
COPY --from=builder /app/build/libs/spring-boot-0.0.1-SNAPSHOT.jar .
# 빌드 단계에서 생성된 JAR 파일을 현재 이미지의 /app 디렉토리로 복사합니다.
EXPOSE 8080
# 컨테이너 내부의 8080 포트를 외부에 노출합니다.
ENTRYPOINT ["java", "-jar", "spring-boot-0.0.1-SNAPSHOT.jar"]
# 컨테이너가 시작될 때 실행할 명령을 지정합니다. JAR 파일을 실행합니다.

'코딩 공부 > Docker' 카테고리의 다른 글

[Docker] Docker Network  (0) 2024.09.27
[Docker] 명령어  (0) 2024.09.27
[Docker] Docker Compose  (0) 2024.09.27