도커와 젠킨스 (1) - 설치

김동헌·2023년 12월 1일
0

Jenkins

목록 보기
1/5
post-thumbnail

AWS의 Amazon Linux는 Red Hat 계열의 배포판이기 때문에 yum 패키지 관리자를 사용

리눅스 패키지 관리자 업데이트
sudo yum update

도커 설치하기 위한 의존성 패키지 설치
sudo yum install yum-utils

Docker 공식 지원 저장소가 시스템에 추가되고 Docker 엔진이 설치됩니다
sudo amazon-linux-extras install docker

  • amazon-linux-extras 명령어는 Amazon Linux 2에서 사용할 수 있는 추가 소프트웨어 및 패키지를 관리하는 도구
  • install docker 부분은 Docker를 설치하기 위해 사용

해당 명령어는 Amazon Linux 2를 사용하는 Amazon EC2 인스턴스를 사용해야 가능한 명령어입니다.

  • 만약 sudo: amazon-linux-extras: command not found 오류가 발생하면 인스턴스가 Amazon Linux 2 AMI로 실행되지 않은 것입니다.
    - cat /etc/system-release를 명령어를 사용해서
    Amazon Linux 2를 사용하는지 확인해보세요!

다른 운영체제의 경우 Docker 참고를 하시면 도움이 되실 것 같습니다 !
Amazon Linux 2023 AMI Docker 설치


리눅스 패키지 관리자 업데이트 (다시)
sudo yum update

AWS 리눅스 환경에서는 별도의 저장소 추가와 GPG 키 추가 과정이 필요하지 않다.


도커 서비스 시작
sudo service docker start

(선택 사항) 시스템이 재부팅될 때마다 Docker 데몬이 시작되도록 하려면 다음 명령을 실행
sudo systemctl enable docker

sudo를 사용하지 않고도 Docker 명령을 실행할 수 있도록 docker 그룹에 ec2-user를 추가
sudo usermod -a -G docker ec2-user

설치 확인
sudo docker run hello-world

[ec2-user@ip-~]$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
719385e32844: Pull complete
Digest: sha256:c79d06dfdfd3d3eb04cafd0dc2bacab0992ebc243e083cabe208bac4dd7759e0
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

젠킨스 컨테이너로 실행

※ 참고 → 메모리 부족
젠킨스를 사용하면서 메모리 사용량을 조회해 보니 컨테이너 실행만으로 600MB의 메모리를 사용하고 빌드 시 1GB 가까이 메모리를 사용합니다. 저는 아주 간단한 프로젝트를 빌드 했지만 프로젝트의 규모가 커질수록 메모리 사용량은 늘어날 것으로 보입니다.

이 점 서버 구성할 때 참고하세요! (AWS에서 프리 티어 플랜을 사용할 경우 작동이 원활하지 않을 수 있습니다.)

도커 허브에서 젠킨스 이미지 다운로드

  • 도커 허브 계정이 없어도 이미지가 다운로드 됩니다.

docker pull jenkins/jenkins:lts

다운로드된 이미지 확인
docker images

[ec2-user@ip-~]$ sudo docker images
REPOSITORY        TAG       IMAGE ID       CREATED        SIZE
jenkins/jenkins   lts       6adc6425cd34   2 weeks ago    476MB → 이 부분
hello-world       latest    9c7a54a9a43c   7 months ago   13.3kB

jenkins 이미지 실행

docker run -d -p 8081:8080 -p 50000:50000 -v /home/jenkins:/var/jenkins_home -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -u root jenkins/jenkins:lts

사용된 옵션 -d -p -v -u

-d : 컨테이너를 백그라운드에서 실행하는 옵션입니다.

-p : 호스트의 포트와 컨테이너의 포트를 연결하는 옵션입니다.

  • -p [호스트 포트번호]:[컨테이너 포트번호]
  • -p 8081:8080 : 호스트서버의 8081포트와 컨테이너의 8080포트를 연결

-v : 호스트의 디렉토리와 컨테이너 디렉토리를 볼륨으로 매핑합니다.
쉽게 말해서 서로 지정된 디렉토리를 공유한다는 뜻입니다.

-u : 컨테이너의 실행 사용자를 지정합니다.

run

  • 이미지를 기반으로 컨테이너를 실행시킵니다. 위에서는 jenkins/jenkins:lts 이미지를 실행

-p 50000:50000

  • 젠킨스 마스터 노드는 빌드 에이전트와 통신할 때 JNLP(Java Network Launch Protocol)을 사용.
    JNLP통신은 TCP/IP기반으로 이뤄지고, 기본적으로 50000번 포트
  • 컨테이너는 기본적으로 격리된 환경에서 실행되기 때문에, 젠킨스 마스터 노드와 빌드 에이전트가 통신하려면 같은 컨테이너에 있더라도 호스트 서버를 통해 통신하게 됩니다.
    - 통신관계를 간단하게 표현하면 (빌드에이전트 ↔ 호스트서버 ↔ 마스터노드)

-v /home/jenkins:/var/jenkins_home

  • 젠킨스 컨테이너의 설정을 호스트 서버와 공유함으로써,
    컨테이너가 삭제되는 경우에도 설정을 유지할수 있게 해줍니다.
  • 호스트 디렉토리(/home/jenkins)와, 컨테이너 디렉토리(/var/jenkins_home)를 연결합니다
    연결한다는 의미는
    호스트의 /home/jenkins에 test.txt파일을 추가하면
    컨테이너의 /var/jenkins_home경로에도 test.txt파일이 추가된다는 의미입니다. 반대로도 동일

-v /usr/bin/docker:/usr/bin/docker:

  • 호스트의 /usr/bin/docker 파일을 컨테이너의 /usr/bin/docker 파일에 바인딩합니다.
    호스트에서 실행 중인 Docker 실행 파일을 컨테이너 내에서 사용할 수 있습니다.
  • Jenkins 컨테이너 내에서 호스트 서버의 Docker 실행 파일을 활용하여 빌드 및 배포 작업을 수행 가능합니다.

-v /var/run/docker.sock:/var/run/docker.sock

  • 호스트의 Docker 소켓을 컨테이너의 Docker 소켓에 매핑합니다.
  • 컨테이너 내부에서 호스트의 Docker 데몬과 통신하여 Docker 명령을 실행하거나 빌드 및 배포 작업을 수행할 수 있습니다.

이러한 구성컨테이너 내부에서 호스트 서버의 도커를 사용하는 DooD(Docker out of Docker)입니다.
컨테이너 내부에 도커를 설치해서 사용하는 방식인 DinD(Docker in Docker)도 있습니다.

-u root jenkins/jenkins:lts

  • 호스트 서버의 디렉토리를 공유하기때문에 권한 문제가 있을수있어 root사용자로 실행

젠킨스 실행 확인
sudo docker ps

[ec2-user@ip-~]$ sudo docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                                      NAMES
03685d6d4025   jenkins/jenkins:lts   "/usr/bin/tini -- /u…"   35 seconds ago   Up 33 seconds   0.0.0.0:50000->50000/tcp, :::50000->50000/tcp, 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp   unruffled_bassi

AWS 보안그룹 인바운드 규칙


젠킨스 접속

http://{서버ip or 도메인}:8081

해당 화면으로 알려주는 경로 /var/jenkins_home/secrets/initialAdminPassword로 접근해서 임시비밀번호를 조회할 수 있으나, 해당 방법은 컨테이너에 접속해서 해당 경로로 찾아가야되는 번거로움이 있습니다.

아래 방법으로 간편하게 조회할 수 있습니다.
docker logs [젠킨스 컨테이너ID]

일반적으로 Jenkins 초기 설정 비밀번호는 /var/jenkins_home/secrets/initialAdminPassword 파일에 저장되어 있지만, 컨테이너 로그를 통해도 얻을 수 있습니다. 해당 방법을 통해 번거로움 없이 빠르게 초기 비밀번호를 확인할 수 있습니다.


젠킨스 최초 설정

왼쪽 파란색을 클릭한다.

설정 유지는 위에서 설명했지만 다시 한번 적어놓았습니다 !
-v /home/jenkins:/var/jenkins_home

  • 젠킨스 컨테이너의 설정을 호스트 서버와 공유함으로써,
    컨테이너가 삭제되는 경우에도 설정을 유지할수 있게 해줍니다.

계정 생성

경로 설정

해당 아이피는 변경되어서 그냥 첨부했습니다 : >
경로 설정은 초기 값 그대로 두시면 됩니다 !

끝.

참고 자료
amazon docker 설치

profile
백엔드 기록 공간😁

0개의 댓글