「docker create」 をGo言語で
「Go client for the Docker Engine API」パッケージを使用します。
https://pkg.go.dev/github.com/docker/docker/client
以下のコードを実行するとdocker create httpd
と同様の動作を行えます
package main import ( "context" "fmt" "github.com/docker/docker/api/types/container" "github.com/docker/docker/client" ) const ( dockerClientVersion = "1.42" ) func main() { ctx := context.Background() cli, err := client.NewClientWithOpts(client.FromEnv, client.WithVersion(dockerClientVersion)) if err != nil { panic(err) } defer cli.Close() reader, err := cli.ImagePull(ctx, "docker.io/library/httpd", types.ImagePullOptions{}) if err != nil { panic(err) } io.Copy(os.Stdout, reader) resp, err := cli.ContainerCreate(ctx, &container.Config{ Image: "httpd", }, nil, nil, nil, "") if err != nil { panic(err) } fmt.Println(resp.ID) }
コードの解説
コンテキストの作成
言わずもがな、コンテキストを作成しています。
ctx := context.Background()
docker clientの作成
ここではclientを作成しています。ここでDockerのシステムと疎通を行えるようにします。dockerClientVersion
をコード上部で設定して利用していますが、環境に合わせて自動で取得できるようにもできるのでお好みです。
defer
はこの関数が終了したときにちゃんと接続を切るためにあります。
cli, err := client.NewClientWithOpts( client.FromEnv, client.WithVersion(dockerClientVersion), ) if err != nil { panic(err) } defer cli.Close()
imageのpull
reader, err := cli.ImagePull(ctx, "docker.io/library/httpd", types.ImagePullOptions{}) if err != nil { panic(err) } io.Copy(os.Stdout, reader)
コンテナを作成
ここではContainerCreate
を用いてコンテナの作成を行っています。
resp, err := cli.ContainerCreate(ctx, &container.Config{ Image: "httpd", }, nil, nil, nil, "") if err != nil { panic(err) }
ContainerCreate
は引数に以下を取り、これらの値を変えることで様々な設定をコンテナに指定することができます。
ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, platform *ocispec.Platform, containerName string
例えば、以下のように指定するとhttpd
コンテナのポートを80:80
でバインドすることができます。
&container.HostConfig{ PortBindings: nat.PortMap{ "80/tcp": []nat.PortBinding{ { HostPort: "80", }, }, }, },
では実際に実行してみると、このようにコンテナが作成されてIDが返却されます。
$ go run main.go 660606315bb4f47c173ef860eec09311ecd49a955e50ac0ee86d51626c3e79a2