ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 도커 아홉번째
    프로그래밍/Docker 2024. 1. 16. 21:48

     

     

    Dockerfile 최적화

    - 고려요소

    1. 빌드시간

    2. 이미지 크기

    3. 재사용성

    4. 보안

    5. 유지보수성  

    기타 등등

     

    - 경량의 컨테이너 서비스 제공이 목적

     

     


     

     

    최적화방안

    1. 컨테이너 이미지에서 불필요한 바이너리를 모두 제거하여 이미지 경량화

    - 설치된 패키지파일  autoremonve, clean 등으로 제거

    - apt install -y --no-install-recommencs <패키지명>  을 사용하여 패키지 설치 시 불필요한 패키지 설치 방지

    - 이미지 내부에 빌드와 관련없는 불필요한 파일을 포함하지 않기 위해 dockerignore 사용

     

    2. 베이스 이미지를 alpine Linux  또는 scratch 사용

     

    3. multi-stage build 를 사용하여 최종 이미지 크기를 최소화한다.

    - multi-stage build (다단계 빌드)는 여러개의 베이스 이미지를 사용한 도커 빌드

    - 도커파일의 FROM 명령어가 2개 이상 사용되어 분리된 작업 공간(stage)을 제공

    - 첫번쨰 stage (빌드도구) 에서 생성된 실행파일 등을 두번째 stage (배포이미지) 에 제공

      마지막에 실행된 stage 작업이 도커 이미지로 최종생성되어 이미지 크기가 감소

     

     

    4. 도커파일 작성 시 생성되는 레이어 수 최소화를 고려하면 빌드 시간 및 이미지 용량 최적화 가능

    - 레이어 수를 최소화 하기 위해선 명령을 결합 (그룹화) 하여 사용

     

    tmi.  도커 이미지가 가질 수있는 최대 레이어 수는 127개이다. 

        초과시  도커파일 빌드 시  최대 레이어 수 초과 오류가 발생한다.

       Error response from daemon: maximum number of layers exceeded

     

     


     

    One application ~ One container

    - 한 컨테이너에 2개 이상의 어플리케이션을 설정하게 되면 결합성이 높아지고, 확장성을 저해한다.

    하나의 컨테이너에 하나의 어플리케이션은 컨테이너 간의 독립성을 보장함과 동시에 어플리케이션 버전관리, 소스코드 모듈화의 장점을 제공

     

    - 모놀리식 구성보다 결합 해제된 어플리케이션(Decouple applications) 설계

      MSA 지향적 설계를 고려해야 장애가 발생해도 어플리케이션 자체가 유지될 수 있게 된다.

     

    - 여러 컨테이너로 분리시 수평확장이 용이하며,  재사용성이 좋아진다.

    예를 들어 3-tier- 웹 어플리케이션은 FE - BE - DB 로 컨테이너를 분리하여 관리하는 것을 권장

     

     

     


     

    Using cache

    - 도커파일을 통해이미지를 빌드하면 자동으로 각 명령어 단위로 캐싱 (caching, 임시 이미지 생성) 한다.

     

    - 동일 명령의 실행은 이 캐싱을 통해 재사용되기 때문에 빌드 속도를 빠르게 한다.

      하지만 캐싱에 사용된 명령줄이 변경되면 (캐시 사용시  checksum을 통해 검증)  기존 캐싱은 사용하지 못하고 재 캐싱된다.

     

    - 캐싱 효과를 높이기 위해 명령어의 위치를 명확히 하는것이 좋다.

      일정하게 유지되는 명령은 도커파일 위쪽에 배치 (패키지 설치 등), 

      변경될 수 있는 명령은 아래쪽에 배치 (COPY같은 빌드 단계) 하면 기존 캐시를 재 캐싱할 가능성이 줄어든다.

     

     


     

     

    보안 강화

    root 사용자 금지

    - root 사용자일 경우  컨테이너 어플리케이션 실행을 통해 도커 호스트에 대한 접근이 가능해진다.

    - 도커파일에서 USER 명령어 사용으로 root 사용자 접근을 제한해야함.

     

    이미지 서명

    - 이미지 서명이 사용되면 컨텐츠가 신뢰할 수 있는 소스에서 생성되었고 위,변조가 발생하지 않았음을 보장함

      - Docker Signer( docker trust sign)

      - Notary (by Harbor)

      - DCT (Docker Contents Trust) -> export DOCKER_CONTENT_TRUST= 1

           기본적으로 DCT가 적용되어 있으며,  환경설정에서 값을 1로 넣어두고 쓰면

           다운로드 시에 태깅키를 이용해서 이미지 위변조 확인 가능

      - 익숙하지않은 이미지의 경우 "Dive" 를 사용하여 이미지검사 수행

          SETUID 및 SETGID 비트가 있는 모든 바이너리를 찾아서 제거해야함.

          이 바이너리는 권한을 escalation하는데 사용되기 때문

     

     


     

     

    Dockerfile  build 방법

    docker build -t IMAGE_NAME:TAG [-f DOCKERFILE_NAME] DOCKERFILE_LOCATION
    
    - IMAGE_NAME:TAG   -> -t 생성할 이미지명:버전
    - DOCKERFILE_NAME  -> 기본 Dockerfile이 아닌 다른 파일명인 경우 -f 사용
    - DOCKERFILE_LOCATION -> 현재 경로면 "." | 다른 경로명 명시

     

     

     

    '프로그래밍 > Docker' 카테고리의 다른 글

    도커 열번째 - 도커 컴포즈  (0) 2024.01.18
    도커 여덟번째  (0) 2024.01.16
    도커 일곱번째  (0) 2024.01.15
    도커 여섯번째  (1) 2024.01.15
    도커 다섯번째  (0) 2024.01.14
Designed by Tistory.