빌드서버로 많이 사용하는 Jenkins를 도커 컨테이너로 실행하고,
이 컨테이너를 이용해 도커 이미지를 만들고 실행하는 방법에 대해 알아본다.
도커허브 Jenkins 공식 이미지로 Jenkins 컨테이너를 만들수 있다.
$docker run -d -P jenkins
이렇게 만든 Jenkins 서버로 도커 이미지를 빌드하려면 몇가지 설정을 추가해야 한다.
- Docker 소켓 파일에 대한 접근 권한
- 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 | USER jenkins |
jenkins 사용자가 Docker 명령어를 사용할 수 있도록 root 권한을 부여해 보자. 이 설정은 실행 옵션만으로는 어렵고 Jenkins 도커 이미지를 다시 만들어야 한다. 최신 jenkins 이미지를 베이스 이미지로 하는 Dockerfile을 만든다.
1 | FROM jenkins:latest |
필요한 플러그인을 plugins.txt 파일에 pluginId로 나열하면 원하는 플러그인이 설치된 이미지가 만들어진다.
1 | scm-api:latest |
이제 도커 이미지를 만든다.
1 | $ sudo docker build -t docker-jenkins . |
이 이미지를 이용해 jenkins를 실행하면 Job에서 도커 명령을 마음대로 사용할 수 있다.
docker 이미지를 주기적으로 빌드하면 빌드 중간에 생기는 이미지들이 늘어난다. 빌드중에 생기는 이미지를 지우고 싶다면 –rm=true 옵션을 준다.