专栏首页宝哥的专栏Docker系列学习文章 - docker API基本介绍和使用(十)
原创

Docker系列学习文章 - docker API基本介绍和使用(十)

一、什么是API

1. API具体是什么?

API这个词在维基百科里解释是这样的:应用程序接口(英语:application programming interface,缩写作 API),又称为应用编程接口,就是软件系统不同组成部分衔接的约定。看完这个解释估计你还是有点懵逼,不过没关系,下面我们会用通俗的语言来介绍什么是API。

我们每个人都有手机,当手机没电了我们肯定会找固定的充电器和充电线来充电。苹果的用苹果,安卓的用安卓。但是你肯定不会用安卓的线去充苹果的手机,这道理很简单,因为你的苹果手机是Lightning 接口,安卓的是micro接口。你要想充电或者对你手机传输数据,那么必须买合适的充电线和数据线, 这是对于接口最简单易懂的认识。

类似的,程序的接口也是如此。每个程序都有固定对外的标准接口,这个接口由开发这个程序的开发者定义的,你要想连接它们,那么就应该遵循它们的接口标准。

2. 什么是REST

现在学习API 经常看到一个词叫REST,英文全称是Representational State Transfer。那么什么是REST呢? REST一词是Apache 基金会主席Roy Fielding博士提出来的,中文意思叫"表现层状态转化"。中文不太好理解,不过我们从下面几个方面去认识你就大概能明白什么是rest。

2.1. 什么是表现层?

这里的表现层指的是资源的表现层,所谓"资源",就是网络上的一个具体信息。一个文本,一部电影,一个服务都可以算作一资源。那么这些资源用什么来确定和表现呢?那就得用到URI,比如我们下载一个电影,肯定有对应的URI地址,我们看一部网络小说,也有对应的URI地址。而且这个地址是唯一的,独一无二的。资源用URI标识了,我们可以理解为这个资源已经在网络上“表现”了。所以说到这里,表现层的意思其实就是把"资源"具体呈现出来的形式。

2.2. 什么是状态转化?

常识里,我们要把一物体发生状态改变,肯定需要一些操作和手段。网络上的资源也是如此,你下载一部电影,首先得下载,然后才能打开欣赏。下载获取都需要走HTTP协议,HTTP协议里面,四个基本的操作方式:GET、POST、PUT、DELETE(获取,新建,更新,删除)。通过这基本的四种方法可以对网络上的资源进行一些状态转化操作。

所以,REST 就是表现层的状态转化,大家分开理解上面两点然后结合在一起就明白了。简单粗暴的可以理解为:方法 + URI资源。

GET /movie/war/珍珠港

DELETE /movie/war/珍珠港

...

二、Docker API种类

docker 的api也遵循rest的风格,因此我们了解了上面两点后,我们开始学习docker本身api的相关知识。

首先,我们把docker当作一种资源,我们可以通过api来对docker进行操作,操作的方法也是http的那几种方法。

其次,我们要了解docker有哪些对外可使用的api,这里docker官方主要有三大对外api

  • Docker Registry API
  • Docker Hub API
  • Docker Remote API

1. Docker Registry API

这个是docker镜像仓库的api,通过操作这套API,你可以自由的自动化、程序化的管理你的镜像仓库。

2. Docker Hub API

Docker Hub API是用户管理操作的API,docker hub是使用校验和公共 namespaces 的方式来存储账户信息、认证账户、进行账户授权。API同时也允许操作相关的用户仓库和 library 仓库。

3. Docker Remote API

这套API用于控制主机 Docker 服务端的 API,等价于 docker命令行客户端。 有了它,你能远程操作docker容器,更重要的是你可以通过程序自动化运维docker进程。

三、API使用前准备

前面我们说过,操作rest api用的就是http的那些方法。那么具体怎么使用这些方法呢?这里我们提供几种通用的方式来操作调用下docker 的API,然后体验下。在体验之前,我们需要开启docker rest api,不然没开启,你是不能用的。具体开启的方法:

$ vim /usr/lib/systemd/system/docker.service

在 ExecStart=/usr/bin/dockerd 后面直接添加 -H tcp://0.0.0.0:8088 -H unix:///var/run/docker.sock (注意端口8088自己随便定义,别跟当前的冲突即可)

$ systemctl daemon-reload
$ systemctl restart docker

重启完成后,我们执行 curl 127.0.0.1:8088/info | python -mjson.tool 命令即可查看docker的状态状态(json形式,python -mjson.tool借用了这个工具,这样让json格式化,好阅读)

启用了docker API后,我们还有个问题,那就是在哪查询docker 现有的API?既然docker提供了那3大API库:Docker Registry API、Docker Hub API、Docker Remote API。那么在哪里可以查看具体详细的API,比如Docker Registry API 下面到底有哪些API地址?有查询镜像的API吗?有删除的吗?其实这些都有的,我们可以直接去官网API手册里查看即可,地址就是:https://docs.docker.com/engine/api/v1.38/ (想看什么版本的把最后的v1.38 替换成目标版本号即可)

这里要注意的是,官方不再建议使用API v1.12之前的版本,建议使用v1.24 or 更高的版本。

查看本地docker API版本可以用 docker version 命令:

四、如何操作docker API

1. 最简单的curl方式

CURL这个命令,我想大家都熟悉,默认linux下都自带安装。很多测试http的方法都可以直接使用 CURL的方式。

比如我们查看docker的images详细信息,就可以直接用curl 来调取:

 $ curl -X GET http://127.0.0.1:8088/images/json

这样显示会比较错乱无章,我们可以在命令后面加个 python -mjson.tool 格式化下

$  curl -X GET http://127.0.0.1:8088/images/json | python -mjson.tool

这样的结果格式就比较标准化,比较容易阅读。

查看所有containers容器:

$ curl -X GET http://127.0.0.1:8088/containers/json | python -mjson.tool

创建一个containers容器:

这里创建一个mariadb数据库的容器,设置了密码是123456,监听端口是3306

$ curl -X POST -H "Content-Type: application/json" -d '{
    "Image": "mariadb",
    "Env": ["MYSQL_ROOT_PASSWORD=123456"],
    "ExposedPorts": {
        "3306/tcp": {}
    },
    "HostConfig": {
        "PortBindings": {
            "3306/tcp": [{"HostIp": "","HostPort": "3306"}]
        }
    },
    "NetworkSettings": {
        "Ports": {
            "5000/tcp": [{"HostIp": "0.0.0.0","HostPort": "3306"}]
        }
    }
}' http://127.0.0.1:8088/containers/create

启动/停止/重启 一个containers容器:

$ curl -X POST http://127.0.0.1:8088/containers/{id}/start   (注意这里是POST方法)
$ curl -X POST http://127.0.0.1:8088/containers/{id}/stop   (注意这里是POST方法)
$ curl -X POST http://127.0.0.1:8088/containers/{id}/restart   (注意这里是POST方法)
...

具体还有很多API方法,大家都可以登录上面提到的链接进行查看

https://docs.docker.com/engine/api/v1.38

2. python程序脚本方式

python 非常强大,这个大家都认可。现在很多自动化场景都是通过python加载第三方对应的库,然后编写业务逻辑自动化方式devops运维。docker给python也提供了一个非常强大的库,名字就叫做docker。我们可以登录官方的python sdk地址来学习认识python如何具体操作docker。

地址是:https://docker-py.readthedocs.io/en/stable/

2.1. 安装docker python库

$ pip install docker

2.2. 开始使用

import docker
client = docker.DockerClient(base_url='unix://var/run/docker.sock', version="auto")
client.containers.run("ubuntu", "echo hello world")

这是一个很简单的使用例子,我们可以分析下:

第一行表示引入第三方库docker。

第二行用于配置Docker服务端的基本信息,包含了base_url(Docker服务端的地址)以及version(auto可以自动检查docker的版本)。

第三行则是相当于运行了一个docker run ubuntu echo hello world的命令。

2.3. 进阶使用

import docker
client = docker.DockerClient(base_url="tcp://ip:port")
client.images.list()       # 类似docker images命令,显示image的信息列表
client.containers.list()       #  类似docker ps命令
client.containers.list(all=True)       # 类似docker ps -a命令
container = client.containers.get(container_id)           # 获取daodocker容器,这里container_id 是你要输入的具体容器id
container.start()            # 类似docker start 传入具体的容器id ,开启容器

总结: 现在很多企业都已经步入自动化运维时代了,所以掌握api的运用技巧和法则是非常有必要的。上面我们大概介绍了下docker api的入门,其实你要玩得非常好,这里有很大的灵活性和复杂性,不过这里就需要你一些脚本编程方面的知识了。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker系列学习文章 - 如何安装Docker(三)

    | 导语 前面介绍了关于容器和docker的知识,那么从这篇文章开始,正式进入实操,带大家手把手安装docker环境。

    宝哥@devops运维
  • Docker系列学习文章 - 镜像仓库的介绍(七)

    | 导语 前面我们讲了镜像的制作,知道了镜像是怎么生成的。但是镜像制作好了后,要怎么管理?他们存在哪里。通过本篇文章的讲解,大家就清楚了。

    宝哥@devops运维
  • Docker系列学习文章 - 什么是docker?(二)

    | 导语 前面我们介绍了什么是容器,那么这篇文章我们继续跟大家讲解什么是docker。 docker是目前最火的LXC高级容器引擎,docker到现在几乎是容器...

    宝哥@devops运维
  • 『高级篇』docker之DockerSwarm微服务部署(30)

    PS:有详细看看官网的文档,里面有非常多样化的配置,我相信基本可以满足大家的需求。到这样docker swarm 也就学完了,相信有个整体的认识吧。另外要说下有...

    IT故事会
  • docker pull 下载加速-2018

    使用docker pull,命令下载镜像太慢了,默认是从国外的,本文记录下如何配置国内阿里云竞相加速方式。文档力求简单.

    致码DevOps
  • 『高级篇』docker之DockerSwarm的集群环境搭建(28)

    PS:以上就完成高可用的docker swarm的集群环境,其实真心比其他的简单。

    IT故事会
  • Kubernetes之容器数据写满磁盘解决方法

    上面步骤操作完后(上面清理日志方法,可能对于收集日志程序会丢失一些日志,但一般情况能接受),可以选择驱赶节点上所有pod(kubectl drain ${nod...

    YP小站
  • 从零构建Sentry v10 进行异常上报

    Sentry 是一个开源的实时错误追踪系统,可以帮助开发者实时监控并修复异常问题。它主要专注于持续集成、提高效率并且提升用户体验。

    w候人兮猗
  • 安全基线检查平台

    最近在做安全基线检查相关的,网上有一些代码比较零散;也有一些比较完整的项目,比如owasp中的安全基线检查项目,但是收费;还有一些开源且完整的,比如lynis,...

    FB客服
  • [多图] DevOps 也要懂点 Excel

    本文涉及一些简单的 Excel 的操作,效果拔群 ---- 步骤: 获取 Docker 版本,并生成一个 csv 文件 导入 CSV 到 Excel 并简单清洗...

    临书

扫码关注云+社区

领取腾讯云代金券