기타/인프라 구축과정

[Infra] 6. 컨테이너 구동 - Voda Project

배발자 2023. 4. 4.
반응형

 

 

JAVA + VUE

pipeline{
    environment {
        dockerImage = ''
    }
    agent any 
    stages{

        stage('Building front image') {
            steps {
                script {
                  dockerImage = docker.build("bae3007/frontvoda-zero-downtime", "/var/jenkins_home/workspace/deploy_test/front_vue")
                  withCredentials([usernamePassword(credentialsId: 'bae3007', usernameVariable: 'DOCKER_HUB_USERNAME', passwordVariable: 'DOCKER_HUB_PASSWORD')]) {
                     sh 'docker login -u $DOCKER_HUB_USERNAME -p $DOCKER_HUB_PASSWORD'
                     sh 'docker push bae3007/frontvoda-zero-downtime'
                  }
                }
            }
        }
        
        
        stage('Run docker front image') {
          steps {
              dir('/var/jenkins_home/workspace/deploy_test/front_vue'){
                  sh 'chmod +x deploy.sh'
                  sh './deploy.sh'
              }
            }
        }
    
        stage('Building back image'){
            steps{
                script {
                  dockerImage = docker.build("bae3007/back-java-zero-downtime", "/var/jenkins_home/workspace/deploy_test/back_java")
                  withCredentials([usernamePassword(credentialsId: 'bae3007', usernameVariable: 'DOCKER_HUB_USERNAME', passwordVariable: 'DOCKER_HUB_PASSWORD')]) {
                     sh 'docker login -u $DOCKER_HUB_USERNAME -p $DOCKER_HUB_PASSWORD'
                     sh 'docker push bae3007/back-java-zero-downtime'
                  }
                }
            }
        }
       stage('Run docker back image') {
          steps {
              dir('/var/jenkins_home/workspace/deploy_test/back_java'){
                  sh 'chmod +x deploy.sh'
                  sh './deploy.sh'
               }
            }
        }
        stage('not using images&containers delete '){
            steps{
                sh "docker image prune -a -f"
            }
        }
    }
}

 

 

위는 Jenkins 파이프라인 코드이며, Docker 이미지 빌드, 푸시 및 실행에 관한 작업을 수행한다.

 

  • pipeline : 파이프라인 전체를 정의.
  • environment : Docker 이미지 변수를 초기화.
  • agent : 실행 환경을 정의하며 **any**는 어떤 에이전트 노드에서도 실행 가능함을 의미.
  • stages : 여러 단계로 파이프라인을 분리.
  • stage('Building front image') : 첫 번째 단계에서 프론트엔드 Docker 이미지를 빌드.
  • steps : 실제로 수행될 작업을 정의.
  • script : Groovy 스크립트를 실행.
  • docker.build : Docker 이미지를 빌드.
  • withCredentials : 인증 정보를 가져옴.
  • sh : 쉘 명령을 실행.
  • docker login : Docker 레지스트리에 로그인.
  • docker push : Docker 이미지를 푸시.
  • stage('Run docker front image') : 두 번째 단계에서 프론트엔드 Docker 이미지를 실행.
  • dir : 작업 디렉토리를 변경.
  • chmod : 파일 권한을 변경.
  • deploy.sh : 실행 스크립트를 실행.
  • stage('Building back image') : 세 번째 단계에서 백엔드 Docker 이미지를 빌드.
  • stage('Run docker back image') : 네 번째 단계에서 백엔드 Docker 이미지를 실행.
  • stage('not using images&containers delete ') : 다섯 번째 단계에서 사용하지 않는 Docker 이미지 및 컨테이너를 삭제.
  • sh : 쉘 명령을 실행.
  • docker image prune -a -f : 사용하지 않는 모든 Docker 이미지를 강제로 삭제.

 

PYTHON

pipeline{
    environment {
        dockerImage = ''
    }
    agent any 
    stages{

        stage('Building python image') {
            steps {
                script {
                  dockerImage = docker.build("bae3007/fastapi", "/var/jenkins_home/workspace/deploy_python/")
                  withCredentials([usernamePassword(credentialsId: 'bae3007', usernameVariable: 'DOCKER_HUB_USERNAME', passwordVariable: 'DOCKER_HUB_PASSWORD')]) {
                     sh 'docker login -u $DOCKER_HUB_USERNAME -p $DOCKER_HUB_PASSWORD'
                     sh 'docker push bae3007/fastapi'
                  }
                }
            }
        }
        
        
        stage('Run docker python image') {
          steps {
              dir('/var/jenkins_home/workspace/deploy_python/'){
                  sh 'chmod +x deploy.sh'
                  sh './deploy.sh'
              }
            }
        }
        
        stage('not using images&containers delete '){
			steps{
			    sh "docker image prune -a -f"
			}
		}
    }
}

 

위의 파이프라인 코드는 Jenkins를 사용하여 Python Docker 이미지를 빌드하고 실행하며, 사용하지 않는 Docker 이미지 및 컨테이너를 삭제한다. JAVA+VUE 파이프라인의 실행과정과 동일하다. 

 


 

추가적으로 프론트 컨테이너를 구동시킬 때 Nginx 이미지를 사용한다. 

 

| Dockerfile

 

FROM nginx:latest

COPY dist/ /usr/share/nginx/html/
COPY voda.conf /etc/nginx/conf.d/voda.conf
RUN rm /etc/nginx/conf.d/default.conf

EXPOSE 80
ENTRYPOINT ["nginx", "-g", "daemon off;"]

 

dist 빌드된 폴더를 새로 생성될 front 컨테이너에 저장한다. 

80번 포트를 열고, ENTRYPOINT로 nginx 명령어를 실행하며, 설정한 옵션으로 nginx를 실행한다.

이 때, "-g daemon off;" 옵션은 nginx가 백그라운드에서 실행되지 않도록 한다. 

 

해당 경로의 voda.conf 파일을 front 컨테이너의 /etc/nginx/conf.d/voda.conf로 저장한다. 

 

| voda.conf

server {
  listen 80;

  location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
    try_files $uri $uri/ /index.html;
  }
}

 

이 설정은 80번 포트에서 들어오는 모든 요청에 대해 처리한다. location / {} 블록 안에 있는 설정은 해당 위치의 요청에 대해 처리.


root /usr/share/nginx/html; 설정은 해당 위치에 있는 파일들의 루트 디렉토리를 /usr/share/nginx/html로 지정하고 index index.html index.htm; 설정은 해당 위치에 index.html 또는 index.htm 파일이 없는 경우, 자동으로 이 두 파일을 찾아서 보여준다. 

try_files $uri $uri/ /index.html; 설정은 요청한 파일이나 디렉토리가 없을 경우, /index.html 파일을 보여준다.

이 설정은 SPA (Single Page Application)와 같이 하나의 HTML 파일로 모든 페이지를 처리하는 웹 애플리케이션에 유용하다.

 

반응형

댓글