ballqs 님의 블로그
[Docker] Dockerfile 작성 본문
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 최적화
왜 최적화를 해야 하는가?
- 빠른 생성을 위해
- 이미지 크기 줄이기
- 재사용성 높이기
- 보안 강화
- 유지보수 쉽게
사용 예제
주석 없음 버전
# 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 |