본문 바로가기
K8S/Docker

docker in docker 와 docker out of docker

by Rainbound-IT 2022. 5. 10.
반응형

 

어떻게 보면 둘다 docker 안에서 docker 쓰는거지만

docker daemon을 같이사용하느냐 마느냐에 차이이다.

속도에 관련된 부분이 없고 보안상문제만 있는것 같다.

 

 

 

아래 설명을 바로 퍼온것

 

 

도커 컨테이너 내에서 도커를 실행하는 방식은 크게 두 가지가 있습니다. 도커 내에서 도커 데몬을 실행하는 방식인 Docker in Docker(DinD) 방식과 사용중인 도커의 기능을 빌려서 사용하는 Docker out of Docker(DooD) 방식입니다. 그림을 통해서 동작 방식을 간단히 살펴보겠습니다.

Docker In Docker

DinD는 도커 컨테이너 내에서 도커 데몬을 추가로 동작시킵니다. 실제 데몬을 동작시켜야 하기 때문에 도커 데몬에 추가 권한이 필요합니다. DinD 도커를 만들 때 명령을 살펴보면 --privileged를 사용해 추가 권한을 부여하는 명령이 포함됩니다.

# docker run --privileged --name dind1 -d docker:20.10.5-dind

hub.docker.com에서 도커 컨테이너에서 이 기능을 포함한 이미지를 제공해 누구나 쉽게 구축해서 사용이 가능합니다. 도커 내의 모양을 확인하면 docker가 동작하는 모습을 확인할 수 있습니다.

$ docker exec -it dind1 sh
/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 dockerd --host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:2376 --tlsverify --tlscacert /certs/server/ca.pem --tlscert /certs/serv
   49 root      0:00 containerd --config /var/run/docker/containerd/containerd.toml --log-level info
  155 root      0:00 sh
  161 root      0:00 ps

 

DinD 방식은 도커 안에 새로운 격리된 환경을 만들 수 있다는 장점이 있지만 보안상의 문제로 그리 추천되는 방식은 아닙니다. --privileged 옵션은 Docker는 호스트의 모든 장치에 액세스하는 권한을 부여하고 AppArmor나 SELinux에서 일부 구성을 설정하여 컨테이너가 호스트의 컨테이너 외부에서 실행되는 프로세스와 거의 동일한 호스트 액세스를 허용합니다. 간단히 얘기하면 컨테이너가 호스트 전체 권한을 갖는 치명적인 결함을 가집니다. 이 기능을 사용하려면 도커를 컨트롤하는 컨테이너가 호스트에 미칠 영향을 고려해야 합니다.

Docker Out of Docker

두 번째 방식인 DooD는 내부에 새로운 컨테이너 서비스를 만들지 않고 기존의 사용하던 컨테이너를 추가로 생성합니다. docker를 사용해보면 관리자 권한 없이 실행했을 때 /var/run/docker.sock에 대한 권한이 없다는 메시지를 자주 보셨을 겁니다. 이 파일이 로컬 시스템에서 도커 데몬과 통신할 수 있는 소켓 파일입니다. sock 파일을 컨테이너와 공유하면 이 파일을 통해서 도커 명령을 수행할 수 있습니다.

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

전에 만들었던 도커 서버를 사용하는 방법과 동일한데요. 도커 명령을 실행하면 이 도커 명령은 호스트에서 실행중인 도커 데몬에게 전달됩니다. 그래서 컨테이너 안에서도 외부 데몬을 사용하는 형태이죠.

그럼 DinD 방식에 비해서 DooD 방식은 안전하느냐? 그렇진 않습니다. 공격을 하는 방향이 바뀔 뿐 막강한 권한을 갖는 것은 동일합니다. 단적인 예로 -v 옵션을 사용하면 원격 호스트의 자원을 공유해 공격할 수 있습니다.

$ docker run -it -v /tmp:/tmp -v /etc/crontab:/etc/crontab --rm busybox sh

이 명령을 사용해 tmp와 crontab 파일을 공유하고 tmp 디렉토리에 백도어 파일을 하나 배치하고 crontab을 수정해 실행 예약을 걸어둔다면 호스트의 모든 통제권은 공격자에게 넘어갑니다. 결국 컨테이너가 호스트를 공격할 수 있는 방향이 생기는 것이죠.

컨테이너 관리를 활용한 서비스

DinD 방식과 DooD 방식은 보안성의 문제가 있음에도 불구하고 컨테이너가 컨테이너를 컨트롤할 수 있는 것은 큰 장점이 있습니다. 컨테이너 안에서 개발을 진행하면서도 쿠버네티스처럼 컨테이너가 컨테이너를 관리한다던지, 구름 IDE처럼 컨테이너를 동적으로 생성해 사용자에게 서비스를 제공한다던지, 클라우드 서비스처럼 사용자 요청에 따라 컨테이너를 동적으로 배치해 서버리스 서비스를 제공하는 등의 다양한 작업이 가능합니다.

DinD 방식과 DooD 방식의 장점과 단점이 있는지 잘 확인하셨나요? DinD는 컨테이너 안에 새로운 격리된 환경을 만들고 DooD는 컨테이너가 자신이 속한 도커 서비스를 다룰 수 있도록 합니다. 따라서 완전히 별도의 가상환경을 만들 때는 DinD, 가상화된 환경을 다같이 다루고 싶다면 DooD를 선택하시면 됩니다.

 

 

 

 

 

 

 

 

 

 

참고

https://velog.io/@donggu/%EB%8F%84%EC%BB%A4-Docker-in-Docker

 

[도커] Docker in Docker?

https://itnext.io/docker-in-docker-521958d34efd를 이해하기 위한 노력의 일환으로 작성한 글입니다.This short article is based on a blog post by Jérôme Petazzoni: Using

velog.io

 

https://postlude.github.io/2020/12/26/docker-in-docker/

 

Jenkins를 docker 컨테이너로 구축하기(Docker in Docker)

0. 계기올해 초에 회사 jenkins 서버를 docker로 재구축한 적이 있었습니다. 그 때의 경험을 블로그에 반드시 남겨야겠다고 생각했었는데, 이제서야 글을 쓰게 되었네요. 일단 제가 겪은 상황은 다음

postlude.github.io

 

 

거의 모든 docker in docker 관련된것은 이사람꺼 참고했다고한다.

https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/

 

Using Docker-in-Docker for your CI or testing environment? Think twice.

The primary purpose of Docker-in-Docker was to help with the development of Docker itself. Many people use it to run CI (e.g. with Jenkins), which seems fine at first, but they run into many “interesting” problems that can be avoided by bind-mounting t

jpetazzo.github.io

 

docker in docker 예제

https://github.com/jpetazzo/dind

 

GitHub - jpetazzo/dind: Docker in Docker

Docker in Docker. Contribute to jpetazzo/dind development by creating an account on GitHub.

github.com

https://hub.docker.com/_/docker/

 

Docker - Official Image | Docker Hub

We and third parties use cookies or similar technologies ("Cookies") as described below to collect and process personal data, such as your IP address or browser information. You can learn more about how this site uses Cookies by reading our privacy policy

hub.docker.com

 

반응형

'K8S > Docker' 카테고리의 다른 글

Docker 설치 (for windows)  (0) 2022.08.22
docker container status exited 안되고 실행상태 유지  (2) 2022.07.18
docker 명령어  (0) 2022.06.09
docker (centos) 한글(한국어) 설정  (0) 2022.05.19
docker volume 과 bind mount의 차이  (0) 2022.05.17

댓글