公有云容器化指南:腾讯云TKE实战与应用
上QQ阅读APP看书,第一时间看更新

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的运用技巧和法则是非常有必要的。