오픈소스 중, 비용절감을 위한 ㅎㅎ 빌드머신으로 가장 많이 사용되고 있는ㄷ Jenkins 를 Docker 로 설치하고 관리한다

가장 기본적인 것은 Docker 공식 사이트 에서 Jenkins 공식 이미지로 컨테이너를 생성한다.

# docker run -f -P jenkins

생성된 Jenkins Docker 이미지를 빌드하려면 다은 몇가지 설정이 필요하다.

  • Docker 소켓 파일에 대한 접근 권한
  • Docker 클라이언트와 실행권한 (root)


Docker 소켓에 대한 접근을 가능하게 하려면 run 명령을 실행할때 volume 을 사용하여 docker.sock 를 파운트 한다.

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

Docker 클라이언트와 실행권한을 공유하는 방법은 다음의 명령어를 사용한다.

# -v /usr/bin/docker:/usr/bin/docker

Docker 컨테이너 안에서 Docker 명령을 실행하는 것을 dind(Docker-in-Docker)라고 보통 부른다.

Docker run 명령을 실행할때 다음의 옵션을 설정한다.

# docker run -privileged -it jpetazzo/dind

jenkins 이미지는 이 옵션이 안먹힌다. 이유는 사용자가 root가 아니기 때문인데 공식 Jenkins 이미지 Dockerfile을 열어보면 기본 사용자가 jenkins로 되어 있다.

USER jenkins
COPY jenkins.sh /usr/local/bin/jenkins.sh
ENTRYPOINT ["/usr/local/bin/jenkins.sh"]
COPY plugins.sh /usr/local/bin/plugins.sh

해결하는 방법은 Docker compose 할때 root 권한을 부여한다.

이 설정은 실행 옵션만으로는 어렵고 Jenkins 도커 이미지를 다시 만들어야 한다.

최신 jenkins 이미지를 베이스 이미지로 하는 Dockerfile을 만든다.

FROM jenkins:latest
USER root
RUN apt-get update &&
apt-get install -y sudo &&
rm -rf /var/lib/apt/lists/*
RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers
 
USER jenkins
COPY plugins.txt /usr/share/jenkins/plugins.txt
RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt


필요한 플러그인을 plugins.txt 파일에 pluginId로 나열하면 원하는 플러그인이 설치된 이미지가 만들어진다.

하지만 이방법은 권장하지 않는다.

scm-api:latest
git-client:latest
git:latest

설정이 끝나면 Docker Jenkins 이미지를 실행한다.

# sudo docker build -t docker-jenkins .


Jenkins for Docker 이미지를 생성하고 실행하는 방법은 다음을 권장한다.

위에서도 확인 했듯이, 필수사항 Host의 Docker 소켓을 Jenkins 컨테이너와 연동, jenkisn  구동주이면 정지  삭제  도커 소켓과 재연동 이 필요하다.

docker run \
    -u root \
    -d \
    -p 8080:8080 \
    -p 50000:50000 \
    -v /var/jenkins:/var/jenkins_home \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /etc/timezone:/etc/timezone \
    -v /etc/localtime:/etc/localtime \
    -e JAVA_OPTS=-Duser.timezone=KST \
    --name=jenkins \
    jenkinsci/blueocean


  • -u root는 root 유저로 실행되는것을 의미 하는데 linux 에서 실행시 호스트에 jenkins 유저가 있다면 지정하지 않아도 된다.-d : 데몬 상태로 실행한다는 뜻이다. 이 옵션을 주지 않으면, 실행되는 로그를 바로 보여준다.
  • -p : 컨테이너 내부의 포트를 외부로 내보낼 포트로 연결시켜준다.
  • -v : 호스트에 볼륨을 지정해 주는 것이다. 굳이 하지 않아도 되지만, 만약 해당 컨테이너가 삭제되면 내부에 작성했던 스크립트 등의 데이터가 다 없어지기 때문에 볼륨을 지정해 외부에 백업하는 용도로 볼륨을 잡았다.
  • --name : 해당 컨테이너의 이름을 지정
  • -u : root 사용자로 실행되게 하기 위함.

실제 서비스에서 실행할때는 -d 옵션을 붙이고 초기 테스트할때는 -d 옵션이 없는 경우 실시간으로 출력 로그를 볼수 있어 유용하다.

이제 브라우저는 통해 접속하면 jenkins 초기화면을 볼수 있다.

--privileged 옵션으로  옵션을 설정하지 않으면 docker in docker 기능이 재대로 작동되지 않는다.

 옵션으로 컨테이너가 호스트의 root 권한레벨을 가지게 된다.



DISK 마운트 설정

/data 디렉토리에 생성

$ mkdir /data/jenkins
  • 디렉토리 접근권한을 살펴볼 것.
  • 접근권한이 귀찮으면 jenkins 유저 생성 후, 홈디렉토리를 만든 디렉토리로 설정 하는거 추천


Jenkins 컨테이너에 Docker Binary 설치

접속이 완료되면 아래와 같이 root유저와 container id를 확인할 수 있습니다.

# docker exec -it -u 0 {name-of-the-jenkins-container} bash
root@811ce958107c:/#


Docker binary 다운로드

Binary 파일 다운로드 정보는 https://github.com/moby/moby/releases 여기에서 확인가능

현재 최신 버전인 17.05.0-ce 를 다운받도록 하겠습니다.

wget https://get.docker.com/builds/Linux/x86_64/docker-17.05.0-ce.tgz

다운을 받은 후 tar로 압축을 해제합니다.

# tar xvfz docker-17.05.0-ce.tgz
# cp ./docker/docker /usr/bin/

압축을 풀고 나면 docker폴더가 생성이 됩니다.

 docker 폴더안에 docker binary 파일을 /usr/bin/에 복사합니다.



  • No labels