[AWS] EC2의 Docker 위에 Jenkins Container 올리기
Cloud/AWS

[AWS] EC2의 Docker 위에 Jenkins Container 올리기

 

AWS EC2 Instance (Amazon Linux2) 에서 Docker로 Jenkins 이미지를 다운받아서 Container로 띄우는 것이 목표이다.

ec2 인스턴스가 있다고 가정하고, Java나 Docker나 모두 설치되어 있다고 가정을 하고 시작한다.

 

EC2 Instance 접속하기

먼저 Jenkins를 설치할 ec2 instance 에 접속한다. (putty, mobaXterm, vscode remote-ssh 등을 이용하여)

그리고 Docker를 실행하고, 간단한 설정을 진행한다.

# Docker 실행
$ sudo systemctl start docker

 

루트 사용자가 아닌 일반 사용자가 docker 명령어를 사용하려고 하면, Permission Denied 에러를 뱉는다.

따라서 sudo의 번거로움을 덜기 위하여 아래와 같이 Docker group현재 사용자 이름을 등록한다.

# 현재 사용자 이름 확인
$ echo $USER

# docker group에 사용자 추가
$ sudo usermod -aG docker $USER

# docker 재실행
$ sudo service docker restart

 

Jenkins image 다운로드

도커 이미지명 같은 경우 보통 [image name]:[image tag] 식의 네이밍 규칙을 가지고 있다.

컨테이너로 올릴 이미지가 로컬에 존재하지 않는다면, Docker Hub에서 서치하여 pull해와서 실행한다.

 

https://hub.docker.com/_/jenkins?tab=description&page=1&ordering=last_updated

 

Jenkins - Official Image | Docker Hub

Get more out of Docker with a free Docker ID Sign up for a Docker ID to gain access to all the free features Docker has to offer, including unlimited public repositories, increased container image requests, automated builds, and much more. Sign Up ✕

hub.docker.com

위 사이트를 참고하여 jenkins의 도커이미지 이름을 알 수 있다.

# jenkins image download
$ docker pull jenkins/jenkins:lts

# 로컬에 존재하는 docker images 확인
$ docker images
# 출력 예시
REPOSITORY        TAG         IMAGE ID       CREATED       SIZE
jenkins/jenkins   lts         22bfa28ae34c   3 weeks ago   572MB 

 

Docker image를 Container로 띄우기

다음 명령어를 통하여 다운로드 받은 image를 container로 띄울 수 있다.

# docker 컨테이너로 등록 후 실행
$ docker run -d -p 9090:8080 -v /jenkins:/var/jenkins_home --name jenkins -u root jenkins/jenkins:lts
  • -d: detached mode 이다. 백그라운드로 실행할 수 있게 해준다.
  • -p: host(앞)와 container(뒤)의 포트를 연결해준다.(port forwarding) -> 로컬Port:컨테이너Port
  • -v: host(앞)와 container(뒤)의 디렉토리를 연결해준다.(mount) -> 로컬Directory:컨테이너Directory
  • -u: 실행할 사용자 이름을 지정한다.
  • --name: 실행될 컨테이너의 이름을 지정한다.

 

다음 명령어를 활용하여 현재 실행되고 있는 컨테이너 및 보유하고 있는 컨테이너를 확인할 수 있다.

# 실행되고 있는 컨테이너 목록
$ docker ps

# 실행되고 있지 않는 컨테이너도 포함한 목록
$ docker ps -a

# 출력 예시
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                               NAMES
6b493370af1f   jenkins/jenkins:lts   "/sbin/tini -- /usr/…"   13 seconds ago   Up 12 seconds   50000/tcp, 0.0.0.0:9090->8080/tcp   jenkins

위의 경우, 로컬(ec2 인스턴스)의 9090포트로 들어오는 요청들을 도커 컨테이너(jenkins)의 8080포트로 포트포워딩 시켜준다.

따라서 ec2 인스턴스의 보안 그룹인바운드 정책을 수정할 필요가 있다.
(9090포트로 들어오는 요청을 허용해야한다. 이 부분은 여기서 다루진 않겠다.)

 

Jenkins 접속하기

ec2 인스턴스의 퍼블릭 IPv4 주소:9090 혹은 퍼블릭 IPv4 DNS:9090로 접속이 가능하다.

주의할 점은 당연한 얘기지만 ec2 환경에서 8080 포트를 사용하고 있지 않아야 한다.

8080포트를 이미 사용하고 있어도 지금까지 위에서 진행된 내용들은 정상적으로 진행이 된다.

하지만 9090포트로 접속하려고 시도하면 8080포트로 포트포워딩이 정상적으로 진행되지 않는다.

netstat -ntlp | grep :80 명령어를 활용하여 8080포트가 사용되고 있는지를 확인한다.

 

정상적으로 접속이 된다면 아래와 같은 화면을 브라우저에서 볼 수 있을 것이다.

docker+jenkins-1

위에서 요구하는 패스워드는 도커 컨테이너 안에 특정파일 안에 존재한다.

 

아래 명령어를 활용하여 패스워드를 알아낼 수 있다.

# docker의 jenkins 컨테이너로 접속하여 /var/jenkins_home/secrets/initialAdminPassword 읽기
$ docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
  • docker exec 명령어는 컨테이너에 접속하는 명령어이다.

 

참고로 도커 컨테이너 내부로 접속하고 싶다면 다음 명령어를 사용하면 된다.

$ docker exec -it [컨테이너 ID 혹은 컨테이너 Name] /bin/bash
  • exit을 활용해 접속을 종료하고 외부로 빠져나올 수 있다.
  • 도커 컨테이너 내부에서 cat /var/jenkins_home/secrets/initialAdminPassword을 활용하여 패스워드를 알아낼 수도 있다.

 

docker+jenkins-2

위 사진 처럼Install suggested plugins를 선택하여 플러그인을 설치하고 나면 아래 사진과 같이 Admin 계정을 만드는 화면을 볼 수 있다.

 

docker+jenkins-3

Admin 계정을 만들고 나면 Instance Configuration이 나올텐데 Jenkins URL이 ec2 인스턴스의 퍼블릭 IPv4 DNS:port number와 동일한지 확인 한 뒤 Save and Finish를 선택한다.

 

아래 사진처럼 Jenkins에 접속했다면 성공한 것이다.

docker+jenkins-4

 

도커 컨테이너 시작/중단/삭제하기

컨테이너가 이미 존재한다고 가정했을 때, docker ps -a 명령어로 보유하고 있는 도커 컨테이너 목록을 확인할 수 있다.

  • 참고: docker images로는 보유하고 있는 도커 이미지 목록을 확인할 수 있다.

 

컨테이너 시작하기

$ docker start [컨테이너ID or 컨테이너Name]

 

컨테이너 중지하기

$ docker stop [컨테이너ID or 컨테이너Name]

 

컨테이너 삭제하기

$ docker rm [컨테이너ID or 컨테이너Name]

 

Refer to

 

초보를 위한 도커 안내서 - 설치하고 컨테이너 실행하기

초보를 위한 도커 안내서 2번째 글입니다. 도커의 기본적인 내용을 이야기 했던 첫번째 글에 이어 실제로 도커를 설치하고 컨테이너를 실행하면서 도커 명령어를 알아봅니다. 도커를 처음 접하

subicura.com