DinD

DinD(Docker in Docker)는 컨테이너 내부에서 Docker 이미지를 빌드하기 위해 컨테이너 안에서 Docker daemon(dockerd)을 구동하는 구조입니다.

Docker가 공개된 2013년 이전의 CI/CD(대표적으로 Jenkins)는 VM이나 베어메탈에 직접적으로 결과물을 배포했기 때문에 Jenkins 서버에 여러 라이브러리의 버전들이 설치되어야만 했습니다.

Before Docker (~2013)

이런 불편함들은 2013년 도커의 등장으로 달라지게 됩니다.

더이상 Jenkins 서버에는 라이브러리를 설치할 필요 없이, 개발자들은 원하는 코드를 이미지로 만들어서 전송한 뒤 Jenkins 서버에서 도커 이미지를 빌드하는 방식으로 변했습니다.

with Docker (2013~)

시간이 더 지나 Jenkins 서버 자체도 컨테이너로 운영할 수 있게되었는데, 기존의 이미지들을 Jenkins 내에서 도커로 빌드하던 방식이 그대로 전이되어 컨테이너 안에서 Docker 데몬을 실행해야 하는 상황이 발생했으며, 이것이 Docker in Docker의 탄생 배경입니다.

Docker in Docker (2015~)

Docker 데몬을 통해서 컨테이너를 생성할 때는 namespace, cgroups 등과 같은 호스트 커널에 접근해야 하는 기능을 갖고 있어야해서 외부 컨테이너 빌드 시 --privileged 옵션이 반드시 필요합니다.

circle-info

privileged 옵션은 컨테이너에 모든 Capabilities를 부여 및 디바이스 접근 제한을 해제하는 옵션입니다.

과거 UNIX 권한 모델은 사용자가 root 권한을 갖거나 일반 사용자 권한만을 가지는 두 가지 선택지밖에 없었지만, 리눅스 커널 2.2부터는 상세한 권한을 컨트롤 할 수 있는 Capabilities가 도입되었습니다.

외부 컨테이너에는 호스트 커널에 접근할 수 있는 권한이 있기 때문에 공격자들은 외부 컨테이너에서 도커 이스케이프(Docker Escape)가 가능합니다.

Abuse

Last updated