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 に接続することはできません。 # 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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: 中国のウェブサイトユーザーエクスペリエンスランキング
この実験のテスト環境: Windows 10+cmd+MySQL5.6.36+InnoDB 1. ト...
長い引用には blockquote を、短い引用には q を、参考文献には cite を使用します。...
1. CSSをアルファベット順に並べるアルファベット順ではありません:コードをコピーコードは次のとお...
さっそく、レンダリングを見てみましょうソースコードは以下のとおりです <!DOCTYPE ht...
目次Dockerとは展開する1. イメージをプルする2. 画像を表示する3. コンテナを実行する4....
最近、次のデータ型のデータベースに遭遇しました:decimal(14,4)発生した問題は次のとおりで...
この記事では、ショッピングカート決済機能を実現するためのVueの具体的なコードを例として紹介します。...
この記事では、全選択または選択を反転する機能を実現するためのJavaScriptの具体的なコードを参...
watch : データの変更を監視する(特定の値の変更イベント) vue2.x データ(){ 戻る ...
私は最近、空洞化効果について研究しました。背景クリップ: テキスト背景はテキストの前景色にクリップさ...
序文この記事で実装されている要件は、実際には非常に一般的です。たとえば、ユーザーが登録したチャネルを...
たとえば、<u>には終了文字がなく、ブラウザはそれを認識します。 SHTML は Ser...
目次序文プロトタイプチェーン継承コンストラクタの継承組み合わせ継承(プロトタイプチェーン継承とコンス...
目次概要遅延読み込みとは何ですか?最適化を開始するビジネスモジュールを分割する遅延読み込みルート構成...
目次1. Vue2 構文2. Vue3の使用1. コンポーネントのref値を設定する2. コンポーネ...