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
时间: 2024-09-30 17:06:23

docker深入2-API示例的相关文章

融云IM 基础服务开发指南WebIMLib API 示例 【干货】

Web SDK API 示例 简介 融云 Web SDK API 用法及常见异常总结,为了方便刚接触融云 Web SDK 开发者朋友们写下此文档,希望可以帮到你们. 说明: 1.函数参数中使用 [] 为可选参数(数组除外). 2.**** => **** 在本文档中表示为示例代码和结果,例:1+2 => 3. 初始化 初始化 SDK 执行初始化需要在开发者后台新建应用得到 AppKey 和 token,初始化代码: RongIMLib.RongIMClient.init(appkey,[dat

java8 - 新的时间日期API示例

Java 8之前的库对时间和日期的支持非常不理想,不用担心,在Java 8中引入全新的时间和日期API,并且都是线程安全的 新时间日期API常用对象介绍 LocalDate: 表示没有时区的日期, LocalDate是不可变且线程安全 LocalTime: 表示没有时区的时间, LocalTime是不可变且线程安全 LocalDateTime: 表示没有时区的日期时间, LocalDateTime是不可变且线程安全 ZoneId: 时区ID,用来确定Instant和LocalDateTime互相

Debian 下docker 开启远程api失败

系统版本: Debian 8.3 问题: Debian下增加dcoker的远程api,始终不能打开网络端口. 过程: 修改/etc/default/docker 增加一行 DOCKER_OPTS="-H 0.0.0.0:2376 -H unix:///var/run/docker.sock" 重启docker: service docker restart 查看端口是否打开: lsof -i:2376  没有任何返回. 查看日志: Mar 28 12:44:32 docker1 doc

[Liferay6.2]Liferay Dynamic Query API示例

介绍 Liferay提供了几种方法定义复杂的查询用来检索数据库中的数据. 通常情况下,在每个service Entity中,通过定义一些'finder'方法,可以便捷地满足基本的数据查询操作. 但是,有时候我们可能会遇到以下几种finder查询并不能满足的情况: 过于复杂的查询,例如子查询 需要实现一些聚合操作,像min.max.avg等 想得到复合对象或元组而不是映射的对象类型 查询优化 复杂的数据访问,像报表等 要实现这个目的,就需要通过Liferay提供的Hibernate的Dynamic

Docker基础入门及示例

Docker近几年的发展可谓一日千里,特别从是2013年随着一个基于LXC的高级容器引擎开源,到现在,其在linux和windows上都有了很好的支持,并且已经有很多公司将docker用于实际的生产环境部署当中.这篇文章我将针对以下几个方面简单介绍: 1. docker的基础介绍 2. docker在windows下的安装配置 3. 基础命令介绍 4. 使用vs2017在docker下调试 5. 打包一个.net core站点镜像 一. docker基础介绍 可能很多朋友对docker还停留在听

docker 开启remote api

docker官方文档上有相关说明(Configure and run Docker on various distributions),ubuntu上是可行的 sudo vi /etc/default/docker DOCKER_OPTS="-H tcp://0.0.0.0:2375" 参考一 Ubuntu14.04使用参考一推荐的方法开启remote api没有成功 参考二 使用参考二的方法开启remote api成功了

Docker 之web api 访问 host sql server

运行 Docker C:\Users\Administrator>docker run -it  -p 5000:5000 --name myapidocker1 webapiv1 [email protected]:/# dir bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var C:\Users\Administrator>d

Docker开启Remote API 访问 2375端口

Docker常见端口 我看到的常见docker端口包括: 2375:未加密的docker socket,远程root无密码访问主机2376:tls加密套接字,很可能这是您的CI服务器4243端口作为https 443端口的修改2377:群集模式套接字,适用于群集管理器,不适用于docker客户端5000:docker注册服务4789和7946:覆盖网络 开启配置 方法一 首先是怎么配置远程访问的API: sudo vim /etc/default/docker 加入下面一行 DOCKER_OPT

企业号微信支付 公众号支付 H5调起支付API示例代码 JSSDK C# .NET

先看效果: 1.本文演示的是微信[企业号]的H5页面微信支付 2.本项目基于开源微信框架WeiXinMPSDK开发:https://github.com/JeffreySu/WeiXinMPSDK 感谢作者苏志巍的开源精神 一.准备部分 相关参数: AppId:公众号的唯一标识(登陆微信企业号后台 - 设置 - 账号信息 - CorpID) AppSecret:(微信企业号后台 - 设置 - 权限管理 - 新建一个拥有所有应用权限的普通管理组 - Secret) Key:商户API密钥(登陆微信

hadoop: hdfs API示例

利用hdfs的api,可以实现向hdfs的文件.目录读写,利用这一套API可以设计一个简易的山寨版云盘,见下图: 为了方便操作,将常用的文件读写操作封装了一个工具类: 1 package yjmyzz; 2 3 import org.apache.hadoop.conf.Configuration; 4 import org.apache.hadoop.fs.FSDataOutputStream; 5 import org.apache.hadoop.fs.FileSystem; 6 impor