Dockers 컨테이너 내에서 Jenkins를 실행 중입니다. Jenkins 컨테이너가 Docker 호스트가 되어도 괜찮습니까? 내가 생각하고있는 것은 Jenkins 내부에서 데이터베이스, 메시지 브로커 등을 시작하기 위해 각 통합 테스트 빌드마다 새로운 도커 컨테이너를 시작하는 것입니다. 따라서 통합 테스트가 완료된 후 컨테이너를 종료해야합니다. 이런 식으로 다른 도커 컨테이너 내부에서 도커 컨테이너를 실행하지 않는 이유가 있습니까?
Dockers 컨테이너 내에서 Jenkins를 실행 중입니다. Jenkins 컨테이너가 Docker 호스트가 되어도 괜찮습니까? 내가 생각하고있는 것은 Jenkins 내부에서 데이터베이스, 메시지 브로커 등을 시작하기 위해 각 통합 테스트 빌드마다 새로운 도커 컨테이너를 시작하는 것입니다. 따라서 통합 테스트가 완료된 후 컨테이너를 종료해야합니다. 이런 식으로 다른 도커 컨테이너 내부에서 도커 컨테이너를 실행하지 않는 이유가 있습니까?
답변:
가능한 경우 Docker 내에서 Docker (일명 dind )를 실행하지 마십시오 . (아래에서 제공되는 소스입니다.) 대신 기본 컨테이너가 형제 컨테이너 를 생성하고 통신 할 수있는 방법을 설정하려고합니다 .
Docker가 Docker 컨테이너 내에서 실행될 수있게했던 기능의 저자 인 Jérôme Petazzoni 는 실제로 그렇게하지 말라고 블로그 게시물을 작성 했습니다 . 그가 설명하는 유스 케이스는 다른 Docker 컨테이너 내에서 작업을 실행해야하는 CI Docker 컨테이너의 OP의 정확한 유스 케이스와 일치합니다.
Petazzoni는 dind가 문제가되는 두 가지 이유를 나열합니다.
이 블로그 게시물에서 다음 대안을 설명합니다.
가장 간단한 방법은 Docker 소켓을
-v
플래그 로 바인드 마운트하여 CI 컨테이너에 노출시키는 것입니다 .Docker-in-Docker와 함께 무언가를 해킹하는 대신 CI 컨테이너 (Jenkins 또는 기타)를 시작할 때 간단히 다음과 같이 시작하십시오.
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
이제이 컨테이너는 Docker 소켓에 액세스 할 수 있으므로 컨테이너를 시작할 수 있습니다. "자식"컨테이너를 시작하는 대신 "자식"컨테이너를 시작합니다.
sudo
이와 같이 할 때 도커 명령을 실행하는 방법은 무엇입니까? 감사합니다
docker
그룹 에 사용자를 추가해야합니다 sudo usermod -aG docker $USER
.. 그 후에 다시 로그인해야합니다.
/var/run/docker.sock
머신에서 docker for mac을 실행할 때 도커 소켓이 있기 때문에 동일 합니다.
/var/run/docker.sock
Docker 내부에서 Docker 컨테이너를 실행하는 방법 에 대해 비슷한 질문에 대답했습니다 .
도커 내부에서 도커를 실행하는 것이 가능합니다. 가장 중요한 것은 추가 권한을
run
가진 외부 컨테이너 (로 시작 )를 누른 다음 해당 컨테이너에 도커를 설치하는 것입니다.--privileged=true
자세한 내용은이 블로그 게시물을 확인하십시오 ( Docker-in-Docker) .
이에 대한 한 가지 유스 케이스 가이 항목에 설명되어 있습니다. 블로그는 Jenkins 도커 컨테이너 내에 도커 컨테이너를 빌드하는 방법을 설명합니다.
그러나 Docker 내부의 Docker는 이러한 유형의 문제를 해결하는 데 권장되는 방법이 아닙니다. 대신이 방법 에서 설명하는대로 "형제"컨테이너를 만드는 것이 좋습니다.
따라서 Docker 내에서 Docker를 실행하는 것은 많은 사람들 이이 유형의 문제에 대한 좋은 해결책으로 간주되었습니다. 이제 추세는 "형제"컨테이너를 대신 사용하는 것입니다. 자세한 내용 은이 페이지 에서 @predmijat의 답변을 참조하십시오 .
Docker-in-Docker (DinD)를 실행하는 것이 좋습니다. 실제로 Docker (회사)는 공식적인 DinD 이미지 를 가지고 있습니다.
그러나 보안 요구에 따라 실행 가능한 대안이 아닌 특권 컨테이너가 필요하다는 경고가 있습니다.
형제 컨테이너 (일명 Docker-out-of-Docker 또는 DooD)를 사용하여 Docker를 실행하는 대체 솔루션에는 권한있는 컨테이너가 필요하지 않지만 컨텍스트에서 컨테이너를 시작한다는 사실에서 비롯된 몇 가지 단점이 있습니다. 컨테이너가 실행되는 것과는 다릅니다 (즉, 컨테이너 내에서 컨테이너를 시작하지만 컨테이너 내부가 아닌 호스트 수준에서 실행 중임).
DinD vs DooD의 장단점을 설명하는 블로그를 여기에 작성했습니다 .
이것을 말하면서 Nestybox (방금 시작한 시작)는 (특권 컨테이너를 사용하지 않고) 진정한 Docker-in-Docker를 안전하게 실행하는 솔루션을 개발 중입니다. www.nestybox.com 에서 확인할 수 있습니다 .
예, docker에서 docker를 실행할 수 있습니다. "-v / var / run을 사용하여 docker 데몬이 기본적으로 부모 docker에 볼륨으로 수신하는 unix sockeet"/var/run/docker.sock "을 연결해야합니다. /docker.sock:/var/run/docker.sock " 때때로 "sudo chmod 757 /var/run/docker.sock"를 쓸 수있는 docker 데몬 소켓에 대한 권한 문제가 발생할 수 있습니다.
또한 특권 모드에서 도커를 실행해야하므로 명령은 다음과 같습니다.
sudo chmod 757 /var/run/docker.sock
도커 실행 --privileged = true -v /var/run/docker.sock:/var/run/docker.sock -it ...