docker深入2-API示例
阿新 • • 發佈:2017-09-18
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示例