Docker Engine SDK로 개발하기
Docker Engine SDK로 개발하기
Docker는 Docker 데몬과 상호작용하는 API(Docker Engine API)와 Go·Python용 SDK를 제공해요. SDK를 쓰면 Docker 앱과 솔루션을 효율적으로 빌드하고 확장할 수 있어요. Go나 Python이 안 맞는다면 Docker Engine API를 직접 사용해도 돼요. Docker Engine API는 wget이나 curl, 또는 대부분의 프로그래밍 언어에 포함된 HTTP 라이브러리로 접근하는 RESTful API예요.
출처: 문서
본문
SDK 설치하기
다음 명령으로 Go 또는 Python SDK를 설치해요. 두 SDK는 함께 설치해서 공존할 수 있어요.
Go SDK
$ go get github.com/moby/moby/client
이 클라이언트는 최신 버전의 Go가 필요해요. go version을 실행해서 현재 지원되는 Go 버전을 쓰는지 확인해요. 자세한 내용은 Go 클라이언트 레퍼런스를 참고해요.
Python SDK
- 권장:
pip install docker실행 pip을 쓸 수 없다면:- 패키지를 직접 다운로드하고,
- 압축을 풀어 해당 디렉터리로 이동한 뒤,
python setup.py install을 실행해요.
자세한 내용은 Docker Engine Python SDK 레퍼런스를 참고해요.
참고 Docker Desktop for Linux 사용자 Docker Desktop for Linux는 시스템 전체의
/var/run/docker.sock대신 사용자별 소켓을 사용해요. Docker Desktop for Linux에서 Docker SDK를 쓰려면DOCKER_HOST환경 변수를 설정해요.export DOCKER_HOST=unix://$HOME/.docker/desktop/docker.sock자세한 내용은 Linux FAQ를 참고해요.
API 레퍼런스 보기
최신 버전 API 레퍼런스를 보거나, 특정 버전을 선택할 수 있어요.
버전이 지정된 API와 SDK
어떤 버전의 Docker Engine API를 써야 하는지는 Docker 데몬과 Docker 클라이언트의 버전에 따라 달라져요. 자세한 내용은 API 문서의 버전이 지정된 API와 SDK 섹션을 참고해요.
SDK와 API 빠른 시작
코드에서 쓸 SDK 또는 API 버전을 고르는 기준은 다음과 같아요.
- 새 프로젝트라면 최신 버전을 쓰되, API 버전 협상을 사용하거나 사용하는 버전을 명시해요. 예상치 못한 문제를 줄일 수 있어요.
- 새 기능이 필요하다면, 해당 기능을 지원하는 최소 버전 이상으로 코드를 업데이트하고, 사용 가능한 최신 버전을 선호해요.
- 그 외에는 기존 코드가 쓰는 버전을 계속 사용해요.
예를 들어 docker run 명령은 Docker API를 직접 쓰거나, Python 또는 Go SDK로 구현할 수 있어요.
package main
import (
"context"
"io"
"os"
"github.com/moby/moby/api/pkg/stdcopy"
"github.com/moby/moby/api/types/container"
"github.com/moby/moby/client"
)
func main() {
ctx := context.Background()
apiClient, err := client.New(client.FromEnv)
if err != nil {
panic(err)
}
defer apiClient.Close()
reader, err := apiClient.ImagePull(ctx, "docker.io/library/alpine", client.ImagePullOptions{})
if err != nil {
panic(err)
}
io.Copy(os.Stdout, reader)
resp, err := apiClient.ContainerCreate(ctx, client.ContainerCreateOptions{
Image: "alpine",
Config: &container.Config{
Cmd: []string{"echo", "hello world"},
},
})
if err != nil {
panic(err)
}
if _, err := apiClient.ContainerStart(ctx, resp.ID, client.ContainerStartOptions{}); err != nil {
panic(err)
}
wait := apiClient.ContainerWait(ctx, resp.ID, client.ContainerWaitOptions{})
select {
case err := <-wait.Error:
if err != nil {
panic(err)
}
case <-wait.Result:
}
out, err := apiClient.ContainerLogs(ctx, resp.ID, client.ContainerLogsOptions{ShowStdout: true})
if err != nil {
panic(err)
}
stdcopy.StdCopy(os.Stdout, os.Stderr, out)
}
import docker
client = docker.from_env()
print(client.containers.run("alpine", ["echo", "hello", "world"]))
$ curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" \
-d '{"Image": "alpine", "Cmd": ["echo", "hello world"]}' \
-X POST http://localhost/v1.56/containers/create
{"Id":"1c6594faf5","Warnings":null}
$ curl --unix-socket /var/run/docker.sock -X POST http://localhost/v1.56/containers/1c6594faf5/start
$ curl --unix-socket /var/run/docker.sock -X POST http://localhost/v1.56/containers/1c6594faf5/wait
{"StatusCode":0}
$ curl --unix-socket /var/run/docker.sock "http://localhost/v1.56/containers/1c6594faf5/logs?stdout=1"
hello world
cURL로 Unix 소켓에 연결할 때 호스트명은 중요하지 않아요. 위 예시는 localhost를 쓰는데, 아무 호스트명이나 동작해요.
중요 위 예시는 cURL 7.50.0 이상을 가정해요. 더 오래된 cURL은 소켓 연결에 비표준 URL 표기를 썼어요. 더 오래된 cURL을 쓴다면
http:/<API version>/을 대신 사용해요. 예:http:/v1.56/containers/1c6594faf5/start.더 많은 예시는 SDK 예시를 참고해요.
비공식 라이브러리
다른 언어를 위한 커뮤니티 지원 라이브러리가 여럿 있어요. Docker가 테스트한 것은 아니므로 문제가 생기면 해당 라이브러리 유지보수자에게 문의해요.
| 언어 | 라이브러리 |
|---|---|
| C | libdocker |
| C# | Docker.DotNet |
| C++ | lasote/docker_client |
| Clojure | clj-docker-client, contajners |
| Dart | bwu_docker |
| Erlang | erldocker |
| Gradle | gradle-docker-plugin |
| Groovy | docker-client |
| Haskell | docker-hs |
| Java | docker-client, docker-java, docker-java-api, jocker |
| NodeJS | dockerode, harbor-master, the-moby-effect |
| Perl | Eixo::Docker |
| PHP | Docker-PHP |
| Ruby | docker-api |
| Rust | bollard, docker-rust, shiplift |
| Scala | tugboat, reactive-docker |
| Swift | docker-client-swift |