Docker 데몬에서 containerd 실행하기

Docker 데몬에서 containerd 실행하기 (Run containerd in the Docker daemon)

Docker Engine 29.7.0부터 Docker 데몬은 dockerd와 같은 프로세스 안에서 containerd를 실행할 수 있어요. 기본적으로 데몬은 containerd를 별도 프로세스로 시작하고 관리해요.

Caution Embedded containerd는 실험적 기능이에요. 그 동작이 바뀌거나 기능이 향후 릴리스에서 제거될 수 있어요.

출처: 문서

본문

Embedded 모드는 데몬이 containerd를 시작하고 통신하는 방식을 바꿔요. 임베디드 서버는 여전히 containerd 소켓에서 수신 대기하지만, 데몬과 BuildKit은 대신 인메모리 연결로 그 소켓에 도달해요. 태스크 shim은 계속 별도 프로세스로 실행되고 소켓으로 연결돼요.

성능 이점은 Docker가 containerd image store를 사용할 때 가장 큽니다. 이미지 상호작용은 메타데이터 요청과 이미지 매니페스트, 구성, 레이어를 구성하는 바이트 모두에 containerd의 콘텐츠 API를 사용해요. 별도의 containerd 프로세스는 이 읽기·쓰기를 Unix 소켓이나 명명된 파이프를 가로지르는 gRPC 메시지로 나눠요. Embedded 모드는 같은 메시지를 인메모리 연결로 보내 이 데이터가 많이 오가는 경로에서 운영 체제 소켓 호출과 커널 전송을 피해요.

임베디드 서버는 컨테이너 런타임 인터페이스(CRI)를 포함하지 않아요. embedded-containerdcri-containerd를 동시에 활성화할 수 없어요.

Embedded containerd 활성화 (Enable embedded containerd)

embedded-containerd 기능을 데몬 구성 파일에 추가해요:

{
  "features": {
    "embedded-containerd": true
  }
}

Docker 데몬을 재시작해요:

$ sudo systemctl restart docker

embedded-containerd 기능은 --containerd 데몬 플래그로 설정된 containerd 주소보다 우선해요. 이 동작은 containerd 주소를 설정하는 패키지형 서비스 구성이 embedded containerd가 시작되는 것을 막지 않음을 의미해요.

Important Embedded containerd는 그 상태를 Docker 데이터 루트 아래, 기본적으로 /var/lib/docker/containerd/daemon에 유지해요. 호스트에 설치된 containerd는 /var/lib/containerd 같은 다른 곳에 자체 상태를 유지해요. 데몬이 이전에 그런 containerd를 사용했다면 거기에 저장된 컨테이너와 이미지는 embedded 모드에서 사용할 수 없어요.

dockerd를 수동으로 시작할 때 기능을 활성화할 수도 있어요:

$ sudo dockerd --feature embedded-containerd

구성 확인 (Verify the configuration)

docker info를 실행하고 실험적 모드 경고를 확인해요:

$ docker info
...
NOTE: Running with experimental embedded-containerd mode. In a future release,
this mode may be used by default when no system containerd is available, rather
than starting and supervising a separate containerd process. The option used to
enable this mode may also change.

임베디드 containerd에 직접 연결 (Connect directly to embedded containerd)

임베디드 서버는 ctrnerdctl 같은 containerd 클라이언트를 위한 엔드포인트를 제공해요. Linux에서 엔드포인트는 <exec-root>/containerd/containerd.sock이에요. 기본 데몬 구성에서 이 경로는:

/var/run/docker/containerd/containerd.sock

Windows에서 서버는 기본적으로 명명된 파이프를 사용해요. 엔드포인트 주소는 Docker 데몬 시작 로그에서 확인해요.

Docker Engine은 기본적으로 moby containerd 네임스페이스에 컨테이너를 저장해요. 예를 들어 Linux에서 ctr로 나열해요:

$ sudo ctr --address /var/run/docker/containerd/containerd.sock \
  --namespace moby containers list

Warning 엔드포인트는 디버깅에 유용하지만, 데몬이 그 뒤의 상태를 소유해요. 범용 containerd 엔드포인트로 취급하지 마세요: 그 주소와 네임스페이스의 배치는 바뀔 수 있고, 다른 클라이언트가 만든 변경은 데몬과 충돌할 수 있어요.

더 알아보기 (Learn more)