도커 내부에서 도커를 실행해도됩니까?


185

Dockers 컨테이너 내에서 Jenkins를 실행 중입니다. Jenkins 컨테이너가 Docker 호스트가 되어도 괜찮습니까? 내가 생각하고있는 것은 Jenkins 내부에서 데이터베이스, 메시지 브로커 등을 시작하기 위해 각 통합 테스트 빌드마다 새로운 도커 컨테이너를 시작하는 것입니다. 따라서 통합 테스트가 완료된 후 컨테이너를 종료해야합니다. 이런 식으로 다른 도커 컨테이너 내부에서 도커 컨테이너를 실행하지 않는 이유가 있습니까?


11
또 다른 가능성은 호스트의 도커 소켓을 컨테이너의 볼륨으로 마운트하는 것입니다. 따라서 "형제"컨테이너를 만들 수 있으며 캐시를 재사용 할 수 있다는 이점이 있습니다.
Adrian Mouat

4
외부 볼륨을 마운트하려는 경우 호스트에서 도커 소켓을 사용할 때 도커 데몬이 실행되는 호스트와 관련된 볼륨 경로를 설정해야한다는 것을 알았습니다. 컨테이너를 시작하는 컨테이너를 기준으로 설정하면 경로가 일치하지 않는 한 반드시 작동하지는 않습니다.
Jakob Runge

답변:


224

가능한 경우 Docker 내에서 Docker (일명 dind )를 실행하지 마십시오 . (아래에서 제공되는 소스입니다.) 대신 기본 컨테이너가 형제 컨테이너 를 생성하고 통신 할 수있는 방법을 설정하려고합니다 .

Docker가 Docker 컨테이너 내에서 실행될 수있게했던 기능의 저자 인 Jérôme Petazzoni 는 실제로 그렇게하지 말라고 블로그 게시물을 작성 했습니다 . 그가 설명하는 유스 케이스는 다른 Docker 컨테이너 내에서 작업을 실행해야하는 CI Docker 컨테이너의 OP의 정확한 유스 케이스와 일치합니다.

Petazzoni는 dind가 문제가되는 두 가지 이유를 나열합니다.

  1. LSM (Linux Security Modules)과 잘 작동하지 않습니다.
  2. 파일 시스템에 불일치가 발생하여 상위 컨테이너 내에 작성된 컨테이너에 문제가 발생합니다.

이 블로그 게시물에서 다음 대안을 설명합니다.

가장 간단한 방법은 Docker 소켓을 -v플래그 로 바인드 마운트하여 CI 컨테이너에 노출시키는 것입니다 .

Docker-in-Docker와 함께 무언가를 해킹하는 대신 CI 컨테이너 (Jenkins 또는 기타)를 시작할 때 간단히 다음과 같이 시작하십시오.

docker run -v /var/run/docker.sock:/var/run/docker.sock ...

이제이 컨테이너는 Docker 소켓에 액세스 할 수 있으므로 컨테이너를 시작할 수 있습니다. "자식"컨테이너를 시작하는 대신 "자식"컨테이너를 시작합니다.


1
sudo이와 같이 할 때 도커 명령을 실행하는 방법은 무엇입니까? 감사합니다
c4k

3
docker그룹 에 사용자를 추가해야합니다 sudo usermod -aG docker $USER.. 그 후에 다시 로그인해야합니다.
predmijat

2
코인 테이너에서 재 로그인하는 방법?
thiagowfx

1
@AlexanderMills macOS /var/run/docker.sock머신에서 docker for mac을 실행할 때 도커 소켓이 있기 때문에 동일 합니다.
Bruce Sun

1
창문은 어때? 난 없어/var/run/docker.sock
Abdelhafid

54

Docker 내부에서 Docker 컨테이너를 실행하는 방법대해 비슷한 질문에 대답했습니다 .

도커 내부에서 도커를 실행하는 것이 가능합니다. 가장 중요한 것은 추가 권한을run 가진 외부 컨테이너 (로 시작 )를 누른 다음 해당 컨테이너에 도커를 설치하는 것입니다.--privileged=true

자세한 내용은이 블로그 게시물을 확인하십시오 ( Docker-in-Docker) .

이에 대한 한 가지 유스 케이스 가이 항목에 설명되어 있습니다. 블로그는 Jenkins 도커 컨테이너 내에 도커 컨테이너를 빌드하는 방법을 설명합니다.

그러나 Docker 내부의 Docker는 이러한 유형의 문제를 해결하는 데 권장되는 방법이 아닙니다. 대신이 방법 에서 설명하는대로 "형제"컨테이너를 만드는 것이 좋습니다.

따라서 Docker 내에서 Docker를 실행하는 것은 많은 사람들 이이 유형의 문제에 대한 좋은 해결책으로 간주되었습니다. 이제 추세는 "형제"컨테이너를 대신 사용하는 것입니다. 자세한 내용 은이 페이지 에서 @predmijat의 답변을 참조하십시오 .


docker에서 docker를 피하는 방법에 대해서는 아래 주석을 참조하십시오.
Dan Poltawski

6

Docker-in-Docker (DinD)를 실행하는 것이 좋습니다. 실제로 Docker (회사)는 공식적인 DinD 이미지 를 가지고 있습니다.

그러나 보안 요구에 따라 실행 가능한 대안이 아닌 특권 컨테이너가 필요하다는 경고가 있습니다.

형제 컨테이너 (일명 Docker-out-of-Docker 또는 DooD)를 사용하여 Docker를 실행하는 대체 솔루션에는 권한있는 컨테이너가 필요하지 않지만 컨텍스트에서 컨테이너를 시작한다는 사실에서 비롯된 몇 가지 단점이 있습니다. 컨테이너가 실행되는 것과는 다릅니다 (즉, 컨테이너 내에서 컨테이너를 시작하지만 컨테이너 내부가 아닌 호스트 수준에서 실행 중임).

DinD vs DooD의 장단점을 설명하는 블로그를 여기에 작성했습니다 .

이것을 말하면서 Nestybox (방금 시작한 시작)는 (특권 컨테이너를 사용하지 않고) 진정한 Docker-in-Docker를 안전하게 실행하는 솔루션을 개발 중입니다. www.nestybox.com 에서 확인할 수 있습니다 .


0

예, 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 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.