본문 바로가기

IT 인프라

도커 이미지 다루기 : 빌드, dockerfile, 저장소, 이미지 경량화 전략

728x90

본 포스팅 범위

도커 이미지 다루기

이미지 빌드, dockerfile, 저장소, 이미지 압축파일 저장/불러오기, 이미지 경량화 전략


도커 이미지 빌드

도커 이미지 구조(이미지 레이어, 컨테이너 레이어)

도커 이미지는 os(ex.ubuntu) → ex.nginx → web app 순차적 단계가 지날수록 layer가 쌓인다. 이미지를 실행하면 도커 컨테이너가 되는데, 이는 Image layer(Read Only)와 Container layer(Read/Write layer) 로 구성된다.

 

컨테이너가 삭제되면 Container layer도 삭제됨에 유의해야 한다. 휘발성이다. → 볼륨 연결 필요함

 

 

Dockerfile 없이 이미지 생성(기존 컨테이너 기반 새 이미지 생성)

docker commit도 git과 비슷하게 변경점을 저장하는 명령어이다. 도커파일 없이 기존 컨테이너 기반으로 해당 컨테이너의 변경사항을 만들고, 새 이미지로 commit 가능하다. 

 

docker inspect로 확인하면 layer가 두개 이상으로 구성됨을 알 수 있다. 나중에 업데이트 된 layer가 위에 쌓인다.

 

Dockerfile 이용해 이미지 생성

Dockerfile을 기반으로 새 이미지를 생성할 수 있다. 너무 당연한 말이다. 하단 우측 이미지는 기반되는 Dockerfile 경로 지정 유무에 따른 빌드 명령어 예시이다. 

docker build -t my_app:v2   같은 명렁어 수행 후, 파일 수정 후 재 빌드시 초반 layer 들은 "Using cache" 로그가 뜨는데, 기존 layer는 캐시를 사용함을 볼수 있다. 

 

빌드 컨텍스트(Build Context)

빌드 컨텍스트 : 도커 빌드 명령 수행 시 현재 디렉토리(Current Working Directory). 리눅스의 cd와 비슷하다.

Dockerfile로 이미지 빌드에 필요한 정보를 도커데몬에 전달하기 위한 목적으로 사용한다.

 

WORKDIR  [ 경로 ]  : 기입한 경로를 working Dir로 설정, set working directory(리눅스 명령어 cd랑 비슷

 

 

 

.dockerignore

git의 .gitignore와 동일한 문법으로, 특정 디렉토리 or 파일 목록을 빌드 켄텍스트에 제외하려는 목적이다. 필요 없는 파일도 복사되면 비효율적이다. 최대한 가볍게 해야 함.

 

Dockerfile

Dockerfile은 도커 이미지를 만들기 위한 스크립트이다. Dockerfile 문법은 Format 과 주석, 그리고 지시어와 argument 로 구성되어 있다. 자세한 내용은 공식 웹사이트 참고.

https://docs.docker.com/engine/reference/builder/

 

Dockerfile reference

 

docs.docker.com

 

이미지 압축파일로 저장 및 불러오기

인터넷 안되는 환경도 가능한 방법이다. 이미지를 압축파일로 저장하고 불러온다. 이미지 저장ㅈ 전, docer images로 목록을 확인하고 진행하면 된다. 

 

이미지 경량화 전략

이미지 경량화 시키기 위한 4가지 방법을 소개한다.

1. 꼭 필요한 패키지 및 파일만 추가한다. 

이미지는 경량화 시켜야 한다. 컨테이너는 한 개 프로세스 실행에 초점이 맞춰진 기술이기 때문이다.

2. 컨테이너 레이어 수 줄이기

컨테이너 레이어 수 = 도커파일의 지시어 수. 예를 들어 RUN이란 지시어가 여러번 나올 경우, 하나의 RUN 지시어로 통합해 하나의 layer를 형성한다.

 

3. 경량 베이스 이미지를 선택한다.

종류로 debian의 slim, alpine 리눅스 distribution, stretch(파일 시스템 존재하는 빈 것. 고랭 같은 언어에서 바이너리 컴파일 후 stretch 언어에 복사해 사용한다.

 

4. 멀티 스테이지 빌드를 사용한다. 

도커 기능엔 멀티 스테이지 빌드, 빌드 스테이지, 릴리즈 스테이지로 나눠 경량화 시킨다. 예시처럼 base 블락을 기본으로 두고(as로 지정) 이용한다. 

 

 Dockerfile 옵션 중, RUN 중에 "--no-cache" 는 캐시를 사용하지 않는다는 것에 주의해야 함. 

   캐시 사용하지 않아야 가볍다. 캐시 사용시 쓸데 없는 파일도 같이 복사되기 때문이다.

 

도커 이미지 경량화 전략 - 멀티 스테이지 빌드 사용 from - as - 로 정의함. build, release는 동일한 base block을 기반으로 간단히 이용. 하단 좌측처럼 base로 만들어두고 layer로 이용하는 방법. 빌드때 사용하는 의존성이 크면 클수록 차이는 벌어짐. 

 

끝.


같이 보면 좋을 글

컨테이너 기술의 발전과 minikube 기본 명령어

도커 구성요소, 이미지와 컨테이너, 명령어 그리고 컨테이너 다루기 위한 기능(엔트리포인트, 로그 등)

728x90