1.10 Docker API的基本介绍和使用方式
在IT自动化盛行的今天,要想让运维工作更加高效,必须了解API,为我们后续做二次开发和封装打下基础。
1.10.1 什么是API
1.API是什么
API这个词在维基百科中的解释是这样的:应用程序接口(Application Programming Interface),又称为应用编程接口,是衔接软件系统不同组成部分的约定。看完这个解释可能还是有点迷惑,没关系,下面我们通过一个例子来介绍什么是API。
手机没电了,我们需要找充电器来充电,但是我们肯定不会用安卓的充电器去为苹果手机充电,因为苹果手机是Lightning接口,安卓手机是micro接口。这就是对接口最直接的解释。
程序的接口也是如此。每个程序都有固定的接口标准,这个接口由程序的开发者定义,想要连接它们,就要遵循它们的接口标准。
2.REST是什么
学习API时我们经常会看到一个词REST(Representational State Transfer),这个词是Apache基金会主席Roy Fielding博士提出来的,可译为“表现层状态转化”。我们从下面几个方面来具体了解它。
(1)表现层
这里的表现层指的是资源的表现层。所谓资源,就是网络上的信息,一个文本、一部电影、一个服务都可以算作一个资源。这些资源用URI来确定和表现,比如我们下载一部电影,肯定有对应的URI地址;我们看一部网络小说,也有对应的URI地址。这个URI地址是唯一的,是独一无二的。资源通过URI标识,我们可以理解为这个资源已经“表现”在网络上了。所以说回这里,表现层的意思就是把资源具体呈现出来的形式。
(2)状态转化
要改变一个物体的状态,肯定需要经过一些操作和手段。网络上的资源也是如此,我们从网络下载一部电影资源,下载和获取操作都需要遵循HTTP协议,HTTP协议包括4个基本的操作方式:获取(GET)、新建(POST)、更新(PUT)和删除(DELETE)。通过这4种操作可以对网络上的资源进行状态转化。
1.10.2 Docker API的种类
Docker API也遵循REST风格,我们了解了表现层和状态转化后,就可以开始学习Docker API的相关知识了。
首先,我们把Docker当作一种资源,通过API可以对Docker进行操作,操作的方法同HTTP协议。
其次,我们要了解Docker有哪些对外可使用的API,这里Docker官方主要有三大对外API。
1.Docker Registry API
这是Docker镜像仓库的API,通过操作这套API,可以自由地管理镜像仓库。
2.Docker Hub API
Docker Hub API是用户管理操作的API,Docker Hub使用校验和公共命名空间的方式来存储账户信息、认证账户和账户授权。API同时也允许操作相关的用户仓库和library仓库。
3.Docker Remote API
这套API用于控制主机Docker服务端的API,等价于Docker命令行客户端。有了它,我们就能远程操作Docker容器,更重要的是我们可以通过程序自动化运维Docker进程。
1.10.3 API使用前的准备
前面我们说过,操作REST API用的就是HTTP的4种方法。那么具体怎么使用这些方法呢?这里我们提供几种通用的操作方式来调用Docker API。在体验之前,我们需要开启Docker REST API,开启方法如下所示。
图1-70 查看本地Docker API版本
$ vim /usr/lib/systemd/system/docker.service -H tcp://0.0.0.0:8088 -H unix:///var/run/docker.sock # 在ExecStart=/usr/bin/dockerd后面直接添加,注意端口8088是自定义的,不和当前的冲突即可
接着重启Docker服务。
$ 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以及详细的API地址呢?有查询镜像的API吗?有删除镜像的API吗?
我们可以通过API官方手册查看API(https://docs.docker.com/engine/api/v1.38/),把最后的v1.38替换成目标版本号即可。
这里要注意的是,官方不建议使用API v1.12之前的版本,建议使用v1.24或更高版本的API。
执行docker version命令可以查看本地Docker API版本,如图1-70所示。
1.10.4 操作Docker API
1.curl方式
curl命令是最简单的操作Docker API的方式。
$ 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
这样返回的结果格式就比较标准了,也便于阅读,如图1-71所示。
图1-71 curl请求Docker API
查看所有容器的命令如下所示。
$ curl -X GET http://127.0.0.1:8088/containers/json | python -mjson.tool
这里创建一个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
启动/停止/重启一个容器的命令如下所示。(注意这里是POST方法。)
$ curl -X POST http://127.0.0.1:8088/containers/{id}/start $ curl -X POST http://127.0.0.1:8088/containers/{id}/stop $ curl -X POST http://127.0.0.1:8088/containers/{id}/restart
2.Python程序脚本方式
Python语言非常强大,现在很多自动化场景都是通过Python加载第三方库,并用Python编写业务逻辑实现自动化运维的。Docker给Python也提供了一个非常强大的库,名字就叫作Docker。我们可以登录官方的Python SDK地址学习Python如何具体操作Docker:https://docker-py.readthedocs.io/en/stable/。
首先安装Docker Python库。
$ pip install docker
开始使用Docker Python库,代码如下。
import docker client = docker.dockerClient(base_url='unix://var/run/docker.sock', version="auto") client.containers.run("ubuntu", "echo hello world")
这是一个很简单的使用例子,分析如下。
1)第一行代码表示引入第三方库Docker。
2)第二行代码配置Docker服务端的基本信息,包含了base_url(Docker服务端的地址)以及版本(version,auto可以自动检查Docker的版本)。
3)第三行代码相当于执行docker run ubuntu echo hello world命令。
更复杂一点儿的例子如下。
import docker client = docker.dockerClient(base_url="tcp://ip:port") client.images.list() # 类似docker images命令,显示镜像的信息列表 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,开启容器
本节我们介绍了Docker API的入门知识,要想完全掌握Docker API的使用,还需要具备一些编程知识。现在很多企业都已经步入自动化运维甚至智能运维时代,所以掌握API的运用技巧和法则是非常有必要的。