[Docker] DockerFile / DockerFile 명령어 및 구조/ 이미지 최적화 / 파일 복사

HeeHee·2024년 7월 11일

Docker

목록 보기
1/5
post-thumbnail

📍DockerFile 작성하기

DockerFile이란

: 도커 이미지를 구축하기 위해 명령어들을 순차적으로 나열한 텍스트 파일이다.

각각의 명령어는 이미지의 새로운 계층을 만들어 내며 이러한 계층이 모여 최종 이미지를 형성한다.


아래의 예시는 **멀티레이어 빌드** 를 사용한 예시다.

멀티레이어 빌드를 하게 되면 새로운 레이어만 캐싱되기 때문에 중복으로 레이어가 다운되지 않아 최적화된 이미지를 만들 수 있다.

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 애플리케이션을 실행


📍 명령어 기본 구조 및 명령어

FROM

: 이미지 지정

: Dockerfile은 FROM명령어로 시작해아하며, 빌드 과정의 기점이 되는 이미지를 정의한다.
→ 그 이미지를 베이스 이미지라고 부르기도 한다.

LABEL

: 이미지에 메타데이터를 추가한다.

LABEL maintainer = "name@example.com"

예를 들어 이미지의 제작자 정보를 포함할 수 있다.

RUN

: 이미지 빌드 과정 중에 명령어를 실행한다. 주로 패키지 설치나 설정 파일 변경에 사용된다.

RUN apt-get update && apt-get install -y python

COPY

: 호스트 파일이나 디렉터리를 이미지 내부로 복사한다. 애플리케이션의 소스코드를 이미지에 추가할 때 사용한다.

COPY src ./src

ADD

원격 URL에서 파일을 추가하거나 로컬의 압축 파일을 압축 해제하며 파일을 추가할 수 있다. (COPY와 유사)

ADD https://example.com/big.tar.xz /usr/src/things/

CMD

컨테이너가 시작될 때 실행할 기본 명령어를 정의한다. Dockerfile 내에서 한 번만 사용 가능하다.

CMD["java",'-jar',"app.jar"]

EXPOSE

컨테이너가 리스닝할 포트를 지정한다.

EXPOSE 8080

ENV

환경 변수를 설정한다.

ENV API_KEY="YOUR_API_KEY"

ENTRYPOINT

컨테이너가 시작될 때 실행할 명령어를 설정한다. CMD 와 함께 사용해 애플리케이션의 실행 방식을 정의할 수 있다.

ENTRYPOINT ["python"]
CMD ["app.py"]

WORKDIR

RUN, CMD, ENTRYPOINT,COPY,ADD 명령어가 실행될 작업 디렉터리를 설정한다.

WORKDIR /app

도커파일은 docker build 명령어를 통해 이미지를 빌드한다.

→ 도커파일을 활용함으로써 애플리케이션의 빌드와 배포과정을 표준화하고 자동화할 수 있으며 이는 개발의 효율성을 높인다!



📍도커 이미지 최적화

효율성 향상 / 배포시간 단축/ 보안 강화를 위해 Dockerfile 최적화 전략을 알아보자

1. 경량 베이스 이미지 사용하기

  • 가능한 가장 경량의 베이스 이미지를 사용한다.
    → EX) alpine이미지

2. 멀티 스테이지 빌드 사용하기

  • Dockerfile에서 멀티 스테이지 빌드를 사용해 빌드 단계에만 필요한 도구를 최종 이미지에서 제외시킨다.
    → 이렇게 되면 최종 이미지에는 애플리케이션 실행에 필요한 파일과 디펜던시만 포함된다.
  • 여러개의 FROM명령어를 사용해 구현되고, 각 스테이지는 독립적인 베이스 이미지를 가질 수 있다.
  • 첫번째 스테이지에서는 빌드에 피룡한 도구와 소스 코드를 컴파일 하는데 필요한 작업을 수행한다.
    → 이후 스테이지에서는 첫번째 스테이지에서 생성된 아티팩트만 가지고와 최종 이미지를 생성한다.
    → 불필요한 빌드 도구나 중간 생성물은 최종 이미지에서 제외할 수 있어 이미지 크기가 상당히 줄어든다

3. 필요 없는 파일 제거하기

  • 빌드 과정에서 생성되는 임시 파일, 캐시 파일 등 필요 없는 파일은 RUN 명령어에서 && rm -rf /path/to/temporary/files와 같이 제거해 이미지 크기를 줄일 수 있다.

4. 레이어 수 최소화하기

  • RUN, COPY, ADD 명령어는 새로운 레이어를 생성한다. 이런 명령어를 적절하게 조합해 최소한의 레이어를 생성하도록 최적화한다.

5. COPY와 ADD의 신중한 사용

  • 꼭 필요한 파일만 이미지에 추가하자. .dockerignore파일을 사용해 불필요한 파일은 이미지에 포함되지 않도록 설정한다.

6. 환경 변수를 이용한 설정

  • 가능한 설정파일 대신 환경변수를 사용해 애플리케이션을 구성한다.
    → 설정변경이 필요할 때 이미지를 재빌드하지 않아도 되므로 이미지 크기를 줄이는 데 도움이 된다.

7. 적절한 태그 사용

  • 필요한 소프트웨어의 적절한 버전을 지정해 불필요한 업데이트로 인한 크기 증가를 피한다.


📍 호스트 간 파일 복사

docker 공식문서 - container cp

docker cp 명령어는 실행중인 도커 컨테이너와 호스트 사이에 파일이나 디렉터리를 복사하는데 사용된다.

호스트에서 컨테이너로 파일이나 디렉터리 복사할 때

docker cp <호스트의 파일 경로> <컨테이너 이름>:<컨테이너 내 경로>


컨테이너에서 호스트로 파일이나 디렉터리 복사할 때

docker cp <컨테이너 이름>:<컨테이너 내 파일 경로> <호스트의 경로>


  • 컨테이너 이름 대신 컨테이너 ID도 사용가능하다.
  • 디렉터리를 복사할 때는 디렉터리 내의 모든 파일과 하위 디렉터리가 함께 복사된다.

📍실습 - nginx 파일을 복사해서 초기화면을 바꿔보자 !

1. Nginx 컨테이너 실행

docker run --name sugi-nginx -p 8080:80 -d nginx

본인은 sugi-nginx라는 이름으로 Nginx 컨테이너를 실행했다.

호스트의 8080포트를 컨테이너의 80포트에 연결하였다.

잘 돌아가는 것을 확인할 수 있다.


2. index.html 파일 작성

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>

3. index.html 파일을 컨테이너로 복사

1) 명령어 입력
docker cp index.html sugi-nginx:/usr/share/nginx/html/index.html

2) 확인

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

0개의 댓글