DevOps/Docker & kubernetes

Docker in Docker(dind) 활용하기. feat jenkins

치킨맛코드 2022. 8. 29. 16:07

docker 안에 docker를 설치해서 활용한다면 어떨까? 라는 생각으로 나온것이 Docker in Docker이다. 일반적으로 많이 사용되지는 않지만, docker container에서 container를 제어하고 관리할 수 있다면, jenkins와 같은 CI도구를 좀더 편리하게 사용할 수 있다.

 

크게 dind은 2가지 목적으로 사용할 수 있다. on-prem위에서 gitlab이나 jenkins와 같은 ci 시스템을 docker container위에서 실행하는 경우가 있다. 이때는 container에서 프로그래밍 언어/ 종속 미드웨어 별로 docker container를 실행한 후, 프로덕션용 docker image 를 생성할 수 있다. 이렇게 된다면 docker를 중첩해서 사용할 수 있다.

 

Docker를 샌드박스 환경으로 사용하는 경우에도 사용할 수 있다. 실 작업이 수행되는 host환경과 별도의 격리된 환경으로 docker container를 활용할때 사용할 수 있다. 이 경우 해당 컨테이너 내부에서 docker container를 시작할 수 있고, container를 지우는것만으로도 내부 자원을 정리할 수 있기에 굉장히 관리하기 편리해진다.

 

이 시간에는 jenkins를 하나의 container형태로 사용해 보도록 한다. 

아래의 명령어를 따라서 실행하도록 하자.

# docker pull jenkins/jenkins:lts
==> jenkins의 최신버전을 pull받는다.

# sudo chown -R 1000:1000 /root/jenkins/
==> 앞으로 만들 jenkins 서버와 마운트될 폴더에 대해 권한부여를 한다. 위치는 본인의 희망사항에 따라 변동하면 된다.

# vi /etc/sysconfig/selinux
==> selinux를 diseable로 바꾸도록 하자.

# docker run -d -p 8080:8080 -v /root/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -u root jenkins
==> 8080포트로 jenkins를 구동할 것이며, 젠킨스 디렉토리와 호스트 디렉토리를 마운트하며,
    jenkins container내부에서 sock이라는 php을 젠킨스 내부에서 사용할 수 있도록 마운팅한다.
    root 계정으로 jenkins를 구동한다.

이런 error 가 종종 나타날 수 있는데, 이때는 chown을 제대로 하지 않았거나, selinux가 열려있을때 종종 나타난다.

touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?

이 후 해당 도커의 ip : 8080 port로 접근을 한다면 젠킨스가 잘 활동하는것을 볼 수 있다.

어 그런데 웬걸 우리는 jenkins에 대한 password를 설정하지 않았다. 과연 이것은 어디에 있을까?

바로 logs를 검색해보면 알 수 있다.

아래의 명령어를 사용해 보도록하자.

# docker logs "container id"
==>  컨테이너의 logs를 확인할 수 있다.

무엇인가 잔뜩 나타나는데 해당 컨테이너의 logs를 확인시켜주는 내용이다. 조금 상단으로 올려보면 비밀번호가 나타난다.

이제 우리는 배포 자동화를 위한 jenkins를 설치할 수 있게 되었다.

이에 대한 조금 더 자세한 내용은 아래 내용을 참고하길 바란다.

https://chicode.tistory.com/170

 

Jenkins, Maven 설치 및 활용하기

Jenkins는 CI/CD를 도와주는 유명한 도구중 하나이다. 일종의 컨트롤 타워 역할을 하며, 다양한 플러그인을 가지고 와서 세팅을 한 후 사용할 수 있다. 대부분의 기능은 웹 기반의 콘솔로 이용할 수

chicode.tistory.com

우리가 이러한 작업을 함에 있어서 jenkins server에서는 docker가 되어있지 않기에 아래와 같은 에러메세지가 나타나는것을 알 수 있다. docker not found 즉 도커가 설치되어 있지 않기에, jenkins server에도 docker를 설치하도록 하자.

아래의 명령어를 사용해 컨테이너로 들어간 후 docker를 설치하도록 하자.

# docker exec -it "컨테이너 id" /bin/bash
==> 도커 내부 컨테이너로 진입해 /bin/bash를 실행한다.

# curl -fsSLO https://get.docker.com/builds/Linux/x86_64/docker-17.04.0-ce.tgz
==> docker파일을 직접 홈페이지에서 다운받아온다.
    버전 등은 자유롭게 설정할 수 있다.

# tar xzvf docker-17.04.0-ce.tgz
==> docker파일을 압출 해제한다
# mv docker/docker /usr/local/bin
==> 압축 해제한 파일을 이동하여 docker명령어를 사용할 수 있도록 한다.

# rm -f docker docker-17.04.0-ce.tgz
==> 기존 압축파일을 지워 용량을 확보한다.

# docker login
==> docker 로그인을 한다.

# git clone "git 주소"
==> git clone을 하기위한 주소