>백엔드 개발 >Golang >Gin 프레임워크를 사용하여 컨테이너화된 배포 및 관리 기능 구현

Gin 프레임워크를 사용하여 컨테이너화된 배포 및 관리 기능 구현

WBOY
WBOY원래의
2023-06-22 18:58:43912검색

오늘날의 클라우드 컴퓨팅 시대에 컨테이너화는 애플리케이션 배포 및 관리에 매우 인기 있는 방법이 되었습니다. Gin 프레임워크는 GO 언어의 경량 웹 프레임워크로, 고성능, 낮은 메모리 소비 및 쉬운 유지 관리라는 특징을 가지고 있으므로 GO 언어를 사용하는 웹 개발에 선호되는 프레임워크 중 하나가 되었습니다. 이 글에서는 Gin 프레임워크를 사용하여 컨테이너화된 배포 및 관리 기능을 구현하는 방법을 함께 살펴보겠습니다.

1. Docker 소개

Docker는 현재 가장 널리 사용되는 컨테이너 기술로, 애플리케이션과 해당 종속성을 컨테이너로 패키징하여 어디에서나 쉽게 실행할 수 있습니다. Docker는 오픈 소스이며 업계에서 사실상의 표준 컨테이너 솔루션이 되었습니다.

2. Gin 프레임워크의 Docker 패키징 예

다음은 Docker를 사용하여 Gin 프레임워크를 패키징하는 간단한 예입니다.

  1. 프로젝트 엔지니어링 디렉터리 생성 및 입력:

mkdir docker-gin && cd docker-gin

  1. Dockerfile 만들기:

FROM golang:1.13

작업 디렉터리 설정

WORKDIR /go/src/app

Gin 프레임워크 설치

RUN go get github.com/gin-gonic/gin

Add 모든 파일을 작업 디렉터리에

ADD ./go/src/app

Run command

CMD ["go", "run", "main.go"]

  1. main.go 파일 만들기:

package main

import "github.com/gin-gonic/gin"

func main() {
r := gin.Default()
r.GET("/", func (c *gin.Context) {

c.JSON(200, gin.H{
  "message": "Hello World",
})

})
r.Run(":8080")
}

  1. 이미지를 빌드하고 컨테이너를 실행합니다.

docker build -t docker-gin .
docker run -p 8080:8080 docker-gin

지금 할 수 있습니다. http://localhost:8080을 통해 애플리케이션에 액세스하세요.

그러나 그 후에는 배포 및 관리 목적을 달성하기 위한 몇 가지 논리를 추가로 작성합니다.

3. 컨테이너화 배포 및 관리

위의 예를 바탕으로 컨테이너화 배포 및 관리 기능을 구현하기 위해 다음 두 가지 API를 추가합니다.

  1. POST /deploy: zip 파일을 업로드하여 컨테이너화 배포 기능을 구현합니다. 새 이미지의 압축을 풀고 빌드한 다음 마지막으로 Kubernetes 예약을 통해 이 새 컨테이너를 배포합니다.
다음은 단순화된 구현입니다.

func handlerDeploy(c *gin.Context) {

file, header, err := c.Request.FormFile("file")

if err != nil {

c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return

}
defer file.Close()

// 업로드된 파일을 로컬
filename := "deploy/" + header.Filename

out, err := os.Create(filename)

if err != nil {

c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return

}
defer out.Close()

_, err = io.Copy(out, file)

if err != nil {

c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return

}

// 업로드된 파일의 압축을 푼다

zipReader, err := zip. OpenReader(filename )

if err != nil {

c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return

}
defer zipReader.Close()

for _, zipFile := range zipReader.File {

srcObj, err := zipFile.Open()
if err != nil {
  c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
  return
}
defer srcObj.Close()

dstPath := "deploy/" + zipFile.Name
if !strings.HasPrefix(dstPath, "deploy/") {
  c.JSON(http.StatusBadRequest, gin.H{"error": "invalid file"})
  return
}
if zipFile.FileInfo().IsDir() {
  os.MkdirAll(dstPath, zipFile.Mode())
} else {
  dstObj, err := os.Create(dstPath)
  if err != nil {
    c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
    return
  }
  defer dstObj.Close()

  _, err = io.Copy(dstObj, srcObj)
  if err != nil {
    c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
    return
  }
}

}

// 새 이미지 빌드 및 Kubernetes 배포 호출

cmd: = exec.Command("bash", "-c", "docker build -t docker-gin-"+strconv.FormatInt(time.Now().Unix(), 10)+" . && kubectl 적용 -f 배포 .yml")

cmd.Dir = "./deploy"

out, err = cmd.CombinedOutput()
if err != nil {

c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return

}
c.JSON(http.StatusOK, gin.H {"message ": string(out)})

}



DELETE /stop: 현재 컨테이너를 닫습니다

  1. 다음은 단순화된 구현입니다.
func handlerStop(c *gin.Context) {

// Get 현재 컨테이너 ID

호스트 이름, err := os.Hostname()

if err != nil {

c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return

}
cmd := exec.Command("bash", "-c", "kubectl get pod -o jsonpath ='{.items [0].metadata.name}'")

cmdOutput, err := cmd.Output()

if err != nil {

c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return

}
podName := strings.TrimSpace(string(cmdOutput) )

// 현재 컨테이너 닫기
cmd = exec.Command("bash", "-c", "kubectl delete pod "+podName)

cmdOutput, err = cmd.CombinedOutput()

if err != nil {

c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return

}
c .JSON(http.StatusOK, gin.H{"message": string(cmdOutput)})

}


위 두 API의 구현은 컨테이너 관리를 위한 Kubernetes를 기반으로 합니다. 여기서는 자세히 소개하지 않겠습니다.

4. 요약

이 글에서는 Docker를 사용하여 Gin 프레임워크를 캡슐화하고 컨테이너화된 배포 및 관리 기능을 구현하는 방법을 소개합니다. 실제로는 실제 요구 사항에 따라 보다 자세한 구현을 구현할 수 있습니다. 다음은 간단한 예입니다. 즉, 애플리케이션 배포 및 관리에 컨테이너화 기술을 사용하면 개발 효율성을 높이고 환경 구성 문제를 방지하며 운영 및 유지 관리의 어려움을 줄일 수 있습니다.

위 내용은 Gin 프레임워크를 사용하여 컨테이너화된 배포 및 관리 기능 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.