-
도커 아홉번째프로그래밍/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 -> 현재 경로면 "." | 다른 경로명 명시