수색…


소개

자신의 응용 프로그램 내에서 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)

다음은 GoDocker Engine API 를 사용하여 이미지를 docker pull your_image_nameCLI 에서 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][]stringJSON 표현이어야 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에 ? 분리 기호.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow