Table of Contents
현재 Docker 는 위기를 겪고 있다고 말하고 있지만, 여전히 간단하게 애플리케이션을 사용하기에는 이만한게 없다. 프로젝트를 하면서 Docker 를 다시 다루게 되었는데, 간단하게 설정을 변경하는 방법에 대해서 다룬다.
설정 변경 사항
설정 변경은 많은걸 할 것은 아니고, 다음과 같은 부분이다.
- Docker 로컬 저장소 변경
- 로깅 변경하기
이 두가지는 거의 필수로 하게 된다.
containerd
containerd 는 실제로 컨테이너를 실행, 관리하는 핵심이다. 다음과 같이 정의할 수 있다.
컨테이너 실행을 위한 핵심 기능만 제공하는 런타임 데몬
실제로 컨테이너를 다룬다는 점에서 Docker 와 다르며, Docker 없이도 독자적으로 작동이 가능하다. 다음과 같은 역할을 한다.
- 컨네이터 생성/시작/중지
- 이미지 pull/push
- 이미지 관리
- 네임스페이스 관리
- runc 호출
- OCI 표준 준수
따라서, 컨테이너 실행에 필요한 최소 기능만 담당한다고 할 수 있다.
Docker
Docker는 containerd 위에 다음 기능들을 얹어서 “플랫폼”을 만든다.
- Docker CLI (docker run, docker ps)
- Docker API
- Docker Build (buildx)
- Docker Compose
- 네트워크 드라이버
- 볼륨 드라이버
- Swarm
- 로그 드라이버
- 이미지 빌드 시스템
따라서, Docker 는 개발 경험 + 생태계 + 편의 기능을 제공하는 상위 플랫폼이다.
아키텍쳐는 대략 다음과 같다.
Docker CLI (docker run, docker ps 등)
↓
Docker Engine API (dockerd)
↓
containerd (컨테이너 관리)
↓
runc (컨테이너 생성/실행)
↓
Linux Namespace / Cgroups
컨테이너 이미지 중복 저장
한가지 문제가 있다. Docker, Containerd 는 각각 자기만의 컨테이너 이미지를 저장한다. 똑같은 이미지를 이중으로 저장하는 문제가 발생하는 것이다. AI 관련 이미지들, 예를들면 vllm 같은 경우에는 30GB 정도로 큰데 Docker 를 사용하게 되면 이미지를 60GB 가 저장된다.
컨테이너 이미지 저장 방식도 다르다. Docker 의 경우에는 overlay2 방식을 사용하지만 Containerd 는 blob 이며 스냅샷은 overlayfs 이다. 따라서 서로 호환이 되지 않는다. 이는 디렉토리 구조를 보면 명확해진다.
|
1 2 3 4 5 6 |
## Docker 저장소. /var/lib/docker/overlay2/ ← 이미지 레이어 /var/lib/docker/image/ ← 이미지 메타데이터 ## Containerd 저장소 /var/lib/containerd/io.containerd.content.v1.content/ ← blob /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/ ← 레이어 |
Docker 명령어에서 이미지를 가지고 오거나 Docker 를 이용해서 이미지를 빌드하게 되면 역시나 Containerd 저장소에 저장이 된다. 따라서 Docker 를 사용할 경우에 컨테이너 저장소를 고려해 용량을 두배로 계산해야 한다.
Docker 저장소 변경
Docker 설정 파일은 ‘/etc/docker/daemon.json’ 이다. 이 파일을 편집하면 된다.
|
1 2 3 4 5 6 7 8 9 |
# /etc/docker/daemon.json { "data-root": "/opt/docker-data", "log-driver": "local", "log-opts": { "max-size": "50m", "max-file": "10" } } |
data-root 항목에서 저장할 위치를 지정해 주면 된다.
Docker 로그 드라이버
Docker 설정에서 로그 드라이버를 local 로 설정했다. 기본값은 json-file 이다. 그런데, 이 로그 드라이버는 다음과 같은 문제가 있다.
- 성능이 느림.
- 자동 로그 로테이션이 없음. 따라서 용량이 무제한으로 늘어날 수 있음.
- plaintext 로 저장
따라서 실제 운영환경에서는 local 를 권장하고 있다. json-file 의 로그는 텍스트 파일로 저장되는데 반해, local 은 바이너리로 저장된다. 만일 드라이버를 json-file 로 한다면 위 예제처럼 로그 로테이션 설정을 해줘야 한다.
Containerd 저장소 변경
Containerd 도 ‘/etc/containerd/config.toml’ 파일에 설정을 저장한다. 한가지 Docker 설정과 다른점은 여러가지 설정들이 함께 포함된 파일이여야 한다. 따라서 Containerd 의 기본 설정 정보를 config.toml 에 담아야 한다.
|
1 |
$ containerd config default | sudo tee /etc/containerd/config.toml |
위 명령어를 실행하면 ‘/etc/containerd/config.toml’ 기본 설정 내용이 파일로 저장된다.
이제 이 파일을 열어서 다음과 같이 변경하면 된다.
|
1 2 3 |
1 version = 3 - 2 root = '/var/lib/containerd' + 3 root = '/opt/containerd' #containerd 저장소 변경 설정 |
위와같이 설정을 변경하면 된다.