【Go言語】goでdockerコンテナを作成する

「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