You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

빌드서버로 많이 사용하는 Jenkins를 도커 컨테이너로 실행하고,

이 컨테이너를 이용해 도커 이미지를 만들고 실행하는 방법에 대해 알아본다.

도커허브 Jenkins 공식 이미지로 Jenkins 컨테이너를 만들수 있다.

$docker run -d -P jenkins


이렇게 만든 Jenkins 서버로 도커 이미지를 빌드하려면 몇가지 설정을 추가해야 한다.

  1. Docker 소켓 파일에 대한 접근 권한
  2. Docker 클라이언트와 실행권한


첫번째, Docker 소켓에 대한 접근을 가능하게 하려면 run 명령을 실행할때 v(Volume) 옵션을 이용해 docker.sock 파일을 공유하면 된다.

1

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

두번째, docker 클라이언트를 실행하는 가장 간단한 방법은 호스트 서버의 docker 클라이언트를 공유하는 것이다.

1

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

도커 명령은 root 권한을 필요로 한다. 도커 컨테이너에서 도커 명령을 실행하는것을 dind(Docker-in-Docker)라고 보통 부른다. 도커 run 명령을 실행할때 privileged 옵션을 준다.

1

$ docker run -privileged -it jpetazzo/dind

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

1
2
3
4

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

jenkins 사용자가 Docker 명령어를 사용할 수 있도록 root 권한을 부여해 보자.  이 설정은 실행 옵션만으로는 어렵고 Jenkins 도커 이미지를 다시 만들어야 한다. 최신 jenkins 이미지를 베이스 이미지로 하는 Dockerfile을 만든다.

1
2
3
4
5
6
7
8
9
10

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로 나열하면 원하는 플러그인이 설치된 이미지가 만들어진다.

1
2
3

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

이제 도커 이미지를 만든다.

1

$ sudo docker build -t docker-jenkins .

이 이미지를 이용해 jenkins를 실행하면 Job에서 도커 명령을 마음대로 사용할 수 있다.

docker 이미지를 주기적으로 빌드하면 빌드 중간에 생기는 이미지들이 늘어난다. 빌드중에 생기는 이미지를 지우고 싶다면 –rm=true 옵션을 준다.



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 권한레벨을 가지게 된다.


그냥 도커 전체를 사용할 계획이면 이 과정은 Pass.

/data 디렉토리에 생성

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


Jenkins 컨테이너에 Docker Binary 설치

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

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


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