Jenkins Container In Docker Issue 해결 과정

개발새발·2023년 11월 17일

docker

목록 보기
2/2

1. Jenkins In Docker Build Issue

기존에 Jenkins를 구성한 Server로 Toy-Project를 진행할 API (Spring boot)를 올려보기 위해 Jenkins Pipeline을 구성하여 테스트 중 이런 에러를 만나게 되었다.

이 에러는 Jenkins 내부에서 Docker를 찾지 못한다는 내용이었고, 찾아보니 Jenkins 내부에서 docker-ce를 설치 해줘야 한다는 답변을 받아 설치 후 docker 명령어 테스트를 ssh상에서 쳐보았지만 다른 에러를 마주쳤다...😕

/var/run/docker.sock: no such file or directory

무엇이 문제일까..🧐

2. Jenkins In Docker Build Issue 해결 과정

확인해본 결과 컨테이너 내에는 docker.sock가 존재하지 않았다. docker.sock을 사용하려면 2가지 방식을 사용할 수 있다.
1) Docker in Docker (DinD)
2) Docker Out of Docker (DooD)

2.1) Docker In Docker(DinD) 방식

Docker in Docker 방식의 경우 Docker 내부에 또 다른 Docker 환경을 구성하여 Docker를 사용할 수 있도록 하는 방식이다.
이 방식의 경우 --privileged 옵션을 할당해주어야 하는데 --privileged 옵션을 주게 되면 컨테이너가 호스트의 모든 장치에 액세스하는 권한을 부여하게 된다. 보안상의 이슈로 크게 권장하지는 않는 방식이다.

Docker In Docker 구성도

2.2) Docker Out Of Docker (DooD) 방식

Docker Out Of Docker (DooD) 방식의 경우 컨테이너 내에서 Host의 Docker Daemon(docker.sock)을 공유받아 Docker 명령어를 수행할 수 있도록 구성하는 방식이다. 실제 이렇게 구성하게 되면 컨테이너 내부에서 Docker 명령어 수행 시 Host의 Docker Daemon을 실행시켜 Docker 명령어가 수행 가능하다. Host의 Docker을 공유하는 것이다 보니 Host의 Docker Container, Image 등을 모두 확인 가능하다.

Docker Out of Docker 구성도

두 가지 방식 중 일단 보안상 문제로 권장되는 DOOD 방식으로 구성해보기로 하였다.😎

2.3 jenkins docker run 옵션 추가

일단 첫번째로 Jenkins Container 실행 시 docker.sock에 대한 볼륨을 아래와 같이 지정해주고 다시 docker run을 통해 Container를 생성하였다.

docker run -d -v jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock  --name jenkins -p 8080:8080 -p 50000:50000 --restart=on-failure jenkins/jenkins:lts-jdk17

하지만 이렇게 해도 docker 명령어를 찾을 수 없다고 하는데, docker.sock을 공유하긴 하지만 실제 docker 명령어를 사용할 수 있는 docker-cli, docker-ce 등은 따로 jenkins container 내부에서 설치를 해줘야 한다.

2.4 jenkins container docker-ce insall

해서 다음과 같이 docker-cli, docker-ce 등을 jenkins container 내부에서 install 하였다.
container os 의 경우 debian으로 확인되어 debian 계열의 설치 명령어 과정이다.

# jenkins container 접속
docker exec -it -u 0 {<container-id> or <container-name>} /bin/bash
 
# linux 버전 확인
cat /etc/issue
# --------------- OS --------------------------------
# root@DESKTOP-R4P59B3:/home/opendocs# cat /etc/issue
# Ubuntu 20.04.4 LTS \n \l
# --------------- jenkins Container OS --------------------------------
# root@DESKTOP-R4P59B3:/home/opendocs# docker exec -it jenkins /bin/bash
# root@8fc963af71bb:/# cat /etc/issue
# Debian GNU/Linux 11 \n \l
 
# Docker 설치
## - Docker Repository 설정
apt-get update
apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
  
## - docker 설치
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

설치 후 jenkins container 내부에서 docker 명령어를 실행해보면...

Jenkins Container 내부에서 실행한 결과와 Host 에서 실행한 결과가 동일하다는 것을 확인 할 수 있다. 😎

2.5 다시 빌드해보자!🫣

이제 세팅은 모두 완료되었고 다시 Build를 해보자.

jenkins Console Output으로 확인한 결과 정상적으로 docker build가 수행되었다.
끝으로 DOOD를 구성하면서 자질구레한 문제점들이 있었는데 해당 내용을 끝으로 마무리하도록 하겠다.

3. 기타 문제 해결 과정

3.1. docker exec root 권한 문제...🤯

docker exec -it <containername> /bin/bash -u root

분명 위 명령어로 docker container 내부 접속 시도 시 이전에는 됐었던거 같은데, docker 및 jenkins를 재구성하면서 아래와 같은 에러를 마주치게 되었다.

이 에러는 찾아봐도 도저히 답이 안나와 고민하던 중 아래 명령어로 해결이 가능했다.

docker exec -it -u 0 <containername> /bin/bash

아직까지 원인은 알 수 없으나, 찾아보고 이 후 추가로 남길 예정이다.
(혹시 아시는분.. 댓글 부탁드립니다ㅠㅠ)

3.2 docker run 시 -v 옵션의 의미...🥲

사실 예전부터 -v 옵션 관련해서 정확한 의미를 파악하지 못해 사용하지 않았으나, 이번에 DOOD를 구성하면서 해당 옵션에 대해서 이해를 하게 되었다.

이전부터 jenkins 구성시 무언가를 잘못하여 stop -> remove하고 다시 구성한다는 게 너무 스트레스 였는데
-v jenkins_home:/var/jenkins_home 옵션을 적용하여 container를 실행했더니 이 후 컨테이너를 삭제하고 재구동 시에도 기존 jenkins의 설정이 모두 유지되어있었다...

docker.sock 관련 문제를 해결하면서 jenkins_home:/var/jenkins_home이 실제 jenkins에서 작업한 모든 데이터가 host에도 저장되고 이 후 다시 해당 옵션을 적용시키면 container를 삭제하기 전 jenkins에서 작업한 모든 정보가 그대로 살아있는 구나...라고 이번에 깨닫게 되었다.

docker / linux 환경이 익숙치 않아서 지금하고 있는 모든 것이 익숙치 않지만 차근차근 배워나가는게 재미가 있다. 😄

혹시 작성한 내용 중 사실과 다른 내용이 있다면 지적 부탁 드립니다.

profile
개발을 개발새발

0개의 댓글