[docker] Docker Engine API(Docker daemon)
Updated:
개요
- https://docs.docker.com/engine/api/
- 도커는 도커 데몬(Docker Engine API)과 상호 작용하기 위한 HTTP(RESTful) API와 SDK 제공
- SDK는 하위 버전 호환
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
- unix socket
SDK
- Go
go get github.com/docker/docker/client
- reference
- Python
pip install docker
- reference
- Unofficial libraries
- SDK examples
도커 원격 접근 방법
- 도커는 기본적으로 유닉스 소켓으로 실행되므로 원격 접속을 위해선 호스트 추가가 필요
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) } }
- Go
- HTTP
- 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) } }
- Go
- HTTP