[Jenkins] Docker와 Jenkins

leejk1072·2025년 1월 6일

클라우드

목록 보기
6/8
  • 1부: Jenkins 란?
  • 2부: Docker와 Jenkins
  • 3부: Jenkins 설정하기

1. Docker와 Jenkins

제가 초반에 docker와 jenkins를 설치하는 방식을 충분히 이해하지 못하여 많은 시간 동안 어려움을 겪었습니다. 때문에 이 부분을 짚고 넘어가려 합니다.

무작정 해당 기술을 사용하기보다, 실행 원리를 이해하는 것이 중요하니까요. ^__^

Jenkins를 설치하는 여러 방식이 있지만,
저는 Docker를 사용하는 환경에서 Jenkins를 사용하겠다고 했습니다.

그런데 이 Docker와 Jenkins를 설치하는 방식도 여러 가지가 있습니다. 🙀
주로 다음과 같은 방식들이 있는데요. (모두 이해하려고 하기보다 머릿속으로 그림을 그리며 읽어보세요..)

1. Docker 컨테이너 안에 Jenkins 설치하기 (Dockerized Jenkins)
2. Docker 컨테이너에서 Docker 실행하기 (Docker-in-Docker)
3. Docker 호스트에서 Jenkins와 Docker를 직접 연결하기 (Docker Socket)

참고로, 제가 사용한 방식은 3번입니다.
그럼 이제 1번부터 설명을 해보겠습니다.

1. Docker 컨테이너 안에 Jenkins 설치하기 (Dockerized Jenkins)

  • Docker를 사용해 Jenkins를 컨테이너 내부에 설치하는 방법

  • 명령어

     docker run -d -p 8080:8080 --name jenkins jenkins/jenkins:lts
    • jenkins/jenkins:lts 라는 공식 Docker 이미지를 통해 Jenkins를 컨테이너 내에서 실행하는 명령어
  • 장단점

    장점단점
    - 간단한 설치- 리소스 제한
    - 격리된 환경- 스토리지 관리
    - 유연한 배포
    • 장점
      • 간단한 설치
        • 물리적 서버나 가상 머신에 별도로 설치할 필요 x, 간단하게 실행 가능
      • 유연한 배포
        • Docker 이미지로 언제 어디서든 Jenkins 환경을 쉽게 복제하고 배포할 수 있다.
    • 단점
      • 리소스 제한
        • Docker 컨테이너는 호스트머신의 리소스를 공유하기 때문에 리소스나 성능에 제한이 있을 수 있다.
        • Jenkins가 대규모 프로젝트나 고성능 빌드를 처리할 때 성능 문제가 발생할 수 있습다.
      • 스토리지 관리
        • Jenkins의 데이터(예, 빌드기록, 플러그인 등)를 Docker 컨테이너 내에 저장할 경우, 컨테이너가 삭제되면 데이터도 함께 삭제된다.
        • 이를 방지하려면 볼륨을 사용한다.

즉, Docker 컨테이너 안에서 Jenkins를 실행하는 방식 입니다.
이 방식은 간편하고 빠르게 Jenkins 환경을 설정할 수 있지만, 리소스나 성능 제한이 있을 수 있어 규모가 큰 프로젝트에서는 성능을 고려한 추가 설정이 필요합니다.

2. Docker 컨테이너에서 Docker 실행하기 (Docker-in-Docker)

  • Docker 컨테이너 내에서 또 다른 Docker를 실행하는 방식

  • 주로 Jenkins와 결합하여 사용되며, Jenkins의 빌드 프로세스 중 Docker 컨테이너를 사용해야 할 경우에 유용합니다.

  • 예를 들어, Jenkins의 빌드 작업이 Docker 컨테이너를 사용해야 하는 경우, Jenkins는 Docker 이미지를 사용하여 또 다른 Docker 컨테이너를 실행하게 됩니다.

  • 이 방식은 Docker-in-Docker라고도 하는데요

    • 이에 관한 다른 포스팅들을 찾아보시면 모두 이 방식을 추천하지 않는다는 걸 알 수 있습니다. 저희 멘토님도 추천하지 않으셨습니다 😅 그 이유를 여기서 자세히 다루진 않겠습니다. 일단 패스....

3. Docker 호스트에서 Jenkins와 Docker를 직접 연결하기 (Docker Socket)

  • Docker 소켓을 호스트와 컨테이너 간에 공유하여, 컨테이너가 호스트의 Docker Daemon을 직접 사용할 수 있도록 하는 방식

  • Jenkins가 호스트 시스템의 Docker를 제어할 수 있게 해줍니다.

  • 명령어

     docker run -d -p 8080:8080 --name jenkins \
     -v /var/run/docker.sock:/var/run/docker.sock \
     jenkins/jenkins:lts
    • Jenkins가 호스트 시스템의 Docker 소켓을 참조할 수 있게 합니다.
    • 이 방식은 Docker 컨테이너가 호스트 시스템의 Docker 데몬을 직접 활용할 수 있게 해줍니다.
  • 장단점

    장점단점
    - Docker와 Jenkins 통합 용이- 보안상 위험
    - 리소스 최적화- 권한 관리
    • 장점
      • Docker와 Jenkins 통합 용이
        • Docker와 Jenkins 통합이 매우 원활하며, Jenkins 내에서 실행되는 모든 Docker 명령을 호스트 시스템의 Docker Daemon이 처리하기 때문에, 효율적인 빌드 환경을 구축할 수 있습니다.
      • 리소스 최적화
        • Docker-in-Docker 방식과 달리 별도의 Docker 데몬을 실행하지 않기 때문에, 성능 측면에서 유리합니다.
        • Jenkins 컨테이너는 호스트의 리소스를 직접 사용하게 되어 효율적인 자원 관리가 가능합니다
    • 단점
      • 보안상 위험
        • Docker 소켓에 대한 권한을 컨테이너에게 주면, 해당 컨테이너가 호스트 시스템의 Docker Daemon을 제어할 수 있게 됩니다.
        • 이런 점에서 보안 취약점이 발생할 수 있다는 의미입니다.
      • 권한 관리
        • 호스트 시스템의 Docker 소켓에 대한 권한을 부여해야 하므로, 신중하게 접근해야 하며, 권한을 과도하게 부여하지 않도록 주의해야 합니다.

이 방식은 성능이 뛰어나고 통합이 원활하지만, 보안에 신경을 써야 하며 적절한 권한관리로 위험을 최소할 필요가 있겠습니다.


1개의 댓글

comment-user-thumbnail
2025년 1월 7일

글 잘 읽었습니다.

답글 달기