DockerやGoに触れたことがないが興味がある場合は、この記事が役に立ちます。
この記事はあなたを必要とするかもしれません
- Docker、Dockerfileを使用したか、Dockerの公式ドキュメントを読んだことがある
最近、DockerのSDKを使用してプロジェクトに取り組んでいますが、公式ドキュメントはGoコミュニティの古典的な原則に従っており、いくつかの例しか示していません。
やりたいことがこのリストにない場合は、残念ながら、コピーするコードがないので、自分で調べてください。
この記事では、公式ドキュメントに記載されている基本事項を取り上げずに、この期間中の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によるイメージの作成、コンテナーの作成、およびコンテナーの実行の基本的なプロセスが完了しました。