1. 程式人生 > >docker深入2-API示例

docker深入2-API示例

api docker go swarm mode

docker深入2-API示例

2017/9/18

一、目的
演示 http API 使用的方式
註1:本次實例是在 docker swarm mode 下使用的,目的是:更新指定服務的鏡像。
註2:要在 swarm manager node 上執行。

docker 的 API 文檔是自動生成的,沒有太多有用的示例可用。

【版本】
~]# docker version
Client:
 Version:      17.06.0-ce
 API version:  1.30
 Go version:   go1.8.3
 Git commit:   02c1d87
 Built:        Fri Jun 23 21:20:36 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.06.0-ce
 API version:  1.30 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   02c1d87
 Built:        Fri Jun 23 21:21:56 2017
 OS/Arch:      linux/amd64
 Experimental: false



二、實例
1、創建一個服務
docker service create --name t001 --publish 22222:80 --detach=true opera443399/whoami:0.7


2、更新服務
1) 目標
service_image_latest="opera443399/whoami:0.6"
service_name="t001"

2) 獲取當前服務的版本
service_version_index=$(curl -s     --unix-socket /var/run/docker.sock     http:/v1.30/services?filters=‘\{"name":\["‘${service_name}‘"\]\}‘     |jq ‘.[].Version.Index‘)


3) 執行更新
curl -s     --unix-socket /var/run/docker.sock     "http:/v1.30/services/${service_name}/update?version=${service_version_index}"     -X POST     -H "Content-Type: application/json"     -d "
    {
        \"Name\": \"${service_name}\",
        \"TaskTemplate\": {
            \"ContainerSpec\": {
                \"Image\": \"${service_image_latest}\"
            }
        }
    }
    " |jq ‘.‘
    

4) 查看服務現狀
curl -s     --unix-socket /var/run/docker.sock     http:/services?filters=‘\{"name":\["‘${service_name}‘"\]\}‘     |jq ‘.‘
   


   
三、問題
1、如果創建 service 時,使用自定義的網絡,怎麽辦?
狀態:未解決
註意這一段關於 Networks 的註釋:

引用自:https://github.com/moby/moby/blob/master/api/types/swarm/service.go

// ServiceSpec represents the spec of a service.
type ServiceSpec struct {
	Annotations

	// TaskTemplate defines how the service should construct new tasks when
	// orchestrating this service.
	TaskTemplate   TaskSpec      `json:",omitempty"`
	Mode           ServiceMode   `json:",omitempty"`
	UpdateConfig   *UpdateConfig `json:",omitempty"`
	RollbackConfig *UpdateConfig `json:",omitempty"`

	// Networks field in ServiceSpec is deprecated. The
	// same field in TaskSpec should be used instead.
	// This field will be removed in a future release.
	Networks     []NetworkAttachmentConfig `json:",omitempty"`
	EndpointSpec *EndpointSpec             `json:",omitempty"`
}


引用自:https://github.com/moby/moby/blob/master/api/types/swarm/task.go
// TaskSpec represents the spec of a task.
type TaskSpec struct {
	// ContainerSpec and PluginSpec are mutually exclusive.
	// PluginSpec will only be used when the `Runtime` field is set to `plugin`
	ContainerSpec *ContainerSpec      `json:",omitempty"`
	PluginSpec    *runtime.PluginSpec `json:",omitempty"`

	Resources     *ResourceRequirements     `json:",omitempty"`
	RestartPolicy *RestartPolicy            `json:",omitempty"`
	Placement     *Placement                `json:",omitempty"`
	Networks      []NetworkAttachmentConfig `json:",omitempty"`

	// LogDriver specifies the LogDriver to use for tasks created from this
	// spec. If not present, the one on cluster default on swarm.Spec will be
	// used, finally falling back to the engine default if not specified.
	LogDriver *Driver `json:",omitempty"`

	// ForceUpdate is a counter that triggers an update even if no relevant
	// parameters have been changed.
	ForceUpdate uint64

	Runtime RuntimeType `json:",omitempty"`
}


嘗試過在 API 中增加:
TaskTemplate.Networks

    {
        \"Name\": \"${service_name}\",
        \"TaskTemplate\": {
            \"ContainerSpec\": {
                \"Image\": \"${service_image_latest}\"
            },
            \"Networks\": [
                {
                    \"Target\": \"xxx\"
                }
            ]
        }
    }

但效果是:
ingress網絡消失,該 service 對外發布的端口消失。

因為,創建 service 時:
docker service create --name t001 --network t001only --publish 22222:80 --detach=true opera443399/whoami:0.7

使用 --network 將關聯到一個網絡 t001only
使用 --publish 將關聯到一個網絡 ingress

因此,實際上有2個網絡。
註1:在反復測試的過程中,出現一個奇怪的現象,,創建 service 時,,容器處於 new 的狀態,無法上線,暫時還未找到原因,因而中止了測試。
註2:或許可以嘗試在更新 service 的過程中,指定 ip 和 port 等信息,待後續測試後再更新本段信息。





    
    
ZYXW、參考
1、API
https://docs.docker.com/engine/api/v1.30

2、moby src
https://github.com/moby/moby/blob/master/api/types/swarm/task.go
https://github.com/moby/moby/blob/master/api/types/swarm/service.go

3、portainer src
https://github.com/portainer/portainer/blob/04ea81e7cd8401690058c4b4264452bf9d7a05eb/app/components/service/serviceController.js


docker深入2-API示例