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