Updated:

1 minute read

개요


HTTP API

  • reference
  • 호출 방법
    • unix socket
      • curl --unix-socket /var/run/docker.sock http://localhost/v1.41/images/json
    • ip
      • curl -X GET http://127.0.0.1:3000/v1.41/images/json


SDK


도커 원격 접근 방법

  • 도커는 기본적으로 유닉스 소켓으로 실행되므로 원격 접속을 위해선 호스트 추가가 필요
    • vim /lib/systemd/system/docker.service
      • ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H 0.0.0.0:3000
    • systemctl daemon-reload
    • systemctl restart docker


예제

  • docker images
    • HTTP
      • curl -X GET http://127.0.0.1:3000/v1.41/images/json
    • SDK
      • Go
         package main
                
         import (
         	"context"
         	"fmt"
                
         	"github.com/docker/docker/api/types"
         	"github.com/docker/docker/client"
         )
                
         func main() {
         	ctx := context.Background()
         	cli, err := client.NewClientWithOpts(client.FromEnv, client.WithHost("http://127.0.0.1:3000"), client.WithAPIVersionNegotiation())
         	if err != nil {
         		panic(err)
         	}
                
         	images, err := cli.ImageList(ctx, types.ImageListOptions{})
         	if err != nil {
         		panic(err)
         	}
                
         	for _, image := range images {
         		fmt.Println(image.ID)
         	}
         }
        
  • docker run
    • HTTP
      • 이미지 풀
        • curl -X POST "http://127.0.0.1:3000/v1.41/images/create?fromImage=alpine:3.16.0"
      • 컨테이너 생성
        • curl -H "Content-Type: application/json" -d '{"Image": "alpine:3.16.0", "Cmd": ["echo", "hello world"]}' -X POST http://127.0.0.1:3000/v1.41/containers/create
          • 응답이 {"Id":"ac6594faf5","Warnings":[]}라 가정
      • 컨테이너 실행
        • curl -X POST http://127.0.0.1:3000/v1.41/containers/ac6594faf5/start
      • 컨테이너가 지정된 상태가 될 때까지 대기
        • curl -X POST "http://127.0.0.1:3000/v1.41/containers/ac6594faf5/wait?condition=not-running"
      • 컨테이너 로그
        • curl -X GET "http://127.0.0.1:3000/v1.41/containers/ac6594faf5/logs?stdout=1"
      • 컨테이너 삭제
        • curl -X DELETE http://127.0.0.1:3000/v1.41/containers/ac6594faf5
    • SDK
      • Go
         package main
                
         import (
         	"context"
         	"io"
         	"os"
                
         	"github.com/docker/docker/api/types"
         	"github.com/docker/docker/api/types/container"
         	"github.com/docker/docker/client"
         	"github.com/docker/docker/pkg/stdcopy"
         )
                
         func main() {
         	ctx := context.Background()
         	cli, err := client.NewClientWithOpts(client.FromEnv, client.WithHost("http://127.0.0.1:3000"), client.WithAPIVersionNegotiation())
         	if err != nil {
         		panic(err)
         	}
                
         	// image pull
         	radCloser, err := cli.ImagePull(ctx, "alpine:3.16.0", types.ImagePullOptions{})
         	if err != nil {
         		panic(err)
         	}
         	defer radCloser.Close()
         	io.Copy(os.Stdout, radCloser)
                
         	// container create
         	resp, err := cli.ContainerCreate(ctx, &container.Config{
         		Image: "alpine:3.16.0",
         		Cmd:   []string{"echo", "hello world"},
         	}, nil, nil, nil, "")
         	if err != nil {
         		panic(err)
         	}
                
         	// container start
         	if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
         		panic(err)
         	}
                
         	// container wait
         	statusCh, errCh := cli.ContainerWait(ctx, resp.ID, container.WaitConditionNotRunning)
         	select {
         	case err := <-errCh:
         		if err != nil {
         			panic(err)
         		}
         	case <-statusCh:
         	}
                
         	// container log
         	radCloser, err = cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true})
         	if err != nil {
         		panic(err)
         	}
         	stdcopy.StdCopy(os.Stdout, os.Stderr, radCloser)
                
         	// container remove
         	if err := cli.ContainerRemove(ctx, resp.ID, types.ContainerRemoveOptions{}); err != nil {
         		panic(err)
         	}
         }