도커 안에서 도커를 실행해도 괜찮습니까?
젠킨스를 도커 컨테이너 안에서 조종하고 있어요젠킨스 컨테이너도 도커 호스트가 될 수 있는지 궁금합니다.제가 생각하는 것은 Jenkins 내부에서 각 통합 테스트 빌드에 대한 새로운 도커 컨테이너를 시작하는 것입니다(데이터베이스, 메시지 브로커 등).따라서 통합 테스트가 완료된 후에는 컨테이너를 종료해야 합니다.이런 식으로 다른 도커 컨테이너 내부에서 도커 컨테이너를 실행하지 않는 이유가 있습니까?
Docker 내부에서 Docker를 실행하는 것은 가능한 한 피해야 합니다(아래 출처 제공).대신 주 컨테이너가 형제 컨테이너를 생성하고 통신할 수 있는 방법을 설정하려고 합니다.
도커가 도커 컨테이너 안에서 실행할 수 있게 만든 기능의 저자 제롬 페타조니는 실제로 블로그에 그러지 말라고 글을 올렸습니다.그가 설명한 사용 사례는 다른 Docker 컨테이너 내에서 작업을 실행해야 하는 CI Docker 컨테이너의 OP 사용 사례와 정확히 일치합니다.
Petazzoni는 dind가 문제가 되는 두 가지 이유를 설명합니다.
- LSM(Linux Security Module)과는 잘 호환되지 않습니다.
- 파일 시스템에 불일치가 발생하여 상위 컨테이너 내부에 생성된 컨테이너에 문제가 발생합니다.
그 블로그 게시물에서 그는 다음과 같은 대안을 설명합니다.
을 CI에 바인드 컨테이너에
-v
깃발간단히 말해 CI 컨테이너(Jenkins 등)를 시작할 때 Docker-in-Docker와 함께 무언가를 해킹하는 대신 다음과 같이 시작합니다.
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
이제 이 컨테이너는 도커 소켓에 액세스할 수 있으므로 컨테이너를 시작할 수 있습니다.그러나 "하위" 컨테이너를 시작하는 대신 "동반" 컨테이너를 시작합니다.
저는 도커 내부에서 도커 컨테이너를 실행하는 방법에 대해 이전에 비슷한 질문에 답했습니다.
도커 내부에서 도커를 실행하는 것은 확실히 가능합니다.중요한 것은 당신이
run
추가 권한이 있는 외부 컨테이너(다음으로 시작)--privileged=true
그런 다음 해당 컨테이너에 도커를 설치합니다.자세한 내용은 다음 블로그 게시물을 참조하십시오.도커 인 도커.
이 항목에는 이에 대한 잠재적인 사용 사례가 설명되어 있습니다.블로그에서는 젠킨스 도커 컨테이너 내에서 도커 컨테이너를 만드는 방법을 설명합니다.
그러나 Docker 내부의 Docker는 이러한 유형의 문제를 해결하는 데 권장되는 접근 방식이 아닙니다.대신 이 게시물에 설명된 대로 "동반" 컨테이너를 만드는 것이 권장됩니다.
그래서 많은 사람들이 도커 내부에서 도커를 실행하는 것이 이러한 유형의 문제에 대한 좋은 해결책이라고 생각했습니다.이제 추세는 "형제" 컨테이너를 대신 사용하는 것입니다.자세한 내용은 이 페이지의 @predmijat의 답변을 참조하십시오.
Docker-in-Docker(DinD)를 실행하는 것은 괜찮으며, 실제로 Docker(회사)는 이를 위한 공식 DinD 이미지를 가지고 있습니다.
그러나 주의할 점은 권한이 있는 컨테이너가 필요하며 보안 요구에 따라 실행 가능한 대안이 될 수 없다는 것입니다.
형제 컨테이너(Docker-out-of-Docker 또는 DooD)를 사용하여 Docker를 실행하는 대체 솔루션에는 권한 있는 컨테이너가 필요하지 않지만 실행 중인 컨텍스트와 다른 컨텍스트에서 컨테이너를 실행한다는 사실(즉, 내부에서 컨테이너를 실행함)에서 발생하는 몇 가지 단점이 있습니다.컨테이너(컨테이너 내부가 아닌 호스트 수준에서 실행됨).
저는 여기에 DinD 대 DooD의 장단점을 설명하는 블로그를 썼습니다.
그렇긴 해도, Nestybox(내가 막 설립한 스타트업)는 (권한 있는 컨테이너를 사용하지 않고) 진정한 Docker-in-Docker를 안전하게 실행하는 솔루션을 개발하고 있습니다.www.nestybox.com 에서 확인하실 수 있습니다.
예, 도커에서 도커를 실행할 수 있습니다. 유닉스 소켓을 연결해야 합니다./var/run/docker.sock
도커에 합니다.-v /var/run/docker.sock:/var/run/docker.sock
에 대한 수 . 도커 데몬 소켓에 권한 문제가 발생할 수 .sudo chmod 757 /var/run/docker.sock
.
또한 도커를 특권 모드로 실행해야 하므로 명령은 다음과 같습니다.
sudo chmod 757 /var/run/docker.sock
docker run --privileged=true -v /var/run/docker.sock:/var/run/docker.sock -it ...
저는 지난 며칠 동안 당신처럼 컨테이너 안에서 컨테이너를 가동하기 위해 최선을 다했습니다.많은 시간을 낭비했습니다.지금까지 대부분의 사람들은 메인 컨테이너가 Ubuntu OS가 필요하기 때문에 도커의 DIND 이미지를 사용하거나 권한 명령을 실행하여 데몬 소켓을 컨테이너에 매핑하는 것과 같은 작업을 하라고 조언합니다.(나한테는 절대 통하지 않는 것)
제가 찾은 해결책은 Ubuntu 20.04 시스템에서 Nestybox를 사용하는 것이었고 가장 잘 작동합니다.또한 컨테이너 런타임이 이러한 응용 프로그램을 위해 특별히 설계되었기 때문에 로컬 시스템이 unbuntu(가장 잘 지원함)인 경우 실행이 매우 간단합니다.또한 가장 유연한 옵션을 제공합니다.네스티박스의 무료 버전은 아마도 2022년 11월 현재 최고의 방법일 것입니다.다른 사용자가 제안하는 모든 지루한 설정을 방해하지 않고 사용해 보는 것이 좋습니다.간단한 명령줄을 사용하여 이러한 특정 요구사항을 해결할 수 있는 많은 사전 구성된 솔루션이 있습니다.
Nestybox는 새로 생성된 도커 컨테이너를 위한 특별한 런타임 환경을 제공하며 도커와 시스템이 내장된 일부 우분투/공통 OS 이미지도 제공합니다.이들의 목표는 기본 컨테이너가 가상 시스템과 안전하게 동일하게 작동하도록 만드는 것입니다.당신은 말 그대로 당신의 우분투 메인 컨테이너에 SSH할 수 있을 뿐만 아니라 메인 컴퓨터의 어떤 것에도 액세스할 수 있습니다.기본 컨테이너에서 일반 로컬 시스템처럼 모든 종류의 컨테이너를 만들 수 있습니다.그 시스템d는 컨테이너 안에서 도커를 편리하게 설치하는 데 매우 중요합니다.
sysbox를 실행하는 간단한 공통 명령:
dock run --runtime=sysbox-runc -it any_image
만약 당신이 그것을 찾고 있다고 생각한다면, 당신은 그들의 github에서 더 많은 것을 찾을 수 있습니다: https://github.com/nestybox/sysbox .
간단한 sysbox 런타임 환경 컨테이너를 배포하는 방법에 대한 빠른 링크: https://github.com/nestybox/sysbox/blob/master/docs/quickstart/README.md
언급URL : https://stackoverflow.com/questions/27879713/is-it-ok-to-run-docker-from-inside-docker
'source' 카테고리의 다른 글
"Provider com.fasterxml.jackson.module.jaxb.Spring Boot 업그레이드 후 "Jaxb Annotation Module을 찾을 수 없음" (0) | 2023.08.04 |
---|---|
오류: 유형이 Promise 호환 생성자를 참조하지 않으므로 ES5/ES3에서 올바른 비동기 함수 반환 유형이 아닙니다. (0) | 2023.08.04 |
TypeScript - Angular 2의 컨테이너 요소에 HTML 추가 (0) | 2023.08.04 |
IIS - localhost가 아닌 IP 주소로 페이지에 액세스할 수 없습니다. (0) | 2023.08.04 |
$document.ready()에 해당하는 Angular2 (0) | 2023.08.04 |