STUDY/Web

배포 자동화 (1) Docker 설치 및 Jenkins 설정

sinawi95 2021. 9. 27. 01:59
728x90

배포 자동화를 위한 단계는 다음과 같고 이 순서대로 글을 쓸 것이다.

(1) Docker 설치 및 Jenkins 설정

(2) 백엔드, 프론트 엔드 도커 이미지 빌드

(3) 원격 서버에서 도커 이미지 실행: Jenkins 파이프라인 작성

(4) HTTPS 적용 및 Nginx 설정 : letsencrypt와 certbot을 사용한 SSL 인증서 설치, 리버스 프록시 적용


프로젝트에서 사용하는 환경은 AWS(ubuntu 20.04 LTS)이다.

1. Docker 설치

https://docs.docker.com/engine/install/ubuntu/

Set up the repository

$ sudo apt-get update

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
    
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

$ echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

Install Docker Engine

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

$ sudo docker run hello-world

여기까지 잘 따라왔으면 docker 설치는 끝이다.

$ sudo systemctl enable docker.service $ sudo systemctl enable containerd.service

서버를 재부팅 할 때 도커를 자동으로 실행할수 있도록 다음과 같이 설정한다. 비활성화 하려면 enable → disable로 변경하면 된다.

 

Install Docker Compose

시스템은 Docker Compose를 사용하지 않았지만 이후에 사용할수 있으므로 설치를 진행한다. 

docker desktop 엔 포함이 되어있지만 linux system은 직접 설치해야한다. docker compose엔 docker engine이 필수이므로 위 단계를 모두 따라와야 설치할 수 있다.

Install Compose on Linux systems

1. Run this command to download the current stable release of Docker Compose:

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2. Apply executable permissions to the binary:

$ sudo chmod +x /usr/local/bin/docker-compose

3. Test the installation

$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c

버전을 확인할 수 있으면 설치가 완료된 것이다.

2. Jenkins 설치

$ mkdir jenkins_home 
$ sudo chown -R 1000:1000 $PWD/jenkins_home/

jenkins에 사용할 디렉토리를 생성하고 권한을 설정한다. Docker 컨테이너에서 사용하려면 권한 설정을 해줘야한다.

더보기

 

docker ps 를 사용해서 status를 확인했을 때 restarting(1) 으로 되어있었고, docker log로 확인해보니 다음과 같은 에러가 떠있었다.

touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied

Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?

호스트에서는 sudo 를 사용해서 사용하면 되었지만 컨테이너 내부에선 sudo 를 사용하지 못하므로 호스트에서 접근할수 있게 권한을 설정해야했다.

sudo chown -R 1000:1000 $PWD/jenkins_home/

그리고 혹시 모를 오류를 위해 컨테이너 삭제후 다시 만들어서 실행하였다.

sudo docker stop jenkins && sudo docker rm jenkins

 

$ sudo chmod +x /var/run/docker.sock
$ sudo docker pull jenkins/jenkins
$ sudo docker run -d -u root --restart always --name jenkins \
-p 8080:8080 -p 50000:50000 \
-v $PWD/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
jenkins/jenkins

Jenkins image 를 가져와서 컨테이너를 실행한다. Jenkins 에서 도커 이미지를 빌드하기 위해 호스트와 컨테이너의 볼륨을 묶어주었다. 그리고 도커 또한 컨테이너 안에서 실행하려면 권한이 필요하므로 chmod를 사용해서 접근할수 있게 만들었다.

사용된 docker option은 다음과 같다.

  • -d: detach mode, 도커 컨테이너를 백그라운드로 실행
  • --restart always: 컨테이너가 종료되면 재시작
  • --name jenkins: 컨테이너 이름을 jenkins로 설정
  • -p 8080:8080: 도커 host의 포트와 도커 컨테이너 내부 포트를 매핑. 호스트의 8080 포트로 접속하면 jenkins 컨테이너로 포워딩
  • -v $PWD/jenkins_home:/var/jenkins_home: 호스트와 도커 컨테이너 내부의 디렉토리 매핑. -v 옵션을 사용하지 않으면 내부에서 사용한 정보가 유지되지 않으므로 필수로 설정해야한다.
  • jenkins/jenkins : docker run에 사용할 이미지

 

3. Jenkins 접속 및 초기 설정

컨테이너가 정삭적으로 실행되고 `<public ip>:8080` 으로 접속하면 jenkins 초기 화면이 뜬다.

$ sudo ufw allow 8080 # aws 방화벽 설정
  • naver cloud platform는 ACG 규칙에 TCP 0.0.0.0/0, 8080 포트를 추가해야 들어갈수 있다.

접속하면 비밀번호가 필요한데 다음 명령어를 사용하면 얻을수 있다.

$ sudo cat ./jenkins_home/secrets/initialAdminPassword

 

비밀번호를 작성하고 들어가면 플러그인을 설치할수 있고 admin user를 설정한다. install suggested plugin 으로 설치 진행했다. 설치 시간은 어느정도 걸린다.

첫 화면이 나오면 자동 배포를 위한 플러그인도 설치한다. Dashboard - Manage Jenkins(젠킨스 관리) - Plugin Manager(플러그인 관리)에 들어가서 Blue Ocean, Gitlab, Nodejs, Docker, SSH 를 설치한다.

더보기

Blue Ocean 

  • Dashboard for Blue Ocean
  • Display URL for Blue Ocean
  • Blue Ocean Pipeline Editor
  • autofavorite for Blue Ocean
  • Blue Ocean
  • i18n for Blue Ocean
  • Events API for Blue Ocean
  • Personalization for Blue Ocean
  • Bitbucket pipeline for Blue Ocean

Gitlab

  • Gitlab
  • Gitlab Authentication
  • gitlab branch source
  • gitlab merge request builder
  • gitlab api
  • gitlab hook 은 다운받지 않아도 됨

그 외

  • config file provider
  • SSH
  • Publish Over SSH
  • SSH Pipeline Steps
  • Docker
  • Docker Pipeline
  • nodejs

(+) NodeJS 설치

프론트나 백엔드나 둘다 npm을 사용해야하므로 Node js를 설치한다.

Global Tool Configuration - Add NodeJS 클릭 - name: nodejs 설정 후 저장

 

4. Jenkins, Gitlab 연동

1. Gitlab

Gitlab에서 ci/cd 를 적용할 프로젝트에 들어가서 access token을 설정한다. Node.js + express를 사용한 간단한 프로젝트를 사용했다.

gitlab - Settings - Access Tokens

Name 설정, expires at 설정, Scopes - api 체크 뒤 create project access token

액세스 토큰이 나오면 잘 저장해둔다.

2. Jenkins

dashboard - manager jenkins - configure system - gitlab 설정

Connection name, gitlab host URL 작성 ex) https://gitlab.com/

credentials - add - jenkins

  • kind: gitlab api token
  • scope: global
  • api token: gitlab 액세스 토큰 기입
  • ID: gitlab id
  • 생성후 credentials - gitlab api token 설정

Test Connection해서 success 나오면 저장(save)한다.


CI/CD를 구축하면 마지막주에 신경을 조금 덜써도 되지 않을까 생각이 들어서 진행했다. 근데 이걸로 시간을 많이 잡아먹을줄은 몰랐...

어느정도 설정을 했으니 다음 포스팅에선 도커를 사용해서 수동 배포를 해보자