젠킨스를 실행하며 우당탕탕 도커에 입문하기

jujeol 프로젝트 우당탕탕 도커 알아보기

안녕하세요! 이번에 주절주절은 도커로 젠킨스를 사용하게 되었습니다.

이번 포스팅에서는 도커를 처음부터 하나하나 짚어가는 것이 아니라 도커로 젠킨스를 띄우기까지 과정을 통해 도커를 알아보기 위함입니다! (야생 스타일)

젠킨스 이미지 가져오기

저희 프로젝트는 자바 11 버전 이상에서만 가능한 프로젝트에요. 그렇기에 자바 11 버전 이상을 지원하는 젠킨스 이미지를 가져와야 했어요!

이미지와 컨테이너 도커를 이해하려면 이미지와 컨테이너를 이해해야해요! 이미지란 파일이라고 생각하면 편할거에요. 파일 시스템과 실행할 어플리케이션 설정을 하나로 합친 것이죠. 컨테이너는 이미지(파일)를 담은 박스라고 보시면 돼요! 이미지를 받아와 격리된 실행환경을 제공받을 수 있는 컨테이너에 담아 실행할 수 있답니다! 컨테이너는 모두 격리되어있기에 마치 새로운 컴퓨터로 실행한 것처럼 모두 격리되어있어요!

https://www.jenkins.io/doc/administration/requirements/jenkins-on-java-11/

젠킨스 공식 홈페이지에서 자바 11 버전으로 이미지를 가져오려면 다음과 같은 명령어를 쳐야한다고 하네요.

docker pull jenkins/jenkins:jdk11

💡docker pull 이란?
혹시 깃헙을 아시나요? 깃헙처럼 도커도 이미지를 인터넷에 저장할 수 있는데 이 저장소를 도커허브라고 불러요. docker pull 이미지이름:태그 명령어를 친다면 그 저장소에서 해당 이미지를 가져오게 돼요.

자, 이제 이미지를 잘 가져왔는지 확인해볼까요?

확인하는 명령어는 docker images 로 확인할 수 있어요. (내가 가지고 있는 이미지들의 리스트를 보여주는 명령어에요)

오! 잘 가져왔네요.

젠킨스 이미지 실행하기

이제 이미지를 컨테이너로 실행해야해요. 공식사이트에는 다음 명령어가 있네요.

docker run --rm -ti -p 8080:8080 -p 50000:50000 -v jenkins-home:/var/jenkins_home jenkins/jenkins:jdk11

위 명령어를 분석해볼게요. docker run 이란 이미지를 컨테이너로 만들어주고 실행해주는 명령어에요. 기본 포맷은 다음과 같아요. docker run (<옵션>) <이미지 아이디 혹은 이름> (<명령어>) (<인자>)

  • --rm

    컨테이너를 멈추면 아예 컨테이너를 종료해준다는 옵션이에요.

  • -ti

    -t 는 terminal 이고 -i 는 interactive 입니다. 컨테이너 내부 터미널로 실행하고 싶을 때 사용하는 명령어에요.

  • -p

    포트를 연결해주는 명령어에요. 컨테이너는 모두 격리되어있어요. 즉, 내 컴퓨터(호스트)에서 실행이 되어도 컨테이너는 호스트와 격리된 환경을 사용하고 있는 것이죠. 호스트에서 컨테이너로 포트로 연결을 이어줄 때 사용이 됩니다. <호스트 포트>:<컨테이너 내부 포트> 를 입력하게 되면 호스트 포트에서 컨테이너 내부 포트로 연결(bind)이 되어요. 만일, 8888:8080 이라고 입력하게 되면 호스트의 8888포트가 컨테이너 내부 8080포트로 연결이 된다는 의미에요!

    젠킨스는 기본적으로 8080포트(master port)와 50000포트(slave port)를 사용하기에 호스트 포트와 연결을 해주는 작업이에요. 젠킨스의 master and slave architecture에 대해 궁금하다면 https://www.edureka.co/blog/jenkins-master-and-slave-architecture-a-complete-guide/ 에 잘 나와있네요!

  • -v

    호스트와 컨테이너 간의 볼륨 설정을 위해 사용되는 명령어에요. 호스트와 컨테이너는 서로 격리되어 있지만, 컨테이너의 데이터를 호스트에 저장하고 사용하는 방식입니다. 마치 게임 세이브 하듯이요. 이렇게 저장하고 사용한다면 컨테이너를 지우고 다시 시작해도 같은 볼륨을 바라본다면 이전 컨테이너에서 저장한 데이터를 그대로 사용할 수 있게 돼요. <호스트 디렉터리>:<컨테이너 디렉터리>

위 명령어를 사용하면 굉장한 출력이 나올거에요. 잘 돌아가는 것 같은 출력! 하지만 불편한 게 하나 있어요. 터미널을 종료하면 컨테이너(젠킨스)도 같이 종료가 되죠. 그리고 콘솔모드로 실행이 되는 것이 불편해요. 실행하되 백그라운드 모드로 실행하는 옵션은 -d 에요. 그럼 지금 컨테이너는 ctrl+c로 종료하고 다시 명령어를 입력해 볼게요(현재 --rm 옵션으로 실행되기 때문에 멈추면 자동으로 컨테이너가 종료돼요.).

docker run -d -p 8080:8080 -p 50000:50000 --name jenkins -v jenkins-home:/var/jenkins_home jenkins/jenkins:jdk11

--name 명령어를 통해 컨테이너에 jenkins라는 이름을 주었어요. 이제 명령어를 입력해볼게요.

이전의 현란하던 콘솔은 사라지고 이상한 해시값만 주어진 채 우린 다시 터미널을 입력할 수 있는 상태로 넘어왔어요. 컨테이너가 잘 돌아가는 지는 docker ps -a 라는 명령어를 통해 확인할 수 있어요.

💡 도커 이미지, 컨테이너 확인하기

  • 이미지 확인하기 docker images
  • 실행중인 컨테이너 확인하기 docker ps
  • 모든 컨테이너 확인하기 docker ps -a

컨테이너가 잘 돌아가고 있네요.

💡컨테이너 생명주기
실행 중 : 컨테이너가 실행중인 상태를 이야기한다.
정지 : 컨테이너가 정지된 상태를 이야기한다.
파기 : 컨테이너가 종료되어 삭제된 상태를 이야기한다.

컨테이너 생성에서 삭제까지 명령어
컨테이너 생성하기 : docker create <이미지 식별번호>
컨테이너 시작하기 : docker start <컨테이너 식별번호>
컨테이너 실행하기 : docker run <이미지 식별번호> (생성과 시작을 동시에 한다.)
컨테이너 중지하기 : docker kill <컨테이너 식별번호> 혹은 docker stop <컨테이너 식별번호>
컨테이너 삭제하기 : docker rm <컨테이너 식별번호>

이제 localhost:8080 을 접속해볼게요. (host ip:port 로 접근하면 돼요!)

잘 나오네요!! 패스워드를 입력하라고 하는데 패스워드는 어디서 가져올 수 있을까요…? 위를 보면 힌트가 나와있어요! /var/jenkins_home/secrets/initialAdminPassword 에 패스워드가 들어있다고 하네요. 저 패스워드를 확인하기 위해서는 도커 컨테이너 내부의 저 파일을 확인해야하는데 어떻게 확인할 수 있을까요?

도커 컨테이너에 접근하기

이번엔 도커 컨테이너 내부로 접근할 거에요. docker exec <컨테이너> <명령어> 이라는 명령어를 통해 컨테이너 내부에 명령어를 전달할 수 있어요. linux 명령어인 cat 이라는 명령어를 컨테이너 내부에 전달해볼게요. docker exec jenkins-prod cat /var/jenkins_home/secrets/initialAdminPassword 하니 비밀번호가 나오네요. 출력된 비밀번호를 입력해 젠킨스에 들어가면 해결!

💡 컨테이너에 명령어 전달 방법
docker run <컨테이너> <명령어> : 컨테이너를 실행할 때 명령어를 전달할 때
docker exec <컨테이너> <명령어> : 실행중인 컨테이너에 명령어를 전달할 때

컨테이너 내부 터미널로 접근하고 싶을 때
docker exec -it <컨테이너> bash

도커 컨테이너 삭제 이후 다시 시작하기

실험 정신 + 테스트로 젠킨스 설정을 이것저것 만지다가 걷잡을 수 없을 때가 있을거에요. (저는 자주 그렇답니다.) 돌이킬 수 있는 방법은 그냥 삭제하고 다시 시작하기라고 저는 생각합니다…xD 이제 컨테이너를 삭제하는 방법을 알아볼게요. 먼저, docker ps -a 를 통해 컨테이너 정보를 확인해요. jenkins가 실행되고 있네요! 삭제하기 전에 docker stop jenkins 명령어를 통해 정지해야해요. 이제 컨테이너를 삭제해봅시다! docker rm jenkins

💡 삭제 명령어
docker rmi <이미지> : 이미지 삭제
docker rm <컨테이너> : 컨테이너 삭제
docker rm $(docker ps -aq) : 모든 컨테이너 삭제 ($(~) 는 다른 명령어에서도 활용 가능해요!)
docker system prune : 사용하지 않는 컨테이너 자원 모두 삭제 (제가 좋아하는 명령어에요!)

도커 볼륨

이제 다시 컨테이너 명령어를 입력해볼까요? docker run -d -p 8080:8080 -p 50000:50000 --name jenkins -v jenkins-home:/var/jenkins_home jenkins/jenkins:jdk11

다시 초기화 되어 있겠지 라는 기대감에 [localhost:8080](http://localhost:8080) 접근하면 이전 설정이 그대로 남아있는 것을 발견하실 거에요. ‘-‘?. 이러한 현상은 우리가 -v 를 통해 볼륨을 설정했기 때문이에요. 내 컴퓨터(호스트)에 세이브 파일이 연결되어있는 거죠! 이제 컨테이너 정지 + 삭제하고 우리의 세이브 파일(볼륨)도 삭제해볼게요. 우리가 갖고 있는 볼륨 정보를 확인하려면 docker volume ls 를 입력하면 돼요.

jenkins-home 이라는 볼륨이 존재하네요! 이제 docker volume rm jenkins-home 명령어를 통해 볼륨을 삭제한다면 볼륨이 삭제가 된답니다. (docker volume prune 명령어를 이용해 사용하지 않는 볼륨도 삭제할 수 있답니다!) 이제 다시 시작하면 처음부터 실행이 되네요!

💡 docker inspect
관련 정보를 전부 볼 수 있는 단축키! 제가 제일 좋아하는 단축키에요.
컨테이너, 이미지, 볼륨 식별번호를 후에 입력하게 되면 관련 정보가 다 뜬답니다!
어떤 설정들이 적용되어 있나 확인이 가능하고 공부하기에 매우 좋은 단축키 같아요!

정리

💡 단축키 정리
컨테이너 및 이미지 확인
- 이미지 확인하기
docker images
- 실행중인 컨테이너 확인하기
docker ps
- 모든 컨테이너 확인하기
docker ps -a

컨테이너 생성에서 삭제까지 명령어
컨테이너 생성하기 : docker create <이미지 식별번호>
컨테이너 시작하기 : docker start <컨테이너 식별번호>
컨테이너 실행하기 : docker run <이미지 식별번호> (생성과 시작을 동시에 한다.)
컨테이너 중지하기 : docker kill <컨테이너 식별번호> 혹은 docker stop <컨테이너 식별번호>
컨테이너 삭제하기 : docker rm <컨테이너 식별번호>

컨테이너 명령 전달
docker run <컨테이너> <명령어> : 컨테이너를 실행할 때 명령어를 전달할 때
docker exec <컨테이너> <명령어> : 실행중인 컨테이너에 명령어를 전달할 때

컨테이너 내부 터미널로 접근하고 싶을 때
docker exec -it <컨테이너> bash

삭제 명령어
docker rmi <이미지> : 이미지 삭제
docker rm <컨테이너> : 컨테이너 삭제
docker rm $(docker ps -aq) : 모든 컨테이너 삭제 ($(~) 는 다른 명령어에서도 활용 가능해요!)
docker system prune : 사용하지 않는 컨테이너 자원 모두 삭제 (제가 좋아하는 명령어에요!)

정보 확인 명령어
docker inspect <식별>

도커 볼륨 명령어
docker volume <옵션>

도커로 젠킨스를 실행하며 도커에 대해 간단히 알아봤어요!! 개인적으로 기술을 사용해가며 사용법을 익히는 방법을 선호하기에 글 정리도 위와 같이 진행되었네요. 도커파일과 도커컴포즈는 다루지 않았어요! 관련 내용은 다음 포스팅을 기대해주세요!


© 2017. All rights reserved.

Powered by Hydejack v7.5.2