고양이 여름이의 지식채널

도커 운용시 팁과 요령 (docker 캐싱, 최적화, 파일정리) 본문

Programming/Docker

도커 운용시 팁과 요령 (docker 캐싱, 최적화, 파일정리)

썸머캣 2023. 3. 6. 21:54

docker를 최대한 활용할 수 있도록 도와주는 몇 가지 팁과 요령에 대해서 포스팅합니다.


  • 도커 파일 캐싱 (dockerfile caching)
FROM python:3.9.5-slim-buster

# 작업 디렉토리 설정
WORKDIR /app

# requirements.txt 파일 복사
COPY requirements.txt .

# 필요한 패키지 설치
RUN apt-get update && apt-get install -y build-essential

# 기본적으로 캐싱이 되나 --no-cache-dir 옵션을 사용하면 캐싱하지 않음
# RUN pip install -r --no-cache-dir  requirements.txt
RUN pip install -r requirements.txt

# 소스 코드 복사
COPY . .

# Flask 서버 실행
CMD ["python", "app.py"]

 

Dockerfile 캐싱을 적절하게 활용하면 빌드 시간을 단축할 수 있습니다. 위의 예시에서는 requirements.txt 파일의 변경이 없는 경우, 이전에 생성된 레이어를 재사용하여 새로운 레이어를 생성하지 않습니다. 또한 requirements.txt 파일의 의존성 패키지 버전이 변경되지 않는 한, pip 캐시를 이용하여 이미 설치된 패키지를 재사용합니다. 이러한 방식으로 Dockerfile 캐싱을 적절하게 활용하면 빌드 시간을 단축할 수 있습니다.

 

Docker는 이미 존재하는 레이어를 재사용하여 Dockerfile 캐싱을 이용합니다. 이전에 생성된 레이어와 동일한 파일 시스템이나 명령어가 있는 경우, Docker는 해당 레이어를 재사용하고 새로운 레이어를 만들지 않습니다.

따라서, Dockerfile 캐싱을 적절하게 활용하면 빌드 시간을 단축할 수 있습니다. 하지만 Dockerfile 캐싱이 적용되지 않는 경우도 있습니다. 예를 들어, 파일의 내용이 변경된 경우나 명령어가 변경된 경우는 이전에 생성된 레이어를 재사용할 수 없습니다. 이러한 경우에는 Dockerfile 캐싱을 이용할 수 없습니다.

 

 

  • 컨테이너 빌드 최적화 (Optimize Container Builds)

레이어를 많이 사용하는 경우 컨테이너를 만드는 데 시간이 오래 걸릴 수 있습니다. 컨테이너 빌드를 최적화하기 위해 다단계 빌드를 사용하여 레이어 수를 줄이고 이미지 크기를 최소화할 수 있습니다.

# Build stage
FROM node:latest as build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# Production stage
FROM node:latest
WORKDIR /app
COPY --from=build /app/dist /app
CMD ["npm", "start"]

위의 Dockerfile은 두 개의 스테이지로 나누어져 있습니다. 첫 번째 스테이지(build)는 소스 코드를 빌드하고, 두 번째 스테이지(Production)는 빌드된 파일을 실행하는 역할을 합니다. 이를 이용하여 Dockerfile 캐싱을 최대한 활용할 수 있습니다.

  • FROM node:latest as build : 베이스 이미지로 node:latest를 사용합니다. as build는 이후에 사용할 스테이지의 이름을 지정합니다.
  • WORKDIR /app : 작업 디렉토리를 /app으로 설정합니다.
  • COPY package*.json ./ : 로컬 파일 시스템에서 package.json과 package-lock.json 파일을 Docker 이미지 내부의 현재 디렉토리로 복사합니다.
  • RUN npm install : package.json과 package-lock.json 파일에 명시된 의존성 패키지를 설치합니다.
  • COPY . . : 로컬 파일 시스템에서 소스 코드를 Docker 이미지 내부의 현재 디렉토리로 복사합니다.
  • RUN npm run build : 소스 코드를 빌드합니다.
  • FROM node:latest : 베이스 이미지로 node:latest를 사용합니다.
  • WORKDIR /app : 작업 디렉토리를 /app으로 설정합니다.
  • COPY --from=build /app/dist /app : 이전 스테이지에서 빌드된 파일을 복사합니다.
  • CMD ["npm", "start"] : 컨테이너가 시작될 때 실행할 명령어를 설정합니다. 이 예제에서는 npm start 명령어를 실행합니다.

이러한 방식으로 Dockerfile 캐싱을 최대한 활용할 수 있습니다. package.json 파일의 변경이 없는 경우, 이전에 생성된 레이어를 재사용하여 새로운 레이어를 생성하지 않습니다. 또한 package.json 파일의 의존성 패키지 버전이 변경되지 않는 한, 이미 설치된 패키지를 재사용할 수 있습니다. 이러한 방식으로 Dockerfile 캐싱을 적절하게 활용하면 빌드 시간을 단축할 수 있습니다.

 

 

반응형

 

 

  • 사용하지 않는 Images 및 Containers 정리

시간이 지남에 따라 Docker는 디스크 공간을 차지하는, 사용되지 않는 이미지와 컨테이너를 많이 쌓일 수 있습니다. 이것은 도커 시스템 제거 명령으로 정리 할 수 있습니다.

docker system prune --all --force --volumes

 

  • 다중 컨테이너 애플리케이션에 Docker Compose 사용

다중 컨테이너 응용프로그램을 실행하는 경우 Docker Compose를 사용하여 응용프로그램을 보다 쉽게 관리할 수 있습니다. 단일 YAML 파일을 사용하면 모든 서비스, 네트워크 및 볼륨을 정의하고 단일 명령으로 모든 서비스를 시작할 수 있습니다.

version: "3"
services:
  web:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - db
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: password
volumes:
  db-data:

 

 


 

도커 파일 작업 및 사용자 정의 이미지 작성 (Dockerfile/image)

 

도커 파일 작업 및 사용자 정의 이미지 작성 (Dockerfile/image)

도커 파일은 도커 이미지를 빌드하는 방법에 대한 지침을 포함하는 스크립트입니다. 도커 이미지는 코드, 런타임, 시스템 도구, 라이브러리 및 설정을 포함하여 소프트웨어를 실행하는 데 필요

summer-cat93.tistory.com

 

 

728x90
반응형
Comments