GoでのDockerコンテナーの管理

ドキュメンテーション!


Dockerハブまたはレジストリからフックをキャッチしてサーバー上のコンテナーを自動的に更新/起動する独自の自転車を作成する場合、Docker Cliを使用して、システム上のDockerデーモンを管理できます。
画像


作業には、1.9.4以上のGoバージョンが必要です。


まだモジュールに切り替えていない場合は、次のコマンドでCliをインストールします。


go get github.com/docker/docker/client 

コンテナ打ち上げ


次の例は、Docker APIを使用してコンテナーを開始する方法を示しています。 コマンドラインでは、 docker runを使用しますが、サービスでこのタスクに簡単に対処できます。
この例は、 docker run alpine echo hello worldを実行するのと同等です


 package main { ctx := context.Background() cli, err := client.NewEnvClient() if err != nil { panic(err) } //  docker pull reader, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{}) if err != nil { panic(err) } io.Copy(os.Stdout, reader) hostBinding := nat.PortBinding{ HostIP: "0.0.0.0", HostPort: "8000", } containerPort, err := nat.NewPort("tcp", "80") if err != nil { panic("Unable to get the port") } portBinding := nat.PortMap{containerPort: []nat.PortBinding{hostBinding}} //      resp, err := cli.ContainerCreate(ctx, &container.Config{ Image: "alpine", Cmd: []string{"echo", "hello world"}, Tty: true, }, &container.HostConfig{ PortBindings: portBinding, }, nil, "") if err != nil { panic(err) } //   if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil { panic(err) } //    out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true}) if err != nil { panic(err) } io.Copy(os.Stdout, out) } 

実行中のコンテナのリストを取得する


この例は、 docker ps実行と同等です


 package main import ( "context" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/client" ) func main() { cli, err := client.NewEnvClient() if err != nil { panic(err) } //    (docker ps) containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{}) if err != nil { panic(err) } //     for _, container := range containers { fmt.Println(container.ID) } } 

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


コンテナを作成して実行する方法を学んだら、それらを管理する方法を学びます。 次の例は、実行中のすべてのコンテナを停止します。


本番サーバーでこのコードを実行しないでください!

 package main import ( "context" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/client" ) func main() { ctx := context.Background() cli, err := client.NewEnvClient() if err != nil { panic(err) } //    (docker ps) containers, err := cli.ContainerList(ctx, types.ContainerListOptions{}) if err != nil { panic(err) } for _, c := range containers { fmt.Print("Stopping container ", c.ID[:10], "... ") if err := cli.ContainerStop(ctx, c.ID, nil); err != nil { panic(err) } fmt.Println("Success") } } 

単一のコンテナのロギング


個々のコンテナで作業できます。 次の例は、指定された識別子を持つコンテナのログを表示します。 開始する前に、ログを受信するコンテナの識別子を変更する必要があります。


 package main import ( "context" "io" "os" "github.com/docker/docker/api/types" "github.com/docker/docker/client" ) func main() { ctx := context.Background() cli, err := client.NewEnvClient() if err != nil { panic(err) } options := types.ContainerLogsOptions{ShowStdout: true} //  id   out, err := cli.ContainerLogs(ctx, "f1064a8a4c82", options) if err != nil { panic(err) } io.Copy(os.Stdout, out) } 

画像のリストを取得する


この例は、 docker image ls実行と同等です


 package main import ( "context" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/client" ) func main() { cli, err := client.NewEnvClient() if err != nil { panic(err) } //    images, err := cli.ImageList(context.Background(), types.ImageListOptions{}) if err != nil { panic(err) } for _, image := range images { fmt.Println(image.ID) } } 

引く


この例は、 docker pullを実行するのと同等です


 package main import ( "context" "io" "os" "github.com/docker/docker/api/types" "github.com/docker/docker/client" ) func main() { ctx := context.Background() cli, err := client.NewEnvClient() if err != nil { panic(err) } // docker pull alpine out, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{}) if err != nil { panic(err) } defer out.Close() io.Copy(os.Stdout, out) } 

ユーザー認証を使用したイメージのダウンロード


この例は、認証を使用してdocker pullを実行するのと同等です。


認証データはクリアテキストで送信されます。 公式のdockerレジストリはHTTPSを使用し、
HTTPSを使用してデータを送信するようにプライベートレジストリも構成する必要があります。

 package main import ( "context" "encoding/base64" "encoding/json" "io" "os" "github.com/docker/docker/api/types" "github.com/docker/docker/client" ) func main() { ctx := context.Background() cli, err := client.NewEnvClient() if err != nil { panic(err) } //       authConfig := types.AuthConfig{ Username: "username", Password: "password", } encodedJSON, err := json.Marshal(authConfig) if err != nil { panic(err) } authStr := base64.URLEncoding.EncodeToString(encodedJSON) out, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{RegistryAuth: authStr}) if err != nil { panic(err) } defer out.Close() io.Copy(os.Stdout, out) } 


Source: https://habr.com/ru/post/J449038/


All Articles