in DevOps with Docker

Jenkins로 Docker 이미지 만들기

빌드서버로 많이 사용하는 Jenkins를 도커 컨테이너로 실행하고, 이 컨테이너를 이용해 도커 이미지를 만들고 실행하는 방법에 대해 알아보자.

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

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

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

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

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

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

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

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

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

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

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

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

참고자료

Write a Comment

Comment

  1. jenkins은 server 에서 바로 돌리고
    docker image를 node로 사용하되 ssh로 연결하게끔해서
    사용할 수 있는 방법이 없을까요?
    docker에 sshd 띄우고… jenkins에 slave node로 붙였더니
    network 문제 발생으로 host가 lockup 걸려서요..

    • 질문이 잘 이해가 안가는데..Jenkins 슬레이브가 마스터와 ssh 통신을 할수 있도록 연결하고 싶다는 말인가요? 슬레이브가 하나라면 상관없지만 여러개라면 포트 콜리즌으로 행이 걸리지 않을까요? 마스터의 sshd 데몬은 포트를 고정해야 하니 아마도 위경우는 안될거 같습니다. 뭔가 슬레이브가 복잡한 행위를 하는 경우라고 가정한다면 Job을 여러개로 나눠서 구성해 보시죠. 슬레이브는 워커로만 보세요.

      • 안녕하세요,
        답변 감사합니다.
        구성하려는 방법을 말씀 드리면, Host 2대가 있어서 한대엔 VM으로 jenkins를 띄었습니다.
        나머지 Host 한대에.. docker 로 sshd 을 띄어서
        각 IP를 할당 받습니다. (Host 및 docker, jenkins vm 간에는 network은 같은 subnet 으로 묶여있어 상호 간 통신이 가능합니다.)
        이런 구성으로 jenkins의 slave로 “Launch slave agents on Unix machine via SSH”로 연결을 해놨습니다.

        그렇게 연결 후 며칠이 지나면… Docker를 띄운 Host가 hang이 걸려서
        reboot 전까지는 아무것도 할 수 가 없게 됩니다…

        이런 구성 방법이 틀린 것인 지 아니면 설정이 잘못되어서 인지
        잘 모르겠습니다.

        • 아 이해했습니다. 구성방법은 맞는거 같습니다.
          제가 이글을 쓸때 기억을 되살려 본다면 Job 이 실행되면 slave 컨테이너가 생겼다가 작업이 끝나면 다시 사라집니다.
          Docker를 띄운 Host가 hang이 걸린다고 하셨는데 Slave 컨테이너가 실행되는 Host의 Docker 데몬과 통신이 안된다는 말인거 같네요.
          혹시 컨테이너가 Job이 많이 만들어져서 더이상 새로운 컨테이너를 띄울수 없는 상태가 된건 아닌지 의심이 가네요.

Webmentions

  • ec2에 도커 개발환경 구성 – 실용주의 이야기 2016년 10월 13일

    아 이해했습니다. 구성방법은 맞는거 같습니다.
    제가 이글을 쓸때 기억을 되살려 본다면 Job 이 실행되면 slave 컨테이너가 생겼다가 작업이 끝나면 다시 사라집니다.
    Docker를 띄운 Host가 hang이 걸린다고 하셨는데 Slave 컨테이너가 실행되는 Host의 Docker 데몬과 통신이 안된다는 말인거 같네요.
    혹시 컨테이너가 Job이 많이 만들어져서 더이상 새로운 컨테이너를 띄울수 없는 상태가 된건 아닌지 의심이 가네요.

  • Docker를 Jenkins 슬레이브로 사용하자 | 실용주의 이야기 2016년 10월 13일

    아 이해했습니다. 구성방법은 맞는거 같습니다.
    제가 이글을 쓸때 기억을 되살려 본다면 Job 이 실행되면 slave 컨테이너가 생겼다가 작업이 끝나면 다시 사라집니다.
    Docker를 띄운 Host가 hang이 걸린다고 하셨는데 Slave 컨테이너가 실행되는 Host의 Docker 데몬과 통신이 안된다는 말인거 같네요.
    혹시 컨테이너가 Job이 많이 만들어져서 더이상 새로운 컨테이너를 띄울수 없는 상태가 된건 아닌지 의심이 가네요.