Docker outside Docker

DooD

Jenkins같은데서 docker를 사용해서 프로젝트를 빌드하려면 Jenkins 컨테이너에서 Docker를 사용할 수 있어야 한다.
컨테이너에서 Docker를 사용할 수 있게 하는 방법으로는 젠킨스 컨테이너 내부에 도커를 설치하는 Docker in Docker,
그리고 젠킨스 컨테이너 밖에서 설치한 Docker를 컨테이너에서 사용하는 Docker outside Docker 방식이 있다.
후자가 더 안정적이고 낫다고 하는데 후자를 사용하기 위해 docker compose에 볼륨을 마운트해줬는데 작동하지 않아 해결법을 찾아냈다.
 

 jenkins:
    image: jenkins/jenkins:lts
    ports:
      - "8084:8080"
    user: root
    volumes:
      - /home/ubuntu/project/jenkins_data:/var/jenkins_home  # 영구 저장
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
      - /usr/libexec/docker/cli-plugins:/usr/libexec/docker/cli-plugins
    networks:
      - monitoring

docker는 기본적으로 사용자의 명령어를 CLI가 받아 소켓을 거쳐 docker 데몬에 전달되면 실제 컨테이너가 조작되는 구조이다.
따라서 소켓, CLI가 각각 필요하고 docker compose v2부터는 독립적이지 않고 cli의 plugin으로 통합됬기 때문에 cli-plugin도 마운트 해줘야 한다.
도커의 작동 구조를 이 참에 한번 뜯어봐야 할 것 같다.