일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- error
- JS
- docker
- Linux
- Windows
- 영어
- unity
- ChatGPT
- Python
- AWS
- 구글
- logstash
- JavaScript
- MySQL
- 엘라스틱서치
- 설정
- API
- Kibana
- nodejs
- Git
- sample
- ssh
- Ai
- s3
- MSSQL
- build
- elasticsearch
- 유니티
- mariadb
- Today
- Total
가끔 보자, 하늘.
Windows에서 jenkins + docker를 이용한 개발용 인프라 자동 구축 본문
CI/CD의 필요성은 이미 너무 잘 알려져 있으므로 잡설은 뒤로하고 바로 구축 절차를 살펴 보겠습니다. 별도 서버가 아닌 별도 PC 혹은 자신의 PC에 필요한 제품과 자신의 서비스를 docker로 실행할 수 있도록 다음과 같은 순서로 알아보겠습니다.
- 시스템 설정
- Docker Desktop 설치
- Docker 이미지/컨테이너 살펴보기
- Jenkins로 서비스 자동 배포하기
[ 시스템 설정 ]
1. BIOS에서 Virtualization Technology 항목은 기본으로 "Disabled"로 설정되어 있으며, 이를 "Enabled"로 변경합니다.
2. Windwos 기능 켜기/끄기에서 Hyper-V / 가상 머신 플랫폼을 활성화합니다.
[Git/Jenkins 설치 참고 링크, Jenkins 한글 깨짐 현상 참고 링크]
[ Docker Desktop 설치 ]
1. 다운로드 링크
2. 리소스 사용량 설정
C:\Users\사용자명 폴더에 .wslconfig 파일을 생성/수정하여 설정할 수 있습니다.
[ Docker 이미지/컨테이너 살펴보기 ]
1. 개요
- 도커 이미지 : 도커 컨테이너를 구성하는 파일 시스템과 실행할 애플리케이션 설정을 하나로 합쳐둔 것으로 컨테이너 생성하기 위한 템플릿이라고 할 수 있다.
- 도커 컨테이너 : 도커 이미지를 기반으로 생성되며, 파일 시스템과 애플리케이션이 구체화 된 것을 말합니다
2. Redis 이미지 다운받아 컨테이너로 실행하기 예제
- 이미지 다운로드 : docker pull redis:latest
- 컨테이너 실행 : docker run -p 6379:6379 redis:latest
- docker desktop 에서는 GUI로 간단히 실행 가능
지정된 Remote Repositories가 없다면 cmd 창에서 docker pull redis:latest를 실행하면 images에서 바로 보입니다. (2)의 run 버튼을 클릭하면 실행 옵션창이 뜨며, container name과 Port forwarding을 위해 Ports -> Local Host아래에 연결할 포트번호를 입력합니다. 이를 입력하지 않으면 docker container 내에서만 포트가 오픈되고 로컬 PC에서 포트가 열려 있지 않아 실제로 연결이 되지 않으니 꼭 입력해야 합니다. 정상적으로 실행하면 Containers/App 화면에서 실행된 결과를 확인할 수 있습니다.
[ Jenkins로 서비스 자동 배포하기 ]
예제에서는 python fastAPI로 간단한 api 서버를 만들어 보겠습니다.
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def health_check():
return 200
예제는 다음과 같이 실행할 수 있으며 (uvicorn main:app --port=8080), 실행 후 웹 브라우져에서 http://localhost:8080를 입력하면 200값이 돌아오는 것을 확인할 수 있습니다.
패키지 설치를 위해 requirements.txt 파일을 추가하여 설치할 패키지를 기술합니다.
fastapi>=0.73.0
docker 이미지 제작을 위해 "Dockerfile"이라는 파일을 추가하여 다음을 입력합니다.
# from
FROM ubuntu:latest
# apt init
ENV LANG=C.UTF-8
ENV TZ=Asia/Seoul
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y --no-install-recommends g++ git curl && \
apt-get install -y sudo
# python stuff
RUN apt-get install -y python3-pip python3-dev
RUN cd /usr/local/bin && \
ln -s /usr/bin/python3 python && \
ln -s /usr/bin/pip3 pip && \
pip3 install --upgrade pip
# apt cleanse
RUN apt-get clean && \
rm -rf /var/lib/apt/lists/*
# timezone
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY . ./
# workspace
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . /usr/src/app
# install python packages
RUN pip install -r requirements.txt
# for run server
EXPOSE 5000
CMD uvicorn main:app --host=0.0.0.0 --port=8080
그리고 아래와 같이 빌드합니다.
docker build -t "my-service" ./
잘 빌드되었다면 docker desktop에서 아래와 같이 이미지로 등록된 것을 확인할 수 있습니다.
이 서비스를 Jenkins에서 하루 한 번 자동 배포 되도록 해보겠습니다.
우선 프로젝트에 Jenkinsfile을 만들고 아래 내용을 입력합니다.
pipeline{
agent any
environment {
CONTAINER_NAME="my-server"
NAME = "my-server"
VERSION = "${env.BUILD_ID}-${env.GIT_COMMIT}"
GIT_URL="http://Jenkins-server-ip/git/my-server.git"
}
stages {
stage('Pull') {
steps {
git url:"${GIT_URL}", branch:"master", poll:true, changelog:true,credentialsId: 'your-git-credentialsId'
}
}
stage('Clean'){
steps{
script {
try{
sh "docker stop ${CONTAINER_NAME}"
sleep 1
sh "docker rm ${CONTAINER_NAME}"
}catch(e){
sh 'exit 0'
}
}
}
}
stage('Build') {
steps {
sh "docker build -t ${NAME} ."
}
}
stage('Deploy'){
steps {
sh "docker tag ${NAME}:latest ${NAME}:${VERSION}"
sh "docker run -d --name=${CONTAINER_NAME} -p 8080:8080 ${NAME}:latest"
}
}
}
}
Jenkinsfile 은 이 링크 를 참고하세요. script를 사용하면 조건이나 예외 처리가 가능하며 stage로 단계를 구별해두면 아래와 같이 진행결과를 확인하기가 편리합니다.
Jenkins에서 CD 설정을 위해 몇 가지 추가 설정이 필요합니다. 아래는 windows를 기준으로 설명합니다.
(1) PATH에 git path 등록하기
(1) PATH에 아래 경로를 등록합니다.
- C:\Program Files\Git\cmd
- C:\Program Files\Git\usr\bin
(2) shell 등록
이제 jenkins에 하루 한 번 자동 배포를 위한 작업을 등록해 보겠습니다. Dashboard에서 새로운 Item 메뉴를 선택합니다.
그리고 item name을 "my-service-pipeline"으로 입력 후 Pipeline을 선택합니다.
매일 오전 8시 자동 빌드를 한다고 가정하겠습니다. 항목 중 Build Triggers -> Build Periodically 를 선택 후 "00 08 * * *"을 입력합니다.
이후 Pipeline 항목에서 "Pipeline script from SCM"을 선택하고 SCM에서 "Git"을 선택, 자신의 Repository URL을 입력하고 해당 git의 Credentials을 선택합니다. Credentials이 없다면 Add를 추가 후 선택하면 됩니다.
하단의 Script Path는 기본으로 Jenkinsfile이 입력되어 있을 겁니다. 만약 도커 이미지 생성까지만 필요하다면 이 항목을 Dockerfile로 수정하시면 됩니다.
이제 매일 오전 8시면 위에서 우리가 기록해둔 Jenkinsfile을 실행하게 될 것입니다.
잘 안되는 내용들은 댓글로 남기시거나 ljh6341@gmail.com로 문의 주셔도 됩니다.
모두 좋은 하루 되세요. :)
'개발 이야기 > 인프라 구축 및 운영' 카테고리의 다른 글
AWS로 서비스 구축하기 #01 - Jenkins + AWS ECS 로 CD 구축하기 (0) | 2022.03.24 |
---|---|
AWS AssumeRole 설정 안될 때.. (0) | 2022.03.17 |
EC2 인스턴스 관리를 위해 사전 작업들 (0) | 2021.09.08 |
Elasticsearch snapshot - AWS S3 에러 (0) | 2021.06.17 |
Metricbeat 설치 및 Kibana 연동 (0) | 2021.05.27 |