本教程操作环境:linux5.9.8系统、docker-1.13.1版、Dell G3电脑。
一、什么是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的入门,其实你要玩得非常好,这里有很大的灵活性和复杂性,不过这里就需要你一些脚本编程方面的知识了。
推荐学习:《docker视频教程》
以上就是docker api是什么的详细内容,更多请关注Work网其它相关文章!