Docker & Jenkins

yeoro·2021년 8월 26일
0

Docker 설치

Docker 의존성 패키지 설치
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

Docker 패키지 인증 키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Docker 저장소 추가
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

저장소 업데이트
sudo apt-get update

Docker 패키지 설치 확인
sudo apt-cache search docker-ce

Docker 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io

사용자를 Docker 그룹에 포함 (Docker 명령어를 sudo 없이 사용하기 위해)
sudo usermod -aG docker 사용자명
(사용자명을 ubuntu로 했는데 먹히지 않았다..)

Jenkins 설치

Docker Hub에서 Jenkins 이미지 받기
docker pull jenkins/jenkins:lts

Jenkins 이미지 확인
docker images

Jenkins 이미지 Docker 컨테이너에 적재
docker run --name jenkins-docker -d -p 8088:8088 -p 50000:50000 -v /home/jenkins:/var/jenkins_home -u root jenkins/jenkins:lts
여기서 -d 명령어는 백그라운드 실행, -p 명령어는 컨테이너와 호스트 PC 간 연결을 위해 내부 포트와 외부 포트를 묶은 것입니다.

-v 명령어는 이미지의 /var/jenkins_home 디렉터리를 호스트 PC 내에 마운트 하는 명령어입니다.

이것을 하는 이유는, Jenkins 설치 시 ssh 키값 생성, 저장소 참조 등을 용이하게 하기 위함입니다.

실제 입력한 명령어
docker run --name jenkins-docker -p 8088:8088 -v /home/jenkins:/var/jenkins_home -u root jenkins/jenkins:lts

Jenkins 폴더 생성 확인

Jenkins 포트 할당 확인

Jenkins를 8088 포트로 설정하니 접속이 안됐다. 찾아보니 Jenkins Dockerfile에 설정된 기본 포트가 8080:8080여서 8088이 아닌 8080으로 바꿔주었다.
https://ixtears23.github.io/docker-compose-jenkins-issue/

Jenkins 로그 파일을 통해 패스워드 확인
sudo docker logs jenkins-docker

기본 값으로 설치 진행

Jenkins에서 서버에 접근하기 위해 플러그인 설치

서버 컨테이너 생성

Dockerfile은 어떠한 베이스 이미지를 기반으로 사용자에게 필요한 것들을 사전에 세팅해 새로운 이미지를 생성할 때 사용하는 명세서이다.

Dockerfile을 관리하기 위한 디렉터리와 파일 생성

cd
mkdir service-server
cd service-server
vim Dockerfile
FROM ubuntu:20.04 

# default user 
ENV USER serve 

# packages install
RUN apt-get update && apt-get upgrade -y 
RUN apt-get install -y sudo vim net-tools ssh openssh-server openjdk-8-jdk-headless 

# Access Option 
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config 
RUN sed -i 's/UsePAM yes/#UserPAM yes/g' /etc/ssh/sshd_config 

#user add & set 
RUN groupadd -g 999 $USER 
RUN useradd -m -r -u 999 -g $USER $USER 

RUN sed -ri '20a'$USER' ALL=(ALL) NOPASSWD:ALL' /etc/sudoers 

#set root & user password 
RUN echo 'root:root' | chpasswd 
RUN echo $USER':serve123' | chpasswd 

# java 환경변수 
ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 

ENTRYPOINT sudo service ssh restart && bash 

USER $USER

베이스 OS는 Ubuntu 20.04를 사용했고, jdk와 vim을 설치했습니다.

그리고 이후 Jenkins에서 사용할 사용자 계정과 ssh 접속 키를 관리하기 위한 .ssh 디렉터리도 같이 생성해주었고, 프로젝트 배포를 위해 JAVA 환경 변수를 미리 지정해두었습니다.

Dockerfile로 이미지 빌드
docker build -t service-server .

service-server 이미지 컨테이너에 적재
docker run --name spring-server -itd -p 9000:9000 -p 9022:22 service-server:latest
-p 옵션 중 9000번은 Spring Boot에게 할당할 포트고, 9022번 포트는 Jenkins에서 ssh로 접근하기 위한 포트입니다.


Jenkins, Github 연동

SSH?

호스트 PC에서 ssh-key 발급 대행
sudo mkdir /home/jenkins/.ssh
sudo chmod 700 /home/jenkins/.ssh
sudo ssh-keygen -t rsa

private key 저장 경로
Enter file in which to save the key (/root/.ssh/id_rsa): /home/jenkins/.ssh/id_rsa

ssh key 값(public key) 확인
sudo -s
cat /home/jenkins/.ssh/id_rsa.pub

Github에 Jenkins SSH Public Key 등록




spring-server에 Jenkins Key 등록

Jenkins에서 빌드한 프로젝트를 spring-server에 배포하기 위해 Jenkins의 Key를 등록한다.
docker exec -it spring-server /bin/bash
vim ~/.ssh/authorized_keys

.ssh 디렉토리가 만들어지지 않았길래 새로 생성함


Jenkins에 service-server SSH 접근 설정

Jenkins 관리 -> 시스템 설정

SSH Servers에 추가 버튼을 눌러 Name, Hostname, Username, Remote Directory 그리고 Passpharse / Password, Port를 입력합니다. name은 Jenkins에서 식별하기 위한 서버 이름이므로 아무 이름이나 지정해도 무방합니다.

대신 Hostname과 Username은 정확히 입력해야 합니다. Hostname은 Service Server의 IP주소를, Username은 서버의 유저 계정을 입력합니다.

예제에서는 Dockerfile에 의해 미리 사용자 계정을 생성해 두었으므로 serve를 이 Username에 넣어주고 Passpharse / Password에 serve123을 넣어줍니다.

포트 번호는 컨테이너의 ssh 포트 22번을 호스트의 9022로 연결시켰으므로 9022를 넣어줍니다.

입력해야 할 필드를 정리하자면 아래와 같습니다.

  • Name: Jenkins에서 식별할 서버 이름(아무 이름이나 넣어도 됩니다.)
  • Hostname: 호스트 PC의 ip주소를 넣습니다.
  • Username: spring-server의 사용자 계정 serve를 넣습니다.
  • Remote Directory: spring-server의 사용자 루트인 /home/serve를 넣어줍니다.
  • Passphrase / Password: spring-server의 사용자 패스워드 serve123을 넣습니다.
  • Port: 호스트로 개방시킨 9022번 포트를 넣습니다.

Jenkins에 프로젝트 등록

https://dev-overload.tistory.com/40

0개의 댓글