ホームページ  >  記事  >  バックエンド開発  >  Gin フレームワークを使用してコンテナ化されたデプロイメントおよび管理機能を実装する

Gin フレームワークを使用してコンテナ化されたデプロイメントおよび管理機能を実装する

WBOY
WBOYオリジナル
2023-06-22 18:58:43862ブラウズ

今日のクラウド コンピューティング時代では、コンテナ化はアプリケーションの展開および管理方法として非常に一般的になっています。 Gin フレームワークは GO 言語の軽量 Web フレームワークであり、高パフォーマンス、低メモリ消費、メンテナンスの容易さなどの特徴を備えているため、GO 言語を使用した Web 開発で推奨されるフレームワークの 1 つとなっています。この記事では、Gin フレームワークを使用してコンテナ化されたデプロイメントおよび管理機能を実装する方法を紹介します。一緒に学びましょう。

1. Docker の概要

Docker は現在最も人気のあるコンテナ テクノロジであり、アプリケーションとその依存関係をコンテナにパッケージ化して、どこでも簡単に実行できるようにします。 Docker はオープンソースであり、業界の事実上の標準コンテナ ソリューションとなっています。

2. Jin フレームワークの Docker パッケージ化の例

以下は、Docker を使用して Jin フレームワークをパッケージ化する簡単な例です:

  1. プロジェクト ディレクトリを作成して入力します。 :

mkdir docker-gin && cd docker-gin

  1. Dockerfile を作成します:

#FROM golang:1.13

Settings 作業ディレクトリ

WORKDIR /go/src/app

Gin フレームワークをインストール

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

すべてのファイルを作業ディレクトリに追加します

ADD ./go/src/app

コマンドの実行

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. コンテナ化のデプロイと管理

上記の例に基づいて、コンテナ化のデプロイと管理機能を実装するために次の 2 つの API を追加します:

  1. POST /deploy : コンテナ デプロイ機能の実装
#zip ファイルをアップロードし、解凍して新しいイメージを構築し、最後に Kubernetes スケジューリングを通じて新しいコンテナをデプロイします。

以下は簡略化された実装です:

func handleDeploy(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()

// アップロードされたファイルをローカルの

ファイル名に保存します := "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 )
エラーの場合 != nil {

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

}

_、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
  }
}

}# については zipReader.Close()

を延期します

##// 新しいイメージをビルドし、Kubernetes デプロイメントを呼び出します。

cmd := exec.Command("bash", "-c", "docker build -t docker-gin-" strconv.FormatInt(time. Now() .Unix(), 10) " . && kubectl apply -fdeploy.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 handleStop(c *gin.Context) {

// 現在のコンテナを取得しますID

ホスト名 , エラー := os.Hostname()

if エラー != 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)ポッドの削除 " 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 )})

}


上記 2 つの API の実装は、コンテナ管理用の Kubernetes に基づいています。Kubernetes の使用については、ここでは詳しく紹介しません。

4. 概要

この記事では、Docker を使用して Jin フレームワークをカプセル化し、コンテナ化されたデプロイメントおよび管理機能を実装する方法を紹介します。実際には、実際のニーズに基づいてさらに詳細な実装を行うことができますが、ここでは簡単な例を示します。つまり、アプリケーションのデプロイと管理にコンテナ化テクノロジーを使用すると、開発効率が向上し、環境構成の問題が回避され、運用と保守の困難が軽減されるため、強く推奨されるアプローチです。

以上がGin フレームワークを使用してコンテナ化されたデプロイメントおよび管理機能を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。