LoginSignup
0
0

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

Last updated at Posted at 2023-12-24

「docker create」 をGo言語で

「Go client for the Docker Engine API」パッケージを使用します。

以下のコードを実行すると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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0