Docker

[Docker] 도커 컨테이너에서 도커 이미지 빌드 (with jenkins)

burgerkim 2021. 12. 15. 18:23

'AWS로 구현하는 MAS와 컨테이너 오캐스트레이션' 강의를

블로그를 통해 구매하시는 분들에게만 10%할인 중입니다.

이미지를 클릭하면 강의로 이동할 수 있습니다.

아래 쿠폰번호를 입력해 주세요!

16861-259843d6c2d7

 


 

 

발단

docker 환경에서 jenkins를 이용하여 pipeline구축 시 docker 이미지를 빌드해야하는 경우가 생긴다.

이때 jenkins를 docker로 실행시키지 않는다면 권한 부여만으로 해결이 가능하지만

jenkins를 docker이미지로 구동하면 jenkins컨테이너에서 host의 docker를 사용하여 빌드를 해야한다.

이때 해결방법으로 jenkins컨테이너에 내에 다른 docker 데몬을 실행하는 것 인데 이 방법은 docker에서 권장하지 않는다.

해결 방법

해결방법은 host의 docker소켓을 컨테이너와 공유하는것이다. 이렇게 하면 컨테이너가 host의 docker 데몬을 사용하여 이미지 빌드, 컨테이너 실행을 할 수 있다.

빌드된 이미지 사용

docker run \
  -p 8080:8080 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --name jenkins \
  getintodevops/jenkins-withdocker:lts

가장 간단하게 누군가 미리 만들어놓은 Dockerfile을 통해 이미지를 pull받는것이다.

다른 방법들과 결과는 같으므로 귀찮으면 위의 명령어로 하는것을 추천

다음으로는 jenkins 컨테이너에 접속하여 필요한 docker-ce 를 설치하거나 이 과정을 정의한 Dockerfile을 직접 만드는 방법들 있다.

Jenkins컨테이너에 직접 docker-ce 설치

먼저 공식 jenkins이미지를 통해 컨테이너를 실행한다.

docker run -p 8080:8080 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --name jenkins \
  jenkins/jenkins:lts

 

구동이 되면 해당 jenkins 컨테이너의 shell에 접속한다.

docker exec -it -u root jenkins bash

*apt명령어 실행을 위해 root 접속

apt-get update && \
apt-get -y install apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     software-properties-common && \
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
   $(lsb_release -cs) \
   stable" && \
apt-get update && \
apt-get -y install docker-ce

공식 docker apt repository 구성 및 docker ce 바이너리 설치하는 명령어를 입력해주면 끝이다.

추가적으로 docker jenkins에서 host docker 접근 권한을 부여해주기 위해

groupadd -f docker

usermod -aG docker jenkins

chown root:docker /var/run/docker.sock

다음 명령어들을 각각 입력해 준다.

Dockerfile 직접 생성

Dockerfile 생성

FROM jenkins/jenkins:lts
USER root

RUN apt-get update && \
    apt-get -y install apt-transport-https \
      ca-certificates \
      curl \
      gnupg2 \
      software-properties-common && \
    curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
    add-apt-repository \
      "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
      $(lsb_release -cs) \
      stable" && \
   apt-get update && \
   apt-get -y install docker-ce
   
RUN groupadd -f docker
RUN usermod -aG docker jenkins

하단의 RUN은 jenkins의 docker권한을 얻기위해 docker 그룹에 포함시키기 위함이다.

도커 이미지 빌드 명령어 실행

docker build -t jenkins-dood:1.0 .

이렇게 하면 전과 마찬가지로 docker reposiotry에서 필요한 구성들을과 docker ce가 설치로그가 출력되고

jenlins 이미지가 생성된다.

마찬가지로 docker run 하게되면 실행이 된다.

그리고  권한을 위해 해줘야할 작업이 하나 더 있는데

docker exec -it -u root jenkins bash

위 명령어를 통해 jenkins를 root 유저로 접속 후

chown root:docker /var/run/docker.sock

해당 파일을 docker그룹에 권한을 부여해주면 된다.

 

Jenkins에서 host docker 접근 테스트

jenkins 기본 설정 을 진행했다는 가정하에 테스트를 바로 진행하면

jenkins 콘솔 메인에서 좌측 메뉴 상단 '새로운 Item'을 선택하고

item이름을 입력 후 'Freestyle project'를 선택한다.

다음 화면에서 빌드 환경 탭을 선택 Build의 드롭박스에서 Execute shell을 선택 후 Command에 실행시켜볼 docker 명령어를 입력하고 저장

바로 프로젝트 화면으로 넘오오는데 먼저 'Build Now' 를 선택하면 좌측 탭 하단에 사진과 같이 #1 이 생성된다. 생성된 것은 빌드 결과이며 결과를 클릭하면 빌드 결과 상세보기 페이지로 넘어간다.

해당 페이지에서 좌측 탭 'Console Output' 을 선택하면 프로젝트 생성 당시 입력한 command 입력 로그와 결과 로그가 출력되어있는것을 확인할 수 있다.

해당 테스트는 docker exec 로 jenkins 컨테이너에 직접 접속하여 docker명령어를 입력해도 같은 결과가 나오므로 위 과정을 생략해도 무관하다.

 

참고

https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci