본문 바로가기
CI&CD/젠킨스

[Jenkins] 2장 - 젠킨스 설치하기 (Feat. 자바, 톰캣, Nginx, 도커)

by 책 읽는 개발자_테드 2022. 2. 15.
반응형

초보를 위한 젠킨스 2 활용 가이드 2/e를 읽고, 정리한 글입니다.

 

목차

· 젠킨스를 서블릿 컨테이너에서 실행하기(톰캣)

· 젠킨스를 스탠드얼론 애플리케이션으로 실행하기

· 젠킨스를 리버스 프록시 서버 뒤에서 실행하기(Nginx)

· 젠킨스를 이용해 실행하는 방법

· 도커 데이터 볼륨의 이점을 살리는 방법

· 도커를 이용해 개발, 스테이징, 프로덕션 환경의 젠킨스 실행 방법

 


 

젠킨스를 서블릿 컨테이너에서 실행하기(톰캣)


· 젠킨스를 실행 가능한 서블릿 컨테이너: 아파치 제로니모 3.0, 글래시피시, IBM 웹스피어, 제이보스, 제티, 요나, 리버티 프로파일, 톰캣, 웹로직

 

· 여기서는 젠킨스를 톰캣 서블릿 컨테이너를 통해 실행하는 방법을 알아본다. 젠킨스를 기존에 설치돼 있는 톰캣 서버 위에 다른 서비스들과 같이 실행시키거나, 젠킨스만을 위한 톰캣(권장되는 방법)을 설정할 수 있다.

 

자바 설치

1. 패키지 인덱스를 업데이트한다.

sudo apt-get update

 

2. 자바를  설치한다.

sudo apt-get install default-jre

 

3. 자바 설치 경로를 알아낸다.

update-java-alternatives -l

 

4. /etc/environment 파일을 수정하기 위해 연다. 이전에 복사한 자바 경로를 파일에 추가한다.

sudo vim /etc/environment

 

JAVA_HOME="/usr/lib/jvm/java-1.11.0-openjdk-amd64"

 

5. 변경한 사항을 적용시킨다.

sudo source /etc/environment

 

아파치 톰캣 설치

1. /tmp 폴더로 이동한 후 wget 명령어를 통해 톰캣을 다운로드한다.

cd /tmp
wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.16/bin/apache-tomcat-8.5.16.tar.gz

 

2. /opt/tomcat 폴더를 생성하고, 해당 경로에 압축 파일을 해제한다.

sudo mkdir /opt/tomcat
sudo tar xzvf apache-tomcat-8*tar.gz  -C /opt/tomcat --strip-components=1

 

 

3. systemd 서비스 파일을 생성한다.

- 서비스: 시스템의 백그라운드에서 돌아가는 프로그램

 

sudo vim /etc/systemd/system/tomcat.service

 

다음 내용을 파일 안에 복사한다.

[Unit]
Description=Apache Tomcat Web Application Container
After=network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amd64
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

[Install]
WantedBy=multi-user.target

 

4. systemd 데몬 변경 사항을 적용한다. 

sudo systemctl daemon-reload

 

5. 톰캣 서비스를 다시 실행한다.

sudo systemctl start tomcat

 

6. 톰캣 서비스 상태를 확인한다.

sudo systemctl status tomcat

 

방화벽과 8080 포트 활성화

아파치 톰캣은 기본적으로 8080 포트를 이용해 동작한다. 방화벽이 비활성화돼 있다면 다음 명령으로 활성화시킨다.

 

1. 방화벽을 활성화시킨다.

sudo ufw enable

 

2. 8080 포트를 연다.

sudo ufw allow 8080

 

3.OpenSSH를 활성화시켜 SSH 연결을 가능케 한다.

sudo ufw allow OpenSSH

 

4. 방화벽 상태를 확인한다.

sudo ufw status

 

5. 다음 경로를 통해 아파치 통캣 서버에 접속할 수 있다.

 

6. 다음 경로를 통해 아파치 톰캣 서버에 접속할 수 있다.

http://<IP address of the Apache Tomcat>:8080

브라우저를 통해 톰캣 서버 접속

톰캣 서버 설정하기

1. /opt/tomcat/conf 폴더에서 tomcat-users.xml 파일을 수정하기 위해 연다

sudo nano /opt/tomcat/conf/tomcat-users.xml

 

2. 파일 안의 주석 처리되어 있는 role, user 관련 내용의 주석을 풀고, 다음과 같이 수정한다. 톰캣 관리자 앱 페이지에 접근하기 위한 설정이다.

  <role rolename="manager-gui"/>
  <role rolename="admin-gui"/>
  <user username="admin" password="password" roles="manager-gui, admin-gui"/>

 

3. /opt/tomcat/webapps/manager/META-INF/context.xml 파일과 /opt/tomcat/webapps/host-manager/META-INF/context.xml 파일을 연다. 파일 안에 다음 영역을 주석 처리한다.

 

/opt/tomcat/webapps/manager/META-INF/context.xml

<Context antiResourceLocking="false" privileged="true" >
<!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />-->
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

 

/opt/tomcat/webapps/host-manager/META-INF/context.xml

 

<Context antiResourceLocking="false" privileged="true" >
        <!--  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

 

기본적으로 톰캣 관리자와 호스트 관리자 애플리케이션은 톰캣 서버를 통해서만 접근할 수 있다. 후에 원격 머신에서 톰캣 위에서 동작될 서비스를 관리할 것이므로, 이 제약을 해제한다.

 

 

4. 톰캣 서버를 다시 시작한다.

sudo systemctl restart tomcat

 

5. 톰캣 관리자와 호스트 관리자 앱을 톰캣 서버 홈페이지를 통해 접근해보자.

 

톰캣 관리자 앱 접속: http://<IP address of the Apache Tomcat>:8080/manager/html

* ID/Password는 앞서 tomcat-users.xml에 입력한 내용을 사용한다.

 

 

호스트 관리자 앱 접속: http://<IP address of the Apache Tomcat>:8080/host-manager/html

 

톰캣 서버 위에 젠킨스 설치

1. /tmp 폴더로 이동한 후 wget 명령어를 통해 젠킨스 앱을 다운로드 한다.

cd /tmp
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

 

2. 다운로드 받은 파일을 /opt/tomcat 폴더로 이동시킨다.

sudo mv jenkins.war /opt/tomcat/webapps/

 

3. /opt/tomcat/webapps/ 폴더 내에 있는 파일을 살펴본다.

sudo ls -l /opt/tomcat/webapps

4. 아래 주소로 젠킨스에 접근할 수 있다.

http://<IP address of the Apache Tomcat>:8080/jenkins

 

젠킨스를 톰캣 서버에 독립적으로 설치하기

* 젠킨스만을 위해 서버를 할당하는 방법으로, 이 방벙을 사용하길 권장한다.

 

1. /tmp 폴더로 이동한 후 wget 명령어를 통해 젠킨스 앱을 다운로드 한다.

cd /tmp
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

 

2. 다운로드한 jenkins.war 패키지 이름을 ROOT.war로 변경한다.

sudo mv jenkins.war ROOT.war

 

3. root 사용자로 전환해 /opt/tomcat/webapps 폴더 안의 모든 내용을 삭제한다.

sudo su -
cd /opt/tomcat/webapps
sudo rm -r *

 

4. 앞서 생성한 ROOT.war을 /opt/tomcat/webapps 폴더로 이동시킨다.

sudo mv /tmp/ROOT.war /opt/tomcat/webapps/

 

해당 폴더를 살펴보면 ROOT 폴더가 자동으로 생성된 것을 볼 수 있다.

 

4. http://<IP address of the Apache Tomcat>:8080/을 통해 접속하면 추가 경로 없이 젠킨스에 접근할 수 있다.

 

젠킨스 홈 경로 설정

· 젠킨스를 사용하기 전 jenkins_home 경로를 꼭 설정하자.

- 젠킨스를 톰캣 위에 서비스로 설치할 경우 jenkins_home 경로는 자동으로 /root/.jenkins/로 설정된다. 여기에 젠킨스의 설정 파일, 로그, 빌드 결과, 대시보드에 관한 모든 것이 저장된다.

 

1. 아파치 톰캣 서버를 멈춘다.

sudo systemctl stop tomcat

 

2. /opt/tomcat/conf/context.xml 파일의 <Context> </Context> 사이에 다음 내용을 추가한다.

<Environment name="JENKINS_HOME" value="/var/jenkins_home" type="java.lang.String"/>

 

3. 톰캣 서비스를 시작한다.

sudo systemctl start tomcat

 

젠킨스를 스탠드얼론 애플리케이션으로 실행하기


· 여기서는 우분투 OS에 젠킨스를 설치하는 방법을 알아봅니다. 젠킨스 설치 전 자바 설치가 필요하지만, 앞서 알아본 내용과 중복되어 생략합니다.

 

젠킨스 최신 버전 설치

 

1. 시스템에 저장소 키를 추가한다.

wget --no-check-certificate -qO - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -

 

OK라고 결과나 나와야 한다.

 

2. 데비안 패키지 저장소 주소를 추가한다.

echo deb http://pkg.jenkins.io/debian binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list

 

3. 패키지 인덱스를 업데이트한다.

sudo apt-get update

 

* The following signatures couldn't be verified because the public key is not available: NO_PUBKEY <퍼블릭키> 오류가 발생하면 다음 명령어를 실행한다.

sudo apt-key adv --keyserver  keyserver.ubuntu.com --recv-keys <퍼블릭키>

 

4. 젠킨스를 설치한다.

sudo apt-get install jenkins

 

5. 기본적으로 젠킨스는 8080 포트로 동작한다. 웹 브라우저에 http://<Jenkins server IP address>:8080/을 입력해 젠킨스에 접근하자.

 

* /var/log/jenkins/jenkins.log에 접근해 젠킨스의 문제를 해결할 수 있다. 젠킨스 서비스는 설치 과정에서 자동으로 생성된 Jenkins 사용자로 실행된다.

 

젠킨스 최신 안정 버전 설치

1. 시스템에 저장소 키를 추가한다.

wget --no-check-certificate -qO - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -

 

 

 

2. 데비안 패키지 저장소 주소를 추가한다.

echo deb http://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list

 

3. 패키지 인덱스를 업데이트한다.

sudo apt-get update

 

4. 젠킨스를 설치한다.

sudo apt-get install jenkins

 

젠킨스를 리버스 프록시 서버 뒤에서 실행하기(Nginx)


· 우분투에서 스탠드얼론 형태로 실행되는 Nginx 서버를 스탠드얼론으로 돌아가는 젠킨스 서버 앞에 배치하는 방법을 알아보자.

 

Nginx 설치와 설정

1. 패키지 인덱스를 업데이트한다.

sudo apt-get update

 

2. nginx를 설치한다.

sudo apt-get install nginx

 

Nginx 서버 방화벽 설정

1. 방화벽 상태를 utw 명령어를 통해 확인한다.

sudo ufw status

 

다음과 같이 활성화되어 있다면, 다음 단계로 넘어간다.

그렇지 않으면, 다음 명령어로 활성화한다.

sudo ufw enable

 

2. 설정 가능한 목록을 확인한다.

sudo ufw app list

 

세 개의 Nginx 프로파일과 하나의 OpenSSH 프로파일이 나와야 한다.

- Nginx Full: 암호화되지 않은 80 포트와 433 포트(TLS/SSL)을 연다.

- Nginx HTTP: 암호화되지 않은 80 포트만 연다.

- NGINX HTTPS: 암호화되지 않은 433 포트(TLS/SSL)만 연다.

- OpenSSH: 22 포트(SSH)만 연다.

가장 제약이 많은 프로파일만 활성화시키는 것이 좋다.

 

3. 간단히 하기 위해 Nginx Full 프로파일을 활성화시킨다.

sudo ufw allow 'Nginx Full'

 

4. 변경된 내용을 확인한다. 

sudo ufw status

 

 

OpenSSH 프로파일이 활성화돼 있지 않다면, 활성화시킨다. (OpenSS가 비활성화돼 있다면 Nginx 머신에 로그인할 수 없다.)

sudo ufw allow OpenSSH

 

5. Nginx 서비스가 동작하는지 확인한다.

systemctl status nginx

 

*  ipv6 를 disable 해 두는 서버인 경우 Nginx에서 "Address family not supported by protocol" 에러가 발생할 수 있다.

이 경우 /etc/nginx/sites-enabled/default 파일에서 아래 부분을 주석처리하면 해결된다.

#listen [::]:80 default_server;

 

6. http://<IP Address>:80을 통해 Nginx 홈페이지에 접속할 수 있다.

Nginx 관리 명령어

1. 시작

sudo systemctl start nginx

 

2. 종료

sudo systemctl stop nginx

 

3. 재시작

sudo systemctl restart nginx

 

4. 변경된 설정 적용

sudo systemctl reload nginx

 

TODO: OpenSSL을 이용해 Nginx 보안을 유지하기

· Nginx 서버를 사용하기 위해 직접 서명한 SSL 증명서를 발급하는 방법을 알아보자.

 

SSL 증명서 만들기

1. OpenSSL을 이용해 직접 서명한 키와 증명서 조합을 만든다.

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt

 

파라미터 설명
req X.509 CSR(Certificate Signing Request) 관리 방법을 사용한다.
-x509 CSR을 생성하는 대신 직접 서명한 인증서를 만든다.
-nodes 패스워드를 이용해 증명서를 확인하는 것을 생략하게 해준다.
-days 증명서의 유효기간을 설정한다.
-newkey rsa:2048 OpenSSL이 새로운 증명서와 키를 동시에 생성하게 한다. rsa:2048 옵션은 RSA 키가 2048 비트의 길이가 되게 한다.
-keyout 원하는 장소에 생성된 프라이빗 키를 저장할 수 있다.
-out 원하는 장소에 생성된 증명서를 저장할 수 있다.

 

/etc/ssl/private/ 폴더에는 nginx-selfsigned.key 파일, /etc/ssl/certs/ 폴더에는 nginx-selfsigned.crt이 생성된다.

 

2. 클라이언트와 정보 교환 과정에서 완전 순방향 비밀성(PFS, Perfect Forward Secrecy)을 유지하기 위해 강력한 디피 헬만 그룹을 생성한다.

 

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

 

완료된 후 dhparam.pem 파일을 /etc/ssl/certs 폴더 안에서 찾아 볼 수 있다.

 

강력한 암호화 설정 생성하기

1. ssl-params.conf 설정을 /ect/nginx/snippets/ 안에 생성한다.

sudo vim /etc/nginx/snippets/ssl-params.conf

 

다음 코드를 위에서 생성한 파일 안에 입력한다.

# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

 

Nginx 설정 변경

· SSL을 활성화시키기 위해 Nginx 설정을 변경하자.

 

1. /etc/nginx/sites-available/ 폴더에 default 파일명으로 존재하는 기존 Nginx 설정 백업하자.

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup

 

2. /etc/nginx/sites-available/default 파일 설정을 변경한다. 암호화되지 않은 HTTP 요청이 자동으로 암호화된 HTTPS로 리다이렉트되게 설정을 변경한다.

 

server {
        listen 80 default_server;
        # listen [::]:80 default_server;
        server_name _;
        return 301 https://$server_name$request_uri;
}

server{
       # SSL Configuration
        listen 443 ssl http2 default_server;
        # listen [::]:443 ssl http2 default_server;
        ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
        ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
        include /etc/nginx/snippets/ssl-params.conf;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;
		server_name _;
        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }
}

TODO: 내용추가

 

젠킨스 서버 설정

1. 젠킨스를 Nginx와 연동하려면 젠킨스 설정을 수정해 젠킨스 서버가 모든 인터페이스(0.0.0.0)가 아닌 젠킨스의 IP 주소나 도메인을 통해서만 동작하게 설정해야한다. 모든 인터페이스를 통해 접근 가능하면, 기존의 암호화되지 않은 8080 포트로 접근이 가능해진다.

 

이를 위해 /etc/default/jenkins 설정 파일을 변경한다.

 

JENKINS_ARGS 뒤에 다음 코드를 추가한다.

--httpListenAddress=<IP Address of Your Jenkins>

 

예를 들어 다음과 같은 형태가 된다.

JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT --httpListenAddress=192.27.184.61"

 

2. 젠킨스를 다시 시작한다.

sudo systemctl restart jenkins

 

Nginx 설정에 리버스 프록시 추가하기

1. Nginx 설정 파일을 수정한다.

sudo vim /etc/nginx/sites-available/default

 

모든 요청을 젠킨스 서버로 보내므로, 기본 설정인 try_files 라인을 주석처리하고, 프록시 설정을 추가한다.

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                # try_files $uri $uri/ =404;
                include /etc/nginx/proxy_params;
                proxy_pass http://<ip address of jenkins>:8080;
                proxy_read_timeout 90s;
                
                #잠재적인 리버스 프록시 설정이 고장났습니다. 에러 수정
                proxy_redirect http://<ip address of jenkins>:8080 
                https://your.ssl.domain.name;
        }

 

2. 설정 파일에 문법 오류가 있는지 확인한다.

sudo nginx -t

 

3. 에러가 없다면, nginx를 재시작한다.

sudo systemctl restart nginx

 

4. https://<nginx-ip-address>:80을 통해 Nginx 서버에 접속하면, 젠킨스 시작 페이지로 바로 이동할 수 있다.

 

 

도커에서 젠킨스 실행하기


· 젠킨스를 도커 위에서 실행했을 때 장점:

1. 프로덕션용 젠킨스 서버에 여러 개의 개발 및 스테이징 인스턴스를 만들 필요가 생겼을 때 유용한다.

2. 중요한 젠킨스 서버를 유지 보수해야 할 때 유용한다.

3. 트래픽을 두 번째 젠킨스로 분산시키는 경우 유리하다.

 

도커 설치하기

1. apt가 저장소를 사용할 수 있게 한다.

sudo apt-get install apt-transport-https ca-certificates

 

2. 도커 공식 GPG 키를 등록한다.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

 

3. 등록한 키 ID가 58118E89F3A912897C070ADBF76221572C52609D와 일치하는지 확인한다.

apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D

 

4. 도커 안정 버전 저장소를 추가한다.

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

 

5. 패키지 인덱스를 업데이트한다.

sudo apt update

 

6. 도커를 설치한다.

sudo apt install docker-ce

 

 

7. 도커 서비스는 자동으로 시작된다. 다음 명령어로 확인할 수 있다.

sudo docker run hello-world

 

젠킨스 컨테이너 실행하기

1. 젠킨스 컨테이너를 실행한다. 도커 허브에서 젠킨스 도커 이미지(jenkins/jenkins:lts)를 다운로드하는 데 약간의 시간이 소요될 수 있다. 

docker run -d --name jenkins_dev -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts
파라미터 설명
docker 도커 유틸리티를 호출하기 이해 사용
run 컨테이너를 실행하기 위한 도커 명령어
-d 컨테이너를 백그라운드로 실행하기 위한 옵션
--name 컨테이너에 이름을 짓기 위한 옵션
-p 컨테이너의 포트와 호스트를 연결시키는 옵션
jenkins/jenkins:lts 컨테이너를 생성하기 위한 도커 이미지의 이름과 버전.
jenkins/jenkins는 젠킨스 도커 이미지고, lts는 해당 이미지의 특정 버전이다.

  

2. 실행되고 있는 컨테이너를 확인한다.

 docker ps --format "{{.ID}}: {{.Image}} {{.Names}}"

 

3. 젠킨스 서버가 http:<IP Address of Docker host>:8080에 준비되어, 젠킨스 시작하기 페이지를 볼 수 있다.

 

4. 젠킨스 설정을 위해서는 /var/jenkins_home/secrets/에 존재하는 initionalAdminPassword가 필요하다. 해당 파일에 접근하는 두 가지 방법이 존재한다.

 

첫째, docker exec 명령어로 알아내기

sudo docker exec -it jenkins_dev cat /var/jenkins_home/secrets/initialAdminPassword

 

둘째, 젠킨스 컨테이너에 접속하여 알아내기

sudo docker exec -it jenkins_dev bash
cat /var/jenkins_home/secrets/initialAdminPassword

* -i 옵션: 도커 컨테이너와 연동

* -t 옵션: 가상 -tty를 할당

 

젠킨스 컨테이너 안에 jenkins_home 폴더가 /var/ 폴더 안에 있는 것을, jenkins.war 파일이 /usr/share/jenkins/ 폴더 안에 있는 것을 볼 수 있다.

 

데이터 볼륨을 이용한 젠킨스 컨테이너 실행

· 앞서 jenkins_home 폴더에 영구적으로 데이터를 저장하지 않는 방법으로 젠킨스 컨테이너를 만들었다. 즉, 젠킨스 컨테이너를 삭제하면 jenkins_home 폴더도 같이 삭제된다.

 

· 이러한 문제를 해결하기 위해 데이터 볼륨을 이용해 젠킨스를 도커 위에서 수행하는 방식이 존재한다.

- 데이터 볼륨: 데이터가 컨테이너의 라이프 사이클에 상관없이 영구히 저장하는 특정한 폴더

- 컨테이너가 데이터 볼륨에 자료를 저장하면, 해당 컨테이너를 삭제하더라도 데이터는 유지된다. 컷테이너와 데이터 볼륨이 별개의 영역으로 구성되기 때문이다.

 

1. 젠킨스 컨테이너를 실행한다.

sudo docker run -d --name jenkins_prod -p 8080:8080 -p 50000:50000 -v jenkins-home-prod:/var/jenkins_home jenkins/jenkins:lts

 

"-v jenkins-home-prod:/var/jenkins_home" 옵션은 jenkins-home-prod라는 이름으로 데이터 볼륨을 만들어 /var/jenkins_home 폴더에 연결한다.

 

 

* 이전 컨테이너가 존재한다면 docker ps로 확인한 뒤 docker stop <the-container-id>로 제거하고, 위 명령어를 다시 입력한다.

                                                                                                                                                                  

2. jenkins_prod 컨테이너 내의 /var/jenkins_home 폴더의 내용을 살펴보자.

sudo docker exec -it jenkins_prod ls -lrt /var/jenkins_home

 

3. 도커 볼륨의 목록을 확인하자.

sudo docker volume ls

 

이제 영구적인 jenkins_home 폴더를 가진 젠킨스 도커 컨테이너가 생성됐다.

 

데이터 볼륨 테스트

· 젠킨스 서버에 변경 사항을 만들어 /var/jenkins_home 내부의 내용을 변경하고, 젠킨스 컨테이너를 삭제한 후, 같은 데이터 볼륨을 사용할 새로운 젠킨스 컨테이너를 만드는 테스트를 진행한다.

 

1. 활성화된 젠킨스 컨테이너를 확인한다.

 docker ps --format "{{.ID}}: {{.Image}} {{.Names}}"

                                                                

2. http://<ip address of docker host>:8080을 통해 젠킨스에 접속한다.

3. initialAdminPassword 파일의 내용을 확인한다.

sudo docker exec -it jenkins_prod cat /var/jenkins_home/secrets/initialAdminPassword

 

해당 내용을 젠킨스 페이지에서 Administrator password 필드에 붙여넣은 후 젠킨스 설정을 진행한다.

 

4. Create First Admin User 단계에서 새로운 사용자를 만든다.                                                                                                            

                                                  

5. 모든 사용자 정보가 저장되어있는 /var/jenkins_home/users 폴더 내용을 확인한다.

sudo docker exec -it jenkins_prod ls -lrt /var/jenkins_home/users

새롭게 생성한 사용자가 users 폴더 밑에 존재하는 걸 확인할 수 있다.

 

6. jenkins_prod 젠킨스 컨테이너를 삭제한다.

sudo docker kill jenkins_prod
sudo docker rm jenkins_prod

      

7. 실행되고 있거나 중지된 도커 컨테이너 목록을 확인한다.

sudo docker ps -a --format "{{.ID}}: {{.Image}} {{.Names}}"

 

8. 볼륨 목록을 확인한다.

sudo docker volume ls

컨테이너를 삭제하는 것이 컨테이너와 연관된 데이터 볼륨을 삭제하지 않은 것을 확인할 수 있다.

                                                                                                                                                                                                              9. jenkins-home-prod 볼륨을 사용하는 새로운 젠킨스 컨테이너를 jenkins-prod란 이름으로 생성한다.

sudo docker run -d --name jenkins_prod -p 8080:8080 -p 50000:50000 -v jenkins-home-prod:/var/jenkins_home jenkins/jenkins:lts

                                                                                                                                                                                                               10. http://<IP Address of Docker host>:8080을 이용해 젠킨스 대시보드에 접근한다. 로그인 페이지에서 이전에 사용한 사용자 정보로 로그인한다.

로그인이 가능하다. 즉, 젠킨스의 설정이 무사히 보존된 것이다.                                                                                                                                                                                                                                                                                                     

젠킨스 개발 및 스테이징 인스턴스 만들기


· 프로덕션 젠킨스 인스턴스에 새로운 내용을 테스트하기 위해 개발 및 스테이징 인스턴스가 필요할 수 있다. 도커를 이용하면 젠킨스 서버의 여러 인스턴스를 쉽고 안전하게 만들 수 있다.

 

빈 데이터 볼륨 생성

1. 스테이징을 위한 인스턴스를 생성한다.

sudo docker volume create --name jenkins-home-staging

 

2. 개발을 위한 인스턴스를 생성한다.

sudo docker volume create --name jenkins-home-development

 

 

3. 새롭게 생성된 데이터 볼륨의 목록을 확인한다.

sudo docker volume ls

 

데이터 볼륨 간 파일 복사

· 새롭게 생성된 데이터 볼륨에 jenkins-home-prod의 내용을 복사해보자.

 

1. jenkins-home-prod의 내용을 jenkins-home-staging에 복사한다.

sudo docker run --rm -it --user root \
-v jenkins-home-prod:/var/jenkins_home \
-v jenkins-home-staging:/var/jenkins_home_staging \
jenkins/jenkins:lts bash -c "cd /var/jenkins_home_staging && cp -a /var/jenkins_home/* ."

위 명령어는 다음과 같은 일을 수행한다.

ⓐ jenkins/jenkins:lts 도커 이미지를 이용해 임시 컨테이너를 만든다.

ⓑ 임시 컨테이너에서 수행되는 모든 명령은 root 사용자로 처리된다.

--user root 옵션을 확인하자.

ⓒ jenkins-home-prod 데이터 볼륨의 내용을 /var/jenkins_home 폴더로 마운트한다.

-v jenkins-home-prod:/var/jenkins_home 옵션을 확인하자.

ⓓ 내용이 없는 jenkins-home-staging 데이터 볼륨의 내용을 /var/jenkins_home_staging 폴더로 마운트한다.

-v jenkins-home-staging:/var/jenkins_home_staging 옵션을 확인하자.

ⓔ /var/jenkins_home의 내용을 /var/jenkins_home_staging으로 복사한다. 

bash -c "cd /var/jenkins_home_staging && cp -a /var/jenkins_home/* ." 옵션을 확인하자.

 

2. jenkins-home-prod의 내용을 jenkins-home-development로 복사한다.

sudo docker run --rm -it --user root \
-v jenkins-home-prod:/var/jenkins_home \
-v jenkins-home-development:/var/jenkins_home_development \
jenkins/jenkins:lts bash -c "cd /var/jenkins_home_development && cp -a /var/jenkins_home/* ."

 

이제 같은 내용을 갖는 jenkins-home-prod, jenkins-home-staging, jenkins-home-development 세 가지 데이터 볼륨을 갖게 됐다.

 

개발 및 스테이징 인스턴스 생성

· 개발과 스테이징을 위한 데이터 볼륨을 생성했으니, 컨테이너가 이를 이용하도록 설정하자.

 

1. jenkins-home-staging 데이터 볼륨을 이용해 jenkins_staging 인스턴스를 생성한다.

sudo docker run -d --name jenkins_staging \
-v jenkins-home-staging:/var/jenkins_home_staging -p 8081:8080 \
-p 50001:50000 jenkins/jenkins:lts

 

이제부터 http:<IP Address of Docker host>:8081을 이용해 젠킨스 스테이징 인스턴스에 접속할 수 있다.

 

- 8080 포트에서 실행되는 젠킨스 인스턴스를 도커 호스트의 8081 포트와 연결했다. 도커 호스트에서 다른 포트를 선택한 이유는 젠킨스 프로덕션 인스턴스인 jenkins_prod가 도커 호스트의 8080 포트에 연결돼 있기 때문이다. 같은 이유로 젠킨스의 50000 포트를 도커 호스트의 50001 포트와 연결했다.

 

3. jenkins-home-development 데이터 볼륨을 이용해 jenkins_development 인스턴스를 생성한다.

sudo docker run -d --name jenkins_development \
-v jenkins-home-development:/var/jenkins_home_development -p 8082:8080 \
-p 50002:50000 jenkins/jenkins:lts

 

이제부터 http:<IP Address of Docker host>:8082을 이용해 젠킨스 개발 인스턴스에 접속할 수 있다.

반응형

댓글