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) }
      
      






All Articles