Jenkins에서 Docker 실행

heyhey·2023년 4월 19일
0

infra

목록 보기
1/3
post-thumbnail

jenkins에서 docker 실행하기

docker 컨테이너를 이용해 jenkins를 사용하고 있습니다.
이 jenkins 를 통해 이제 다른 docker images를 만들고, 그것을 실행 시켜야 하는 상황인데, jenkins에서 도커를 찾을 수 없다고 합니다.
간단한 것은 jenkins에 docker 를 다운받고 사용하면 되는데,그것이 Docker in Docker 라고 불리는 방법입니다.

Docker in docker

이름만 들어도 이해할 수 있는 단어 입니다.
docker 안에서 docker를 사용한다는 뜻입니다.

Docker in Docker (DinD)은 Docker 컨테이너 내에서 Docker를 실행하는 기술입니다. DinD는 Docker 컨테이너에서 다른 Docker 컨테이너를 생성하고 실행하는 데 사용됩니다. 이는 Docker 기반의 CI/CD 파이프라인에서 특히 유용합니다.

기본적으로 Docker는 호스트 운영체제와 커널을 공유합니다.
하지만 호스트와 컨테이너 간의 통신 문제가 발생할 수 있습니다.
이 문제를 해결하기 위해 DinD 기술을 제공하고, 컨테이너에서 다른 컨테이너를 실행하고, 컨테이너 간의 통신이 가능해집니다.

단점

  • 컨테이너 내에서 docker 데몬을 실행하기 때문에 추가 오버헤드가 발생해 성능적으로 떨어져 추천하지 않습니다.

  • 보안적으로 docker 데몬에 대한 엑세스 권한이 필요하기 때문에 컨테이너에서 발생하는 모든 활동이 호스트 시스템에 영향을 미칩니다. 호스트와 컨테이너간의 통신을 제한하는 것이 좋습니다.

해결법

좋은 대안에 있습니다.
docker socket을 이용해 호스트와 Docker 데몬과 컨테이너 간에 통신이 가능합니다.

Docker socket은 호스트의 /var/run/docker.sock 파일을 마운트하여, 컨테이너에서 Docker 클라이언트가 호스트의 Docker 데몬에 대한 제한된 액세스를 제공합니다.

Docker Socket

Docker socket을 사용하는 경우, 호스트의 Docker 데몬을 컨테이너 내부로 직접 실행하지 않으므로, 컨테이너에서 발생하는 모든 활동이 호스트 시스템에 영향을 미칠 위험이 줄어듭니다

사용법

Docker socket은 다음과 같은 옵션을 사용하여 컨테이너 내부에 마운트할 수 있습니다.

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

또한 클라이언트와 실행권한도 함께 공유합니다.
(이건 없어도 된답니다. Docker CLI 를 컨테이너에서 사용하는 것으로 dind를 위해 쓰는 옵션 입니다. )
-v /usr/local/bin/docker:/usr/bin/docker

docker run -d -p 40000:8080 -p 50000:50000 -v /var/run/docker.sock:/var/run/docker.sock --user root --name jenkins jenkins/jenkins

  • user root 로 실행시킨 이유

jenkins에서는 jenkins라는 유저로 실행됩니다.
그래서 docker를 실행시킬 때, permission denied 에러가 납니다.
권장되는 방법은 아니지만, 급한 불을 끄기에는 최고의 방법이지 않을까 생각합니다. 🥲
(나중에 유저를 만들어서, 그룹에 권한을 주는 방향으로 고쳐보도록 하자)

  • withDockerRegistry 에러
    jenkins - plugin 에서 docker pipeline을 설치해, docker를 실행시켜줍니다.
profile
주경야독

0개의 댓글