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 条评论
登录 后参与评论

相关文章

来自专栏deed博客

安卓SDK镜像

27740
来自专栏酷玩时刻

CentOS 7更改yum源与更新系统

44620
来自专栏皮振伟的专栏

[kvm][virt]PIO技术分析

前言: 基于KVM的设备虚拟化,就从这里开始吧。 分析: 1,PIO Port IO,所谓端口IO,x86上使用in、out指令进行访问。和内存的地址空间完...

37970
来自专栏企鹅号快讯

在 KubeCon 大会上备受关注的 K8S Helm 到底是什么?

作者:王青,JFrog 中国首席架构师,之前在 IBM,HPE,爱奇艺,新浪,VIPKID 等公司做过研发和架构,是有十多年开发经验的互联网老兵,专注于软件生命...

35980
来自专栏云计算D1net

容器管理必备:掌握工具和技能

当制订容器管理策略时,选择正确的工具只是万里长征迈出了第一步。 那些在云应用开发和应序迁移过程中应用容器技术(例如Docker)的用户很快就会认识到使用容器管理...

361120
来自专栏数据和云

独家:在MAC上运行Docker和Oracle 12.2数据库环境

虽然Docker是那么的流行和热闹,可是没想到我和Docker的第一次接触是因为Oracle。Oracle在上个月宣布支持Docker的容器部署,再加上Orac...

43840
来自专栏大魏分享(微信公众号:david-share)

后容器时代技术制高点:API管理平台3Scale的架构设计与部署

98820
来自专栏IBG JOOX的专栏

JOOX Music & targetversion25 爬坑指南

文章提到的问题都是一点一点慢慢爬出来的,虽然说网上的适配文章很多,但是大部分内容都是相同的,当遇到一些比较偏的问题只能说是自己慢慢爬了,写这篇文章也是为了方便大...

1.6K10
来自专栏云计算

在您的浏览器中构建和共享开发者环境

近年来,我们见证了旨在简化开发者生活的技术的惊人进步。即使有出色的解决方案,创建、配置和共享开发者环境可能是一件非常令人头疼的事。Vagrant + Virtu...

21270
来自专栏皮振伟的专栏

[linux][qemu]PVPanic的实现原理以及应用

在虚拟化场景下,我们尽量会尝试使用带外监控的方式,来发现虚拟机的异常。pvpanic就是一种常见的方式,虚拟化场景的windows蓝屏检查也是基于如此。

22530

扫码关注云+社区

领取腾讯云代金券