Docker-in-Docker가 왜 나쁜 것으로 간주됩니까?


21

인 2013 년 8 월 제롬 Petazzoni가 고정 표시기 도커을 생성, dind짧게,이 도커 컨테이너 부두 노동자 컨테이너의 내부를 생성 할 수,이 기능의 결과로 매우 인기가 입증 제롬의 GitHub의 저장소 천 별과 삼백 포크를 통해 수신하는 단계를 포함한다.

2 년 후 2015 년 8 월에 출시 된 Docker 1.8에서 Docker in Docker는 Docker에서 바로 지원됩니다. 그러나 Docker에서 Docker를 사용하면 Jérôme의 Post : CI 또는 테스트 환경에 Docker-in-Docker 사용 과 관련하여 경고가 나타납니다 . 두 번 생각. Docker in Docker가 Continuous Integration에 적합하지 않은 이유에 중점을 둡니다.

Docker에서 Docker를 사용하는 것이 왜 나쁜 것으로 간주됩니까? 거북을 완전히 피하는 경우 일까요? 또는 성능 고려 사항?

거북 거꾸로!


나는 그것에 대해 읽은 것 외에 도커에 익숙하지 않습니다. 그러나 그것에 대해 생각하면 하드웨어에 호스트 OS가 있고 호스트가 컨테이너를로드 한 다음 컨테이너가 다른 것을로드하는 것처럼 느껴집니다. 아이디어는 이미지를 배포하는 것이므로 많은 오버 헤드처럼 보입니다. 그림의 그림 그림 ...이 질문에 대한 실제 답변에 관심이 있습니다.
환불 불가 환불 불가

당신은 당신의 질문에 대한 답변을 연결하고 있습니다 ... 또는 내가 뭔가를 놓치고 있습니까?
AnoE

답변:


16

지속적인 통합 문제

한마디로 : Docker in Docker (dind)는 동시성을 잘 처리하지 못합니다.

CI에 dind를 사용하지 않아야하는 이유는 Docker가 스토리지에 사용하는 디렉토리 (일반적으로 /var/lib/docker)에 독점적으로 액세스 할 수 있도록 설계 되었기 때문 입니다. 모든 하위 프로세스가이 디렉토리를 동시에 사용하므로 Dind는이를 존중하지 않습니다. CI를 사용하여 다시 빌드 할 때마다이 디렉토리의 앱과 관련된 모든 항목이 지워지고 0부터 시작될 수 있습니다. 사용자가 결제 세부 정보를 입력하고 "구매"를 클릭 한 후 갑자기 아무 일도하지 않은 것처럼 로그인 화면에서 자신을 다시 발견 한 경우 사용자가이를 어떻게 좋아합니까? 그것은 좋은 UX가 아닙니다. 두 번의 재 구축이 한 번에 발생합니까? 그것은 데이터 무결성을 포함하여 관련된 모든 사람들에게 나쁜 결과를 초래할 것입니다.

다른 문제

OP가 게시 한 링크에서 시스템은 명시 적으로 금지되지 않는 한 하위 컨테이너가 외부 컨테이너의 리소스에 액세스 할 수있는 매우 "CSS와 같은"방식으로 보안 정책을 적용하려고 할 때 보안 문제가 발생합니다. "mywebsite.com/../another_folder/private_resource.txt"와 같은 작업을 수행하여 웹 서버 리소스에 액세스 할 수있는 시점을 기억하십니까? 또한 때때로 파일 시스템은 이런 방식으로 중첩 될 때 서로 잘 작동하지 않습니다.

수정

고맙게도 OP의 블로그 게시물에는이 문제에 대한 좋은 해결책이 있습니다. "Docker에서 실행되는 CI 시스템 자체에서 Docker 컨테이너 빌드 / 실행 / 푸시"로 사용자 요구가 충족되지 않는 한, Docker 소켓 (일반적으로 )의 -v모드 를 사용 하여 컨테이너에 데이터 볼륨을 추가 할 수 있습니다. /var/run/docker.sock:/var/run/docker.sock"공유"데이터 볼륨에 액세스해야합니다. 이 컨테이너는 동기 IO를 강제 ​​실행하는 대신 상위와 함께 시작됩니다. 이제는 거의 동일한 것과 거의 동일하지만 Docker와 함께 제공되는 단점은 동시성을 위해 빌드되지 않습니다.

참조 (OP에서) : CI 또는 테스트 환경에 Docker-in-Docker를 사용하십니까? 두 번 생각.


다음은 Jenkins에 대한 설명 된 접근 방식 (dood)의 한 예입니다. hub.docker.com/r/psharkey/jenkins-dood
rombob

1. dind 내 경우에는 피해야한다하면 난 아직도 정말 말할 수없는이 설명 ... 고정 표시기 컨테이너 내 빌드 에이전트 실행, 그리고에서 다음을 수행 Checkout repo.2. Start container & mount repo.3. Run some build-/test script inside container.'어느 하나가, 에이전트 당을 컨테이너가 작동합니다. 이 사용 사례에서 여전히 문제가 있습니까?
helmesjo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.