TIL/DOCKER

Docker Exited (0) 되는 문제 수정하기

아람2 2024. 12. 24. 16:11
반응형

Jenkins 를 이용하여 Docker 에 Build 하기에 이어서,

https://helloahram.tistory.com/186 

 

CI/CD via Jenkins + Docker #2

Jenkins 설정 Jenkins 를 설치하고 Git Repo 까지 연결했으니 (#1 참고) 이제 설정할 차례 -각오는 했지만 생각보다 설정할 내용들이 많았고 제법 어렵기도 했다 Jenkins 배포 전략 세우기방안1) 빌드 서

helloahram.tistory.com

 

Docker 에 Image 가 올라가는 것까지만 봤는데, 다시 확인해 보니 실행하자마자 종료되고 있었다 

Exited (0) X minutes ago

 

그래서 Pipeline 을 다시 손 봤다 

일단 Directory 생성하는 Stage 는 필요 없어 보여서 삭제하고

Docker_Path 도 Pipeline 내에서 제대로 사용되지 않아서 Git_Repo_Name 으로 다시 변경했다 

 

그리고 8090 Port 를 사용하고 싶었는데 NGINX 내부까지 수정할 시간이 없어서 

NGINX 내부는 80, 외부에는 8090 을 사용할 수 있도록

EC2 Instance 에 Inbound 8090 을 추가했다 

 

참고로 Test 용 Git Repo 에 Dockerfile 이랑 Index.html 도 등록했다 🐣 원래 걍 Python print("Hello") 만 올렸었음ㅎ 🐣

# Dockerfile
# 기본 이미지로 nginx 사용
FROM nginx:alpine

# 로컬에서 사용할 파일을 컨테이너의 /usr/share/nginx/html로 복사
COPY ./index.html /usr/share/nginx/html/index.html

# 포트 80 오픈
EXPOSE 80
/* index.html */ 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Jenkins Docker Test</title>
</head>
<body>
    <h1>Jenkins Docker Build Test</h1>
</body>
</html>

 

그리고 다시 완성한 Pipeline 🐣

환경 변수 (Environment) 만 수정하면 다른 Stage 안의 내용을 건드리지 않고 Build 가 가능하도록 수정했다 

pipeline {
    agent any
    
    environment {
        DOCKER_IMAGE_NAME = 'jenkins-test3-image'
        DOCKER_IMAGE_TAG = 'ahram'
        CONTAINER_NAME = 'jenkins-test3-container'
        DOCKER_PATH = 'Jenkins_Test3'
        GIT_REPO_NAME = 'Jenkins_Test3'
        GIT_REPO = 'https://github.com/helloahram/Jenkins_Test3.git'
        REMOTE_HOST = '10.0.128.64'  // EC2 IP 주소
        REMOTE_USER = 'ec2-user'  // EC2 사용자 이름
        SSH_KEY_PATH = '/home/ec2-user/JenkinsKey.pem'  // Jenkins 에서 사용하는 SSH 키 경로
        DOCKER_USERNAME = '[DOCKER_ID]' // 자격 증명 ID
        DOCKER_PASSWORD =  '[DOCKER_PW]'  // 자격 증명 PW
    }
    
    stages {
        stage('Clone Git Repository') {
            steps {
                script {
                    // Git 저장소에서 코드 클론 (main 브랜치로 명시적으로 체크아웃)
                    sh 'rm -rf ${GIT_REPO_NAME}'
                    sh 'git clone --branch main ${GIT_REPO}'
                }
            }
        }
        
        stage('Build Docker Image') {
            steps {
                script {
                    // Docker 이미지 빌드
                    // docker build -t [Image name]:[Tag] [Dockerfile Path]
                    sh 'docker build -t ${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG} ${DOCKER_PATH}/'
                }
            }
        }

        stage('Docker Login') {
            steps {
                script {
                    // Docker Hub 로그인
                    sh 'echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME --password-stdin'
                }
            }
        }

        stage('Push Docker Image') {
            steps {
                script {
                    // Docker 이미지를 Docker Hub 에 푸시
                    sh 'docker tag ${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG} haru2/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}'
                    // 도커 이미지를 Docker Hub 나 다른 레지스트리에 푸시
                    sh 'docker push haru2/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}'
                    
                }
            }
        }

        stage('Deploy to EC2') {
            steps {
                script {
                    // EC2에 Docker 이미지 배포 및 컨테이너 실행
                    sh '''
                        docker pull haru2/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}
                        docker stop ${CONTAINER_NAME} || true
                        docker rm ${CONTAINER_NAME} || true
                        docker run -d --name ${CONTAINER_NAME} -p 8090:80 ${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}
                    '''
                }
            }
        }
    }
}

 

 

Port 도 8090:80 으로, Command 도 docker-entrypoint 로 잘 들어가는 것을 확인했다

curl http://localhost:8090 도, 내가 Git Repo 에 올린 Index.html 이 응답으로 잘 오고 있다 

🐣 서버가 요청을 처리할 수 없을 때는 curl: (56) Recv failure: Connection reset by peer 응답이 출력된다 🐣

 

8090 Port 로 접근 가능하도록 Local Forwarding 해 준 다음에는, localhost:8090 도 잘 접속된다 🐣

 

팀원들에게 공유가 필요한 내용

Jenkins 로 Build 와 Deploy 는 구축해 놓았고이제 Test Stage 를 추가해야 합니다 

이번 주는 Jenkins 여기까지만 하고, MVP 진행하도록 하겠습니다 

반응형