Docker
Docker Engine API
수색…
소개
자신의 응용 프로그램 내에서 Docker의 모든 측면을 제어하고 Docker에서 실행되는 응용 프로그램을 관리 및 모니터링하며 Docker 자체에서 응용 프로그램을 빌드하는 데 사용하는 도구를 작성할 수있는 API.
Linux에서 Docker API에 대한 원격 액세스 사용
/etc/init/docker.conf
편집하고 DOCKER_OPTS
변수를 다음과 같이 갱신하십시오 :
DOCKER_OPTS='-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock'
Docker deamon 다시 시작
service docker restart
원격 API가 작동하는지 확인
curl -X GET http://localhost:4243/images/json
시스템 실행중인 Linux에서 Docker API에 대한 원격 액세스 사용
Ubuntu 16.04처럼 -H tcp://0.0.0.0:2375
를 /etc/default/docker
추가하면 systemd가 실행되는 Linux는 예전과 같은 효과가 없습니다.
대신 포트 4243의 TCP 소켓에서 도커를 사용하려면 /etc/systemd/system/docker-tcp.socket
이라는 파일을 만듭니다.
[Unit]
Description=Docker Socket for the API
[Socket]
ListenStream=4243
Service=docker.service
[Install]
WantedBy=sockets.target
그런 다음 새 소켓을 활성화하십시오.
systemctl enable docker-tcp.socket
systemctl enable docker.socket
systemctl stop docker
systemctl start docker-tcp.socket
systemctl start docker
이제 원격 API가 작동하는지 확인하십시오.
curl -X GET http://localhost:4243/images/json
Systemd에서 TLS로 원격 액세스 사용
업그레이드시 변경 사항을 덮어 쓰지 않는 패키지 설치 관리자 단위 파일을 / etc에 복사합니다.
cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service
ExecStart의 옵션으로 /etc/systemd/system/docker.service를 업데이트하십시오.
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2376 \
--tlsverify --tlscacert=/etc/docker/certs/ca.pem \
--tlskey=/etc/docker/certs/key.pem \
--tlscert=/etc/docker/certs/cert.pem
dockerd
는 이전에 docker daemon
이었던 1.12 데몬 이름입니다. 또한 2376은 도커의 표준 TLS 포트이며, 2375는 암호화되지 않은 표준 포트입니다. 자체 TLS 자체 서명 된 CA, 인증서 및 키를 만드는 단계는 이 페이지 를 참조하십시오.
systemd 장치 파일을 변경 한 후 다음을 실행하여 systemd 구성을 다시로드하십시오.
systemctl daemon-reload
다음을 실행하여 고정 표시를 다시 시작합니다.
systemctl restart docker
Docker 포트를 공개 할 때 TLS 암호화를 건너 뛰는 것은 좋지 않습니다.이 포트에 대한 네트워크 액세스 권한을 가진 사람은 사실상 호스트에서 전체 루트 액세스 권한을 갖기 때문입니다.
진행률 막대가 포함 된 이미지 당기기 (Go)
다음은 Go
및 Docker Engine API
를 사용하여 이미지를 docker pull your_image_name
와 CLI
에서 docker pull your_image_name
을 실행할 때 표시되는 진행 막대와 동일한 진행 막대입니다. 진행 막대의 목적을 위해 일부 ANSI 코드 가 사용됩니다.
package yourpackage
import (
"context"
"encoding/json"
"fmt"
"io"
"strings"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
// Struct representing events returned from image pulling
type pullEvent struct {
ID string `json:"id"`
Status string `json:"status"`
Error string `json:"error,omitempty"`
Progress string `json:"progress,omitempty"`
ProgressDetail struct {
Current int `json:"current"`
Total int `json:"total"`
} `json:"progressDetail"`
}
// Actual image pulling function
func PullImage(dockerImageName string) bool {
client, err := client.NewEnvClient()
if err != nil {
panic(err)
}
resp, err := client.ImagePull(context.Background(), dockerImageName, types.ImagePullOptions{})
if err != nil {
panic(err)
}
cursor := Cursor{}
layers := make([]string, 0)
oldIndex := len(layers)
var event *pullEvent
decoder := json.NewDecoder(resp)
fmt.Printf("\n")
cursor.hide()
for {
if err := decoder.Decode(&event); err != nil {
if err == io.EOF {
break
}
panic(err)
}
imageID := event.ID
// Check if the line is one of the final two ones
if strings.HasPrefix(event.Status, "Digest:") || strings.HasPrefix(event.Status, "Status:") {
fmt.Printf("%s\n", event.Status)
continue
}
// Check if ID has already passed once
index := 0
for i, v := range layers {
if v == imageID {
index = i + 1
break
}
}
// Move the cursor
if index > 0 {
diff := index - oldIndex
if diff > 1 {
down := diff - 1
cursor.moveDown(down)
} else if diff < 1 {
up := diff*(-1) + 1
cursor.moveUp(up)
}
oldIndex = index
} else {
layers = append(layers, event.ID)
diff := len(layers) - oldIndex
if diff > 1 {
cursor.moveDown(diff) // Return to the last row
}
oldIndex = len(layers)
}
cursor.clearLine()
if event.Status == "Pull complete" {
fmt.Printf("%s: %s\n", event.ID, event.Status)
} else {
fmt.Printf("%s: %s %s\n", event.ID, event.Status, event.Progress)
}
}
cursor.show()
if strings.Contains(event.Status, fmt.Sprintf("Downloaded newer image for %s", dockerImageName)) {
return true
}
return false
}
가독성을 높이기 위해 ANSI 코드를 사용하는 커서 동작은 다음과 같은 별도의 구조로 이동됩니다.
package yourpackage
import "fmt"
// Cursor structure that implements some methods
// for manipulating command line's cursor
type Cursor struct{}
func (cursor *Cursor) hide() {
fmt.Printf("\033[?25l")
}
func (cursor *Cursor) show() {
fmt.Printf("\033[?25h")
}
func (cursor *Cursor) moveUp(rows int) {
fmt.Printf("\033[%dF", rows)
}
func (cursor *Cursor) moveDown(rows int) {
fmt.Printf("\033[%dE", rows)
}
func (cursor *Cursor) clearLine() {
fmt.Printf("\033[2K")
}
그런 다음 주 패키지에서 당길 원하는 이미지 이름을 전달하는 PullImage
함수를 호출 할 수 있습니다. 물론 이미지를 호출하기 전에 Docker 레지스트리에 로그인해야합니다.
복잡한 구조를 전달하면서 cURL 요청하기
Docker API
대한 일부 쿼리에 대해 cURL
을 사용하는 경우 복잡한 구조를 전달하는 것이 약간 까다로울 수 있습니다. 예를 들어 이미지 목록을 가져 오면 쿼리 매개 변수로 필터를 사용할 수 있습니다.이 매개 변수는 map[string][]string
의 JSON
표현이어야 map[string][]string
(자세한 내용은 Go
의지도를 참조 하십시오 ).
이를 달성하는 방법은 다음과 같습니다.
curl --unix-socket /var/run/docker.sock \
-XGET "http:/v1.29/images/json" \
-G \
--data-urlencode 'filters={"reference":{"yourpreciousregistry.com/path/to/image": true}, "dangling":{"true": true}}'
여기서 -G
플래그는 --data-urlencode
매개 변수의 데이터가 다른 경우 사용되는 POST
요청 대신 HTTP GET
요청에 사용될 것을 지정하는 데 사용됩니다. 데이터는 URL에 ?
분리 기호.