Docker Go SDK入門(1)

DockerやGoに触れたことがないが興味がある場合は、この記事が役に立ちます。

この記事はあなたを必要とするかもしれません

  • Docker、Dockerfileを使用したか、Dockerの公式ドキュメントを読んだことがある

最近、DockerのSDKを使用してプロジェクトに取り組んでいますが、公式ドキュメントはGoコミュニティの古典的な原則に従っており、いくつかの例しか示していません。

画像-20220330142012483

やりたいことがこのリストにない場合は、残念ながら、コピーするコードがないので、自分で調べてください。

この記事では、公式ドキュメントに記載されている基本事項を取り上げずに、この期間中のDocker SDKforGoの調査について説明します。

簡単な例から始めましょう(公式の例には含まれていない例)

  • 通常どおりDockerFileを使用して単純なデプロイメントを実行します
func DeployWithDockerFile(username, repoName string) {
  f, err := NewTarArchiveFromPath(download.GetRepoDir(username, repoName))
  if err != nil {
    panic(err)
  }
  
  build, err := cli.ImageBuild(ctx, f, types.ImageBuildOptions{
    Dockerfile: "Dockerfile",
  })
  if err != nil {
    panic(err)
  }
  
  all, err := io.ReadAll(build.Body)
  if err != nil {
    panic(err)
  }
  
  fmt.Println("resp:", string(all))
}
复制代码

上記のコードでは、次のことが行われます

  • tarファイルにデプロイするプロジェクトを圧縮します
  • 移行cli.ImageBuild
  • ハンドルの戻り値cli.ImageBuild、彼はImageBuildResponse

cli

まず、公式ドキュメントを読んだ場合は、これcliが何であり、どのように機能するかを知っている必要があります。

Goコミュニティは、変数名にこの略語を使用するのが好きです。Javaコミュニティでは、この略語と呼ばれる可能性があると思います。DockerClient

cli, _ = client.NewClientWithOpts(client.FromEnv,client.WithAPIVersionNegotiation())
复制代码

このメソッドを使用して初期化し、オープンソースコードの検出をクリックします

client, err := defaultHTTPClient(DefaultDockerHost)
...
func defaultHTTPClient(host string) (*http.Client, error) {
  ...
  return &http.Client{
    Transport:     transport,
    CheckRedirect: CheckRedirect,
  }, nil
}
复制代码

これは実際には通常のHTTPClientであり、dockerのデーモンスレッドと対話するために使用されるため、このgo sdkは実際にレイヤーをカプセル化します。具体的なことは、APIを使用するためにhttp.Clientを自分でカプセル化することと同じです。カプセル化のレイヤー、コードはさらに書くのがはるかに便利です

ImageBuild()

この関数は3つのパラメーターを渡す必要があり、このSDKのほとんどの関数はこのパターンに従って設計されています

まず、Hengguは変更されていませんcontext。ドキュメントに特別な要件はありません。1つ渡すだけemptyContextです。慣れていない場合contextは問題ありません。HengguはGoのコルーチンコントロールの一部にすぎません。中国でのコミュニケーション、このSDKを使用することは基本的にそれを認識していません、ただそれを渡します

2番目のパラメータは通常、プロジェクト/コンテナ/イメージを見つけるために使用されます。ここでは、現在の操作ディレクトリとしてtarファイルを受け入れます。他の関数では、このアイテムはコンテナID/イメージIDなどで渡される場合があります。待機します。Dockerでのファイル転送を伴う部分では、tar形式がよく使用されます

3番目のパラメーターは通常、現在の操作のオプションです。このオプションのオプションは、プロジェクト内のDockerfileの相対パスを指定する必要があるここのdockerfileパラメーターなど、公式ドキュメントのAPIリファレンスのさまざまなパラメーターです。

この関数はResponseを返します。これは、dockerから返された情報を含む簡略化されたhttpResponseとして理解できますが、返される結果によると、http2.0のストリームである必要があります。

プロジェクトをイメージにパッケージ化した後、プロジェクトをコンテナーに実行し、プロセスでポートをバインドする必要があります

docker run -p 8000:9000 demo
复制代码

彼の実装は次のとおりです

func StartFromImage(username, repoName string) {
   var resp, err = cli.ContainerCreate(ctx, &container.Config{
      Image: imageName,
   }, &container.HostConfig{
      PortBindings: nat.PortMap{"9000/tcp": []nat.PortBinding{{
         HostIP:   "0.0.0.0",
         HostPort: "8000",
      }}},
   }, nil, nil, "name")
   cID := resp.ID
   if err := cli.ContainerStart(ctx, cID, types.ContainerStartOptions{}); err != nil {
      ...
   }
    ...
}
复制代码

ContainerCreate

Docker APIでは、コンテナの作成とコンテナの起動は2つの操作です。ContainerCreateバインドされたポートを呼び出すときは、次のように設定する必要があることに注意してください。PortBindings

彼はnat.PortMapタイプです

// PortMap is a collection of PortBinding indexed by Port
type PortMap map[Port][]PortBinding
复制代码

ここでのポートは文字列型であり、mapの値はPortBindingの配列です。

特別な注意:ここでのポートは、8080 / tcp、9000 / udpなどのポート番号/プロトコルの組み合わせであり、次のPortBindingは通常のポート番号とホストアドレスです。

ContainerStart

同等docker startですが、コンテナのIDのみを受け入れ、パラメータとしてタグをサポートしていません

これで、Dockerfileによるイメージの作成、コンテナーの作成、およびコンテナーの実行の基本的なプロセスが完了しました。

おすすめ

転載: juejin.im/post/7083493035949965348