Golang を使って Docker API を実際に操作する

Golang を使って Docker API を実際に操作する

Docker は、Docker デーモンと対話するための API (Docker Engine API と呼ばれる) を提供します。公式の Go 言語 SDK を使用して、Docker アプリケーションとソリューションを構築および拡張できます。

SDKのインストール

次のコマンドを実行して SDK をインストールできます。

github.com/docker/docker/client にアクセスしてください

ローカル Docker の管理

このセクションでは、Golang + Docker API を使用してローカル Docker を管理する方法を紹介します。

コンテナの実行

最初の例は、docker run docker.io/library/alpine echo "hello world" と同等のコンテナを実行する方法を示します。

パッケージメイン

輸入 (
 "コンテクスト"
 「イオ」
 「オス」

 「github.com/docker/docker/api/types」
 github.com/docker/docker/api/types/コンテナ
 「github.com/docker/docker/クライアント」
 「github.com/docker/docker/pkg/stdcopy」
)

関数main() {
 ctx := コンテキスト.背景()
 cli、エラー:= client.NewClientWithOpts(client.FromEnv、client.WithAPIVersionNegotiation())
 err != nil の場合 {
 パニック(エラー)
 }

 リーダー、エラー:= cli.ImagePull(ctx、"docker.io/library/alpine"、types.ImagePullOptions{})
 err != nil の場合 {
 パニック(エラー)
 }
 io.Copy(os.Stdout、リーダー)

 応答、エラー:= cli.ContainerCreate(ctx、&container.Config{
 画像: 「アルパイン」、
 コマンド: []文字列{"echo", "hello world"},
 }, ゼロ, ゼロ, "")
 err != nil の場合 {
 パニック(エラー)
 }

 err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {の場合
 パニック(エラー)
 }

 statusCh、errCh := cli.ContainerWait(ctx、resp.ID、container.WaitConditionNotRunning)
 選択{
 ケースエラー:= <-errCh:
 err != nil の場合 {
  パニック(エラー)
 }
 ケース <-ステータスCh:
 }

 出力、エラー:= cli.ContainerLogs(ctx、resp.ID、types.ContainerLogsOptions{ShowStdout: true})
 err != nil の場合 {
 パニック(エラー)
 }

 stdcopy.StdCopy(os.Stdout、os.Stderr、出力)
}

バックグラウンドでコンテナを実行する

コンテナをバックグラウンドで実行することもできます。これは、docker run -d bfirsh/reticulate-splines と同等です。

パッケージメイン

輸入 (
 "コンテクスト"
 「fmt」
 「イオ」
 「オス」

 「github.com/docker/docker/api/types」
 github.com/docker/docker/api/types/コンテナ
 「github.com/docker/docker/クライアント」
)

関数main() {
 ctx := コンテキスト.背景()
 cli、エラー:= client.NewClientWithOpts(client.FromEnv、client.WithAPIVersionNegotiation())
 err != nil の場合 {
 パニック(エラー)
 }

 画像名 := "bfirsh/reticulate-splines"

 出力、エラー:= cli.ImagePull(ctx、imageName、types.ImagePullOptions{})
 err != nil の場合 {
 パニック(エラー)
 }
 io.Copy(os.Stdout, 出力)

 応答、エラー:= cli.ContainerCreate(ctx、&container.Config{
 画像: imageName、
 }, ゼロ, ゼロ, "")
 err != nil の場合 {
 パニック(エラー)
 }

 err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {の場合
 パニック(エラー)
 }

 fmt.Println(resp.ID)
}

コンテナリストを表示

docker ps と同様に、実行中のコンテナを一覧表示します。

パッケージメイン

輸入 (
 "コンテクスト"
 「fmt」

 「github.com/docker/docker/api/types」
 「github.com/docker/docker/クライアント」
)

関数main() {
 ctx := コンテキスト.背景()
 cli、エラー:= client.NewClientWithOpts(client.FromEnv、client.WithAPIVersionNegotiation())
 err != nil の場合 {
  パニック(エラー)
 }

 コンテナ、エラー:= cli.ContainerList(ctx, types.ContainerListOptions{})
 err != nil の場合 {
  パニック(エラー)
 }

 _の場合、コンテナ:=範囲コンテナ{
  fmt.Println(コンテナID)
 }
}

docker ps -a の場合は、types.ContainerListOptions の All プロパティを変更することでこれを実現できます。

// ContainerListOptions 構造体型 {
// 静かなブール値
// サイズ ブール値
// すべてブール値
//最新のブール値
// 文字列なので
// 文字列の前
// 制限 int
// フィルターfilters.Args
// }

オプション:=types.ContainerListOptions{
 全員:本当です、
}
コンテナ、エラー:= cli.ContainerList(ctx, オプション)
err != nil の場合 {
 パニック(エラー)
}

実行中のコンテナをすべて停止する

上記の例では、コンテナのリストを取得できるので、この場合は実行中のコンテナをすべて停止できます。

注意: 次のコードを本番サーバー上で実行しないでください。

パッケージメイン

輸入 (
 "コンテクスト"
 「fmt」

 「github.com/docker/docker/api/types」
 「github.com/docker/docker/クライアント」
)

関数main() {
 ctx := コンテキスト.背景()
 cli、エラー:= client.NewClientWithOpts(client.FromEnv、client.WithAPIVersionNegotiation())
 err != nil の場合 {
  パニック(エラー)
 }

 コンテナ、エラー:= cli.ContainerList(ctx, types.ContainerListOptions{})
 err != nil の場合 {
  パニック(エラー)
 }

 _の場合、コンテナ:=範囲コンテナ{
  fmt.Print("コンテナを停止しています ", container.ID[:10], "... ")
  err := cli.ContainerStop(ctx, container.ID, nil); err != nil {
   パニック(エラー)
  }
  fmt.Println("成功")
 }
}

指定されたコンテナのログを取得する

コンテナ ID を指定すると、対応する ID を持つコンテナのログを取得できます。

パッケージメイン

輸入 (
 "コンテクスト"
 「イオ」
 「オス」

 「github.com/docker/docker/api/types」
 「github.com/docker/docker/クライアント」
)

関数main() {
 ctx := コンテキスト.背景()
 cli、エラー:= client.NewClientWithOpts(client.FromEnv、client.WithAPIVersionNegotiation())
 err != nil の場合 {
  パニック(エラー)
 }

 オプション:= types.ContainerLogsOptions{ShowStdout: true}

 出力、エラー:= cli.ContainerLogs(ctx、"f1064a8a4c82"、オプション)
 err != nil の場合 {
  パニック(エラー)
 }

 io.Copy(os.Stdout, 出力)
}

ミラーリストを表示

すべてのローカル イメージを取得します。これは、docker image ls または docker images と同等です。

パッケージメイン

輸入 (
 "コンテクスト"
 「fmt」

 「github.com/docker/docker/api/types」
 「github.com/docker/docker/クライアント」
)

関数main() {
 ctx := コンテキスト.背景()
 cli、エラー:= client.NewClientWithOpts(client.FromEnv、client.WithAPIVersionNegotiation())
 err != nil の場合 {
  パニック(エラー)
 }

 画像、エラー:= cli.ImageList(ctx, types.ImageListOptions{})
 err != nil の場合 {
  パニック(エラー)
 }

 _の場合、画像:=範囲画像{
  fmt.Println(イメージID)
 }
}

画像をプルする

指定されたイメージをプルします。これは docker pull alpine と同等です。

パッケージメイン

輸入 (
 "コンテクスト"
 「イオ」
 「オス」

 「github.com/docker/docker/api/types」
 「github.com/docker/docker/クライアント」
)

関数main() {
 ctx := コンテキスト.背景()
 cli、エラー:= client.NewClientWithOpts(client.FromEnv、client.WithAPIVersionNegotiation())
 err != nil の場合 {
  パニック(エラー)
 }

 出力、エラー:= cli.ImagePull(ctx、"alpine"、types.ImagePullOptions{})
 err != nil の場合 {
  パニック(エラー)
 }

 延期 out.Close()

 io.Copy(os.Stdout, 出力)
}

プライベートイメージを取得する

パブリック イメージに加えて、通常はプライベート イメージも使用します。プライベート イメージは、DockerHub 上のプライベート イメージや、harbor などのセルフホスト型イメージ リポジトリ上のプライベート イメージになります。この時点で、イメージをプルするには、対応する資格情報を提供する必要があります。

Docker API の Go SDK を使用する場合、資格情報はプレーンテキストで送信されるので、独自のイメージ リポジトリを構築する場合は必ず HTTPS を使用するようにしてください。

パッケージメイン

輸入 (
 "コンテクスト"
 「エンコーディング/base64」
 「エンコーディング/json」
 「イオ」
 「オス」

 「github.com/docker/docker/api/types」
 「github.com/docker/docker/クライアント」
)

関数main() {
 ctx := コンテキスト.背景()
 cli、エラー:= client.NewClientWithOpts(client.FromEnv、client.WithAPIVersionNegotiation())
 err != nil の場合 {
  パニック(エラー)
 }

 authConfig := types.AuthConfig{
  ユーザー名: "ユーザー名"、
  パスワード: "password",
 }
 エンコードされたJSON、エラー:= json.Marshal(authConfig)
 err != nil の場合 {
  パニック(エラー)
 }
 authStr := base64.URLEncoding.EncodeToString(エンコードされたJSON)

 出力、エラー:= cli.ImagePull(ctx、"alpine"、types.ImagePullOptions{RegistryAuth: authStr})
 err != nil の場合 {
  パニック(エラー)
 }

 延期 out.Close()
 io.Copy(os.Stdout, 出力)
}

コンテナを画像として保存する

既存のコンテナをイメージとして保存するには、次のようにコミットします。

パッケージメイン

輸入 (
 "コンテクスト"
 「fmt」

 「github.com/docker/docker/api/types」
 github.com/docker/docker/api/types/コンテナ
 「github.com/docker/docker/クライアント」
)

関数main() {
 ctx := コンテキスト.背景()
 cli、エラー:= client.NewClientWithOpts(client.FromEnv、client.WithAPIVersionNegotiation())
 err != nil の場合 {
  パニック(エラー)
 }

 createResp、err := cli.ContainerCreate(ctx、&container.Config{
  画像: 「アルパイン」、
  コマンド: []文字列{"touch", "/helloworld"},
 }, ゼロ, ゼロ, "")
 err != nil の場合 {
  パニック(エラー)
 }

 エラーの場合:= cli.ContainerStart(ctx, createResp.ID, types.ContainerStartOptions{}); エラー!= nil {
  パニック(エラー)
 }

 statusCh、errCh := cli.ContainerWait(ctx、createResp.ID、container.WaitConditionNotRunning)
 選択{
 ケースエラー:= <-errCh:
  err != nil の場合 {
   パニック(エラー)
  }
 ケース <-ステータスCh:
 }

 commitResp、err := cli.ContainerCommit(ctx、createResp.ID、types.ContainerCommitOptions{参照: "helloworld"})
 err != nil の場合 {
  パニック(エラー)
 }

 fmt.Println(コミット応答ID)
}

リモートDockerの管理

もちろん、ローカル Docker を管理するだけでなく、Golang + Docker API を使用してリモート Docker を管理することもできます。

リモート接続

デフォルトでは、Docker はネットワーク外の Unix ソケットを介して実行され、ローカルでのみ通信できます (/var/run/docker.sock)。リモートで Docker に接続することはできません。
設定ファイル /etc/docker/daemon.json を編集し、次の内容を変更して (192.168.59.3 を自分の IP アドレスに変更)、Docker を再起動する必要があります。

# vi /etc/docker/daemon.json
{
 「ホスト」: [
 "TCP://192.168.59.3:2375",
 「unix:///var/run/docker.sock」
 ]
}

systemctl dockerを再起動します

クライアントを変更する

クライアントを作成するときは、リモート Docker のアドレスを指定して、ローカル Docker を管理するのと同じようにリモート Docker を管理できるようにする必要があります。

cli、エラー = client.NewClientWithOpts(client.FromEnv、client.WithAPIVersionNegotiation()、
 クライアント.WithHost("tcp://192.168.59.3:2375"))

要約する

Docker を管理できる製品はすでに多く存在しており、portainer など、このように実装されています。

Golang を使って Docker API をいじる方法についてはこれで終わりです。Golang で Docker API を実行する方法については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Go をセットアップして Docker でアプリケーションをデプロイする方法の詳細な説明
  • DockerとGolangの巧みな組み合わせ
  • docker で golang プロジェクトをデプロイする詳細な手順
  • Docker で Django アプリケーションをデプロイする例
  • dockerコンテナ上でgoプログラムをコンパイルすると、ファイルが見つからないというメッセージが表示される
  • Docker を使用して Django プロジェクトをデプロイする方法の例
  • docker django が redis コンテナにアクセスできない問題の解決方法
  • Golang 勉強ノート: Go1.15 バージョンをインストール (win/linux/macos/docker インストール)

<<:  HTML 要素 (タグ) とその使用法

>>:  中国のウェブサイトユーザーエクスペリエンスランキング

推薦する

HTML フォーム コンポーネントのサンプル コード

HTML フォームは、さまざまな種類のユーザー入力を収集するために使用されます。次のコードは、HTM...

nginxでイメージサーバーを構築する手順の詳しい説明(ルートとエイリアスの違い)

インストール手順は省略します( yum -y install nginx;を使用して直接インストール...

Xiaomi公式サイトの登録・ログイン機能を模倣するJavaScript

目次まずページレイアウトを構築する必要がありますJS関数1 JS関数2 JS関数3 JS関数4効果図...

Vue+Router+Element でシンプルなナビゲーションバーを実装する

このプロジェクトでは、Vue+Router+Element の具体的なコードを共有して、シンプルなナ...

ログインと登録を実現するSpringboot+VUE

この記事の例では、ログインと登録を実装するためのspringboot+VUEの具体的なコードを参考ま...

Vue で 3D タグ クラウドを実装するための詳細なコード

プレビュー: コード:ページセクション: <テンプレート> <div class=...

フォント宝庫 50 種類の素晴らしい無料英語フォントリソース パート 1

デザイナーは独自のフォント ライブラリを持っているため、プロジェクトの設計時にすぐに使用できます。今...

MySQL の文字セット utf8 を utf8mb4 に変更する方法

MySQL 5.5 の場合、文字セットが設定されていない場合、MySQL のデフォルトの文字セットは...

CentOS7 上で KVM 仮想化プラットフォームを構築する (3 つの方法)

KVM はカーネルベースの仮想マシンの略で、Linux をハイパーバイザーに変換する Linux ...

MySQL 接続クエリを本当に学びましたか?

1. 内部結合クエリの概要内部結合は、アプリケーションで非常に一般的な結合操作であり、通常はデフォ...

mysqldumpデータエクスポートの問題に関する詳細な議論

1. mysqldump の使用時にエラー (1064) が報告されます。これは、mysqldump...

Vue は QR コード スキャン機能を実装します (スタイル付き)

必要: vue を使用して QR コードのスキャンを実現します。プラグイン: QRコードリーダー;プ...

Vue3 シングルファイルコンポーネントのスタイル機能の詳細な説明

目次スタイルスコープスタイルモジュール状態駆動型動的CSS要約するスタイルスコープ注意事項:スタイル...

Docker ベースの ELK ログ システムを構築する方法

背景要件:ビジネスがどんどん大きくなると、サーバーの数も増え、さまざまなアクセスログ、アプリケーショ...

Windows 10 での mysql5.5 データベース コマンドラインの中国語文字化け問題を解決する

システムをリセットした後、かなり前にインストールした MySQL データベースのコンソール クエリで...