: 도커 이미지를 구축하기 위해 명령어들을 순차적으로 나열한 텍스트 파일이다.
각각의 명령어는 이미지의 새로운 계층을 만들어 내며 이러한 계층이 모여 최종 이미지를 형성한다.
멀티레이어 빌드를 하게 되면 새로운 레이어만 캐싱되기 때문에 중복으로 레이어가 다운되지 않아 최적화된 이미지를 만들 수 있다.
ex)
#1단계. Maven 또는 Gradle을 사용해 Spring Boot 애플리케이션 빌드
FROM maven-3.6.3-jdk-11 AS build
WORKDIR /app
COPY pom.xml ./
COPY src ./src
RUN mvn -f pom.xml clean package
# 2단계. JAR파일을 실행하기 위한 새로운 레이어
FROM openjdk:11
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
EXPOSE 8080
CMD["java",'-jar',"app.jar"]
FROM maven:3.6.3-jdk-11 AS build: Maven 기반의 이미지를 사용하여 빌드 단계 정의.WORKDIR /app: 작업 디렉토리를 /app으로 설정COPY pom.xml ./ 및 COPY src ./src: 로컬 시스템의 pom.xml 파일과 src 디렉토리를 컨테이너의 작업 디렉토리로 복사RUN mvn clean package: Maven을 사용하여 애플리케이션을 빌드. → 이 명령어는 target 디렉토리에 JAR 파일을 생성한다.FROM openjdk:11-jre-slim: OpenJDK 이미지를 사용하여 런타임 환경을 설정WORKDIR /app: 작업 디렉토리를 /app으로 설정COPY --from=build /app/target/*.jar app.jar: 빌드 단계에서 생성된 JAR 파일을 현재 단계로 복사EXPOSE 8080: 컨테이너의 8080 포트를 외부에 노출하여 애플리케이션이 이 포트를 통해 접근할 수 있도록 함CMD ["java", "-jar", "app.jar"]: Java 애플리케이션을 실행: 이미지 지정
: Dockerfile은 FROM명령어로 시작해아하며, 빌드 과정의 기점이 되는 이미지를 정의한다.
→ 그 이미지를 베이스 이미지라고 부르기도 한다.
: 이미지에 메타데이터를 추가한다.
LABEL maintainer = "name@example.com"
예를 들어 이미지의 제작자 정보를 포함할 수 있다.
: 이미지 빌드 과정 중에 명령어를 실행한다. 주로 패키지 설치나 설정 파일 변경에 사용된다.
RUN apt-get update && apt-get install -y python
: 호스트 파일이나 디렉터리를 이미지 내부로 복사한다. 애플리케이션의 소스코드를 이미지에 추가할 때 사용한다.
COPY src ./src
원격 URL에서 파일을 추가하거나 로컬의 압축 파일을 압축 해제하며 파일을 추가할 수 있다. (COPY와 유사)
ADD https://example.com/big.tar.xz /usr/src/things/
컨테이너가 시작될 때 실행할 기본 명령어를 정의한다. Dockerfile 내에서 한 번만 사용 가능하다.
CMD["java",'-jar',"app.jar"]
컨테이너가 리스닝할 포트를 지정한다.
EXPOSE 8080
환경 변수를 설정한다.
ENV API_KEY="YOUR_API_KEY"
컨테이너가 시작될 때 실행할 명령어를 설정한다. CMD 와 함께 사용해 애플리케이션의 실행 방식을 정의할 수 있다.
ENTRYPOINT ["python"]
CMD ["app.py"]
RUN, CMD, ENTRYPOINT,COPY,ADD 명령어가 실행될 작업 디렉터리를 설정한다.
WORKDIR /app
도커파일은 docker build 명령어를 통해 이미지를 빌드한다.
→ 도커파일을 활용함으로써 애플리케이션의 빌드와 배포과정을 표준화하고 자동화할 수 있으며 이는 개발의 효율성을 높인다!
효율성 향상 / 배포시간 단축/ 보안 강화를 위해 Dockerfile 최적화 전략을 알아보자
&& rm -rf /path/to/temporary/files와 같이 제거해 이미지 크기를 줄일 수 있다..dockerignore파일을 사용해 불필요한 파일은 이미지에 포함되지 않도록 설정한다.docker cp 명령어는 실행중인 도커 컨테이너와 호스트 사이에 파일이나 디렉터리를 복사하는데 사용된다.
호스트에서 컨테이너로 파일이나 디렉터리 복사할 때
docker cp <호스트의 파일 경로> <컨테이너 이름>:<컨테이너 내 경로>
컨테이너에서 호스트로 파일이나 디렉터리 복사할 때
docker cp <컨테이너 이름>:<컨테이너 내 파일 경로> <호스트의 경로>
docker run --name sugi-nginx -p 8080:80 -d nginx
본인은 sugi-nginx라는 이름으로 Nginx 컨테이너를 실행했다.
호스트의 8080포트를 컨테이너의 80포트에 연결하였다.
잘 돌아가는 것을 확인할 수 있다.
vi index.html 명령어를 입력하고 다음과 같이 파일을 구성해준다.
<!DOCTYPE html>
<html>
<head>
<title>Welcome to My Nginx!</title>
</head>
<body>
<h1>Hello, Docker!</h1>
<p>This is my custom Nginx homepage served from a Docker container.</p>
</body>
</html>
1) 명령어 입력
docker cp index.html sugi-nginx:/usr/share/nginx/html/index.html
2) 확인

localhost:8080에 접속해 확인해보면 index.html파일의 내용이 반영되어있는 것을 확인할 수 있다.