# 도커 이미지와 레이어 내용 탐색 도구 'Dive'

> Clean Markdown view of GeekNews topic #12759. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=12759](https://news.hada.io/topic?id=12759)
- GeekNews Markdown: [https://news.hada.io/topic/12759.md](https://news.hada.io/topic/12759.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-01-09T10:06:01+09:00
- Updated: 2024-01-09T10:06:01+09:00
- Original source: [github.com/wagoodman](https://github.com/wagoodman/dive)
- Points: 10
- Comments: 1

## Topic Body

### Docker 이미지 탐색 도구 dive

- **Docker 이미지 분석**: `dive` 명령어와 이미지 태그/ID/다이제스트를 사용하여 Docker 이미지 분석 가능.
- **Docker 명령어 직접 사용**: `alias`를 설정하여 `dive`를 Docker 명령어로 직접 사용 가능.
- **Macbook에서의 빌드**: Docker 컨테이너 엔진만 지원하는 Macbook에서 `dive`를 사용하여 이미지 빌드 및 분석 가능.
- **CI 파이프라인 통합**: `CI=true` 환경 변수 설정으로 UI 없이 이미지 분석 및 공간 낭비 최소화 가능.

### 기본 기능

- **레이어별 Docker 이미지 내용 표시**: 선택한 레이어의 내용과 이전 레이어의 결합된 내용을 오른쪽에서 확인 가능.
- **각 레이어에서 변경된 내용 표시**: 파일 트리에서 변경, 수정, 추가 또는 삭제된 파일 표시.
- **"이미지 효율성" 추정**: 이미지에 포함된 낭비된 공간의 양을 추정하여 효율성 점수와 낭비된 파일 공간 제공.
- **빠른 빌드/분석 주기**: `dive build -t some-tag .` 명령어로 Docker 이미지 빌드 후 즉시 분석 가능.
- **다양한 이미지 소스 및 컨테이너 엔진 지원**: `--source` 옵션으로 컨테이너 이미지를 가져올 위치 선택 가능.

### 설치 방법

- **Ubuntu/Debian**: `curl`과 `apt`를 사용하여 `dive` 설치.
- **RHEL/Centos**: `curl`과 `rpm`을 사용하여 `dive` 설치.
- **Arch Linux**: `pacman`을 통해 설치 가능.
- **Mac**: Homebrew 또는 MacPorts를 사용하거나, 릴리스 페이지에서 Darwin 빌드 다운로드.
- **Windows**: 최신 릴리스 다운로드.
- **Go tools**: Go 버전 1.10 이상 필요, `go get`으로 설치.
- **Nix/NixOS**: `nix-env`을 사용하여 설치.
- **Docker**: `docker pull`로 이미지를 가져오고, 도커 소켓 파일 포함하여 실행.

### CI 통합

- **환경 변수 `CI=true` 설정**: UI 없이 Docker 이미지 분석 및 통과/실패 여부를 반환 코드로 표시.
- **`.dive-ci` 파일을 통한 규칙 설정**: 효율성, 낭비된 공간의 양 및 비율에 따른 통과/실패 기준 설정 가능.

### 키 바인딩

- 다양한 키 바인딩을 통해 UI 내에서 레이어 및 파일 트리 뷰 조작 가능.

### UI 설정

- 설정 파일을 통해 다양한 옵션을 사용자 정의하여 `dive`의 동작을 변경 가능.

GN⁺의 의견
- **중요성**: `dive`는 Docker 이미지의 크기를 최적화하고 낭비를 줄이는 데 매우 유용한 도구임. 이는 클라우드 인프라 비용 절감과 효율적인 리소스 관리에 기여할 수 있음.
- **흥미로움**: Docker 이미지의 각 레이어를 세밀하게 분석하고 변경 사항을 시각적으로 확인할 수 있다는 점은 개발자와 시스템 관리자에게 매우 흥미로운 기능임.
- **도움됨**: CI/CD 파이프라인에 `dive`를 통합함으로써, 자동화된 이미지 분석을 통해 지속적인 품질 관리와 효율성 향상을 도모할 수 있음.

## Comments



### Comment 22108

- Author: neo
- Created: 2024-01-09T10:06:01+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=38913425) 
- **Crane과 go-containerregistry 라이브러리**
  - 이미지 및 레이어 조작에 있어 Crane이 훌륭하며, 이는 go-containerregistry 라이브러리를 기반으로 함.
  - 새로운 레이어 추가, 기존 이미지의 메타데이터(환경 변수, 라벨, 엔트리포인트 등) 수정이 가능.
  - 다중 레이어를 단일 레이어로 "평탄화"하거나, 이미지 "리베이스"(변경 사항을 새로운/업데이트된 베이스 이미지에 재적용)가 가능.
  - 모든 작업은 레지스트리에서 직접 이루어지므로 도커가 필요 없음(원본 이미지 생성 시에는 여전히 유용).
  - [Crane 사용법 링크](https://github.com/google/go-containerregistry/blob/main/cmd/crane/recipes.md)

- **Dive의 유용성**
  - Dive는 도커 이미지 작동 방식과 효율적인 도커파일 작성법 이해에 매우 유용.
  - 문서를 읽는 것과 달리, 도커파일 변경 후 결과적인 레이어 구조에 미치는 영향을 보는 것이 이해에 큰 도움.
  - Dive는 학습과 정확히 무엇을 구축/배포하는지에 대한 자신감을 개발하는 데 필수적인 도구.
  - 레이어 차이를 비교하는 데 사용하는 Dredge라는 다른 도구도 있음.
  - [Dredge 사용법 링크](https://github.com/mthalman/dredge/blob/main/docs/commands/images.md#compare-image-layers)

- **Dive의 숨겨진 특징**
  - Dive는 매우 유용할 뿐만 아니라, 그 저자가 훌륭한 개발자이며 함께 일하기 매우 즐거움.

- **GoLang 사용 이유에 대한 질문**
  - 대부분의 컨테이너/인프라 도구가 GoLang으로 작성된 이유에 대한 궁금증.
  - Docker, Podman, nerdctl, Terraform, Kubernetes 등의 예시.
  - GoLang이 이러한 도구를 구축하는 데 명백한 이점을 제공하는지에 대한 질문.

- **Dive의 실용성**
  - Dive를 매달 여러 번 사용하며, 특정 파일이 레이어에 존재하는지 확인하고 파일 내용을 살펴보고 싶을 때 유용함.
  - 현재는 컨테이너를 실행하거나 파일 내용을 추출하여 폴더를 탐색하는 방식으로 해결.

- **Google의 container-diff 도구**
  - container-diff는 시스템에 무엇을 할지 보여주는 무작위 스크립트를 bash로 파이프하는 것을 확인하는 데 유용함.

- **다른 훌륭한 TUI 터미널 도구들**
  - Dive 외에도 lazydocker, dry와 같은 훌륭한 TUI 터미널 도구들이 있음.
  - 도커 범주 내의 도구들도 있음.
  - [터미널 도구 링크](https://terminaltrove.com/)

- **도커가 tar 아카이브를 사용하는 이유**
  - 도커가 레이어 내용을 위해 일반 디렉토리 대신 tar 아카이브를 사용하는 이유에 대한 의문.
  - 해당 도구는 원래 존재하지 않아야 할 문제를 해결함.

- **Dive의 놀라운 효과**
  - Dive는 여러 번 큰 도움이 되었으며 레이어에 대해 많은 것을 배울 수 있게 함.
  - Docker Desktop이 그 기능을 모방할 정도로 우수함.
