jenkins doc 참고 https://www.jenkins.io/doc/book/installing/

jenkins 설치

1. jenkins image pull

mkdir jenkins
cd jenkins/
docker pull jenkins/jenkins

먼저 이미지를 docker hub에서 받아온다.

2. jenkins compose.yml 생성

jenkins 하위 에서 volume 생성

mkdir volume
vi docker-compose.yaml

docker-compose.yaml 내용

version: '3.1'
services:
  jenkins:
    restart: always
    container_name: jenkins
    image: jenkins/jenkins
    ports:
      - "8080:8080"
    volumes:
      - "$PWD/volume:/var/jenkins_home"
      - "/var/run/docker.sock:/var/run/docker.sock"  

Info

> 컨테이너 내에서 명령어를 실행할 사용자 = root

호스트의 8080 포트를 jenkins의 8080 이랑 매칭

현재 디렉토리의 ‘volume’ 디렉토리를 ‘/var/jenkins_home’에 마운트 Jenkins 데이터를 호스트저장하고, 컨테이너 재시작 시에도 데이터 유지 가능

‘/var/run/docker.sock:/var/run/docker.sock’ : 호스트의 Docker 소켓 파일을 컨테이너 내에 마운트!!

Important

Jenkins 컨테이너 내에서 Docker 명령어를 실행할 수 있다.

3. 실행

sudo chown -R 1000:1000 $PWD/volume
 
docker-compose up -d

image docker ps 해도 됌

image

Info

Jenkins 컨테이너가 생성되면 jenkins 사용자는 UID를 1000을 갖게된다. 따라서 컨테이너가 죽었다가 재실행 하게 되면 mount 시켯어 volume 을 사용하게 되는데 이때 해당 volume 디렉토리는 UID를 1000으로 줬기 때문에 기존 정보를 끌어다가 Jenkins를 사용하게 된다.

4. 비번 확인

root@control:~# docker logs -f jenkins
 
*************************************************************
 
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
 
8f603757277a443e801c98a473e03420
 
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
 
*************************************************************

5. 비번 입력 후 행동절차

  • plug-in 설치image

  • 계정 설정image root 로 만들어봐

  • urlimage

접속완료

image

6. Jenkins 추가 설정 - 1. docker binary 설치

Info

Docker binary는 Docker를 실행하는 데 필요한 실행 파일들을 의미한다. 실행 파일들은 Docker 데몬과 클라이언트를 포함하며, Docker의 핵심 기능을 제공한다.

  • jenkins 컨테이너에 root 계정으로 접속

    root@ubuntu:~# docker exec -it -u 0 jenkins bash
    root@038095416cc5:/#
    • docker exec : 실행중인 Docker 컨테이너에서 명령어 실행
    • ‘-it’ : -i는 인터랙티브 모드로, 표준 입력을 활성화하여 사용자가 입력할 수 있도록 하고, -t 는 TTY(가상 터미널)를 할당해 사용자가 접속한 터미널에서 명령 할 수 있게 한다.
    • ‘-u 0’ : 사용자 ID 인데, 0은 루트사용자(관리자)를 의미한다. 0 없이 접속하면 기본적으로 생성되는 ‘jenkins’ 계정으로 접속하게 됨
  • docker binary 설치

    (download.docker.com/linux/static/stable/x86_64/)

    위 링크에서 설치 가능한 버전을 확인한 뒤 wget으로 다운로드 한다.(여기서는 18.06.3-ce 버전을 설치

    root@038095416cc5:/# cd ~
     
    apt-get update
    apt-get install -y wget
     
    wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.3-ce.tgz
     

    image

  • tar로 압축파일 해제

    root@038095416cc5:~# tar xvfz docker-18.06.3-ce.tgz
    docker/
    docker/docker-containerd
    docker/docker-proxy
    docker/docker
    docker/docker-runc
    docker/dockerd
    docker/docker-containerd-ctr
    docker/docker-containerd-shim
    docker/docker-init
  • docker 파일을 /usr/bin/으로 복사 및 컨테이너 접속 종료

    Info

Docker 자체는 Docker Daemon이라는 백그라운드 서비스를 실행하여 컨테이너를 관리하고, Docker CLI를 통해 사용자가 Docker Daemon과 상호작용할 수 있다.

Jenkins 서버에서 Docker CLI 명령어를 실행할 수 있어야 한다!!

그래서 /usr/bin/과 같은 실행 경로에 Docker CLI 바이너리를 복사하는 것이다.

    cp ./docker/docker /usr/bin/
    exit
  • jenkins 계정으로 접속 후 권한 문제 확인

    root@ubuntu:~# docker exec -it jenkins bash
    jenkins@038095416cc5:/$ docker --version
    Docker version 18.06.3-ce, build d7080c1
    jenkins@6ffa54b72b46:/$ docker ps
    Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/containers/json: dial unix /var/run/docker.sock: connect: permission denied

    -u 0 옵션 없이 로그인하면 위와 같이 jenkins 계정으로 로그인이 된다. 이 상태에서 ‘docker ps’ 등의 명령어를 사용하면 Permission denied가 된다.

7. Jenkins 추가 설정 - 2. Permission 설정

  • CentOS 7 서버(호스트)의 docker gid 확인

    도커 컨테이너 내부에서 Jenkins는 jenkins 유저로 실행됩니다. 이제 jenkins 유저가 docker.sock에 접근할 수 있도록 퍼미션을 잡아줘야 합니다.

    먼저 docker.sock파일은 host 에서 root유저와 docker 그룹으로 owner가 설정되어 있습니다. jenkins가 docker.sock파일에 접근하기 위해서는 docker group에 포함시켜 줘야 합니다.

    우선 호스트에서 docker group의 gid를 확인해보겠습니다.

    [DevOps] Jenkins를 이용한 자동 빌드 및 배포(1): Jenkins & GitLab 연동

    root@ubuntu:~# cat /etc/group | grep docker
    docker:x:998:user1
  • 그룹 생성 및 추가

    # root 계정으로 jenkins 컨테이너에 접속
    root@ubuntu:~# docker exec -it -u 0 jenkins bash
     
    # 호스트의 docker 그룹의 아이디로 docker 그룹을 추가
    root@038095416cc5:/# groupadd -g 998 docker
     
    # docker 그룹이 잘 추가되었는지 확인
    root@038095416cc5:/# cat /etc/group | grep docker
    docker:x:998:
     
    # docker 그룹에 jenkins 계정을 추가
    root@038095416cc5:/# usermod -aG docker jenkins
     
    # 컨테이너 접속 종료
    root@038095416cc5:/# exit
    exit
  • jenkins 컨테이저 재실행

    root@ubuntu:~# docker restart jenkins
    jenkins
  • jenkins 계정으로 로그인 뒤 docker 명령어 실행 가능여부 확인

    • 안된다.