Docker를 이용한 Jenkins 컨테이너 만들기(docker in docker)

Docker를 이용한 Jenkins 컨테이너 만들기(docker in docker)

Created: Oct 14, 2019 8:41 PM

들어가기

이번에는 ubuntu 18.04 가상머신에 docker, docker-compose 를 사용해서 jenkins 컨테이너를 생성해보겠다.

도커 관리를 위해서 Dockerfile, docker-compose 모두 사용할 예정이다.

이번에 만들 jenkins 컨테이너는 내부에서 dockerfile을 빌드할 예정이므로, docker in docker로 jenkins 이미지를 만들 예정이다.

1. Docker관리를 위한 폴더와 파일 구조

1
2
3
4
5
6
docker (도커 관리 폴더)
|-- jenkins_with_docker (도커를 포함한 젠킨슨 관리 폴더)
|-- jenkins_home (젠킨스 컨테이너의 볼륨 연결용 폴더, 빈 폴더 준비)
|-- docker-compose.yml (실제 컨테이너를 생성하는 docker-compose 파일)
|-- Dockerfile (docker-compose.yml에서 빌드할 jenkins 파일)
|-- docker_install.sh (Dockerfile에서 호출할 docker 설치 스크립트 파일)

구조는 아래와 같다.

이미 스스로가 docker 컨테이너는 jenkins에서 docker를 사용하기 위해서는 컨테이너가 동작하는 호스트의 docker를 빌려서 사용하는 것이다.

연결 방법은 docker volume을 사용해서 docker 가 설치된 host의 /var/run/docker.sock과 jenkins 컨테이너 내부의 /var/run/docker.sock를 연결해 줘야 한다.

이 부분은 docker-compose.yml 에 설정 할 것이다.

2. 설정 파일들 준비

Dockerfile

1
2
3
4
5
6
7
8
9
FROM jenkins/jenkins:lts

USER root

COPY docker_install.sh /docker_install.sh

RUN chmod +x /docker_install.sh

RUN /docker_install.sh

jenkins이미지에 docker_install.sh 파일을 복사해서 가져와서 실행한다.

Dockerfile 내부에서 RUN 명령등으로 쉘 스크립트를 실행할수 있지만, 뭔가 계속 오류가 나서 이런 방식을 선택했다.

docker_install.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh

apt-get update && \
apt-get -y install apt-transport-https \
ca-certificates \
curl \
gnupg2 \
zip \
unzip \
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

위 내용은 jenkins Dockerfile을 빌드할때 동작하는 스크립트이다.

내용은 jenkins 내부에 docker를 설치하는 것이다.

개인적으로 이렇게 sh파일을 copy하는게 편해보인다.

구글링으로 얻을수 있는 쉘스크립트를 바로 쓸수 있기 때문이다.

만약 jdk, maven, gradle, node등 필요한게 있다면 이런식으로 추가해 주면 될것 같다.

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
version: '3'

services:
jenkins:
build:
context: .
dockerfile: Dockerfile
container_name: 'jenkins_docker'
restart: always
ports:
- '8200:8080'
- '50200:50000'
expose:
- '8080'
- '50000'
volumes:
- './jenkins_home:/var/jenkins_home'
- '/var/run/docker.sock:/var/run/docker.sock'
environment:
TZ: "Asia/Seoul"
networks:
default:
external:
name: devops

docker-compose.yml에서는 이미지 대신 Dockerfile을 이용해서 이미지를 대신한다.

volumes에서 docker.sock을 host와 연결한다.

3. 컨테이너 생성

1
sudo docker network create devops

혹시나 나중에 쓸지도 모를 네트워크를 일단 생성하자.

그리고 docker-copomse.yml 이 있는 경로로 이동해서 아래 명령으로 이미지 생성과 jenkins 컨테이너를 생성하자.

1
sudo docker-compose up -d

위 명령얼 실행하면 Dockerfile을 빌드하기 시작한다. 이때 jenkins 이미지를 받고 docker를 설치하므로 시간이 좀 걸린다.

그리고 완료가 되면 아래처럼 나올것이다.

그리고 docker 이미지를 검색해보면 아래처럼 상당이 큰 이미지가 생성된다.

만약 위 과정에서 문제가 생긴다면, Dockerfile을 별도로 빌드해서 Dockerfile에서 오류가 나는지, docker_install.sh에서 오류가 나는지, 아니면 docker-compose.yml 에서 오류가나는지 찬찬히 찾아봐야 한다.

4. jenkins 컨테이너에 접속해서 docker 명령어 테스트

브라우저에서 http://localhost:8200 에 접속해보자.

일반적인 jenkins 초기화면이 나온다 초기 비밀번호를 찾아서 넣어주자.

공식 jenkins 이미지를 사용하므로 플러그인도 잘 설치가 된다.

관리자 정보를 입력하고 save and Continue 를 눌러주자.

아까 생성했던 관리자 계정으로 로그인하자.

위처럼 정상적으로 젠킨스가 동작한다.

만약 화면이 하얀색으로 멈춰 있거나 먹통이 되면 docker-compose stop → docker-compose start 로 컨테이너를 재시작 해보길 바란다.

이제 간단한 job을 만들어서 docker 명령어가 jenkins에서 호출되는지 확인해보자.

빨간 줄만 따라가면된다. Execute shell에 docker ps 입력하고 저장을 눌러 job을 저장하자.

이렇제 잡이 생성되면 들어가서

Build now눌러서 결과를 확인하자.

짜잔 jenkins에서 docker ps 명령어가 동작한 것을 확인 할 수 있다.

앞서 말했듯이 jenkins 컨테이너에서 호스트 docker를 빌려 쓰므로 현재 호스트의 docker ps 가 동작하고 그 결과가 나온다.

끝!

참고자료중

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

를 가장 많이 참고했다.

참고자료

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

https://medium.com/@NovaWoo/docker-와-jenkins-를-사용한-안드로이드-ci-1-9510178a525f

https://www.44bits.io/ko/post/almost-perfect-development-environment-with-docker-and-docker-compose#docker-compose.yml-파일

https://github.com/jenkinsci/docker