一、Docker API简介


  • 在Docker生态系统中一共有3种API:

  • Registry API:提供了与来存储Docker镜像的Docker Registry继承的功能
  • Docker Hub API:提供了与Docker Hub继承的功能
  • Docker Remote API:提供与Docker守护进程集成的功能

  • 这3种API都是RESTful风格的
  • 本文我们主要介绍Remote API,因为它是通过程序与Docker进行继承和交互的核心内容

二、初识Remote API

  • Remote API是由Docker守护进程提供的

守护进程的默认套接字

  • 默认的情况下,Docker守护进程会绑定到一个所在宿主机的套接字,即unix:///var/run/docker.sock

Docker API(Registry API、Docker Hub API、Docker Remote API)_守护进程

Docker守护进程的默认配置文件


  • 不同系统中,Docker守护进程的默认配置文件为:

  • Ubuntu、Debian系统:/etc/default/docker
  • Upstart系统:/etc/init/docker.conf
  • Red Hat、Redora系统:/etc/sysconfig/docker
  • 对于那些使用了Systemd的发布版本:/usr/lib/systemd/docker.service

  • 我的机器是ubuntu16,查看如下:

sudo vim /etc/default/docker

Docker API(Registry API、Docker Hub API、Docker Remote API)_Docker教程_02

  • 备注(重点):docker安装在桌面版ubuntu的时候,默认的配置文件/etc/default/docker里的配置是无效的(server版并无问题),导致之前的很多工作进展缓慢,这个问题在官方文档中有出现

访问Docker API

  • 我们可以输入下面的命令来模仿一个客户端,来访问Docker守护进程
echo -e "GET /info HTTP/1.0\r\n" | sudo nc -U /var/run/docker.sock

Docker API(Registry API、Docker Hub API、Docker Remote API)_守护进程_03

远程访问Remote API(改变守护进程监听地址)


  • 上面我们说了,守护进程默认绑定到unix:///var/run/docker.sock域套接字上,那么我们只能在本地来访问这个守护进程
  • 如果我们想要让远程来访问我们主机的Remote API,那么就需要将Docker守护进程绑定到一个网络接口上
  • 修改方法:修改配置文件,见下面演示案例

接口更改演示案例


  • 下面我们使用的是桌面版本的ubuntu系统,因此/etc/default/docker配置文件不生效(但是server版本不会出现这种情况)
  • 在这种情况下我们需要修改/lib/systemd/system/docker.service文件中的ExecStart选项,默认的情况如下

sudo vim /lib/systemd/system/docker.service

Docker API(Registry API、Docker Hub API、Docker Remote API)_json_04

  • 下面我们修改ExecStart选项,在尾部添加如下的内容,让其监听在0.0.0.0:2375地址上

Docker API(Registry API、Docker Hub API、Docker Remote API)_json_05


  • 备注:

  • 前面还有一个-H选项,这个选项是让守护进程监听在默认的域套接字上
  • Docker允许守护进程监听在多个端口上,因此我们在后面又添加了一个-H,让其监听在tcp端口上

  • 首先重启Docker服务,然后再重启Docker守护进程

sudo systemctl daemon-reload

sudo service docker restart

Docker API(Registry API、Docker Hub API、Docker Remote API)_Docker教程_06

  • 查看一下守护进程的状态,可以看到守护进程监听在两个端口上
sudo service docker status

Docker API(Registry API、Docker Hub API、Docker Remote API)_docker_07

  •  现在我们既可以使用当初的域套接字来访问Docker(本地访问)
sudo docker -H unix:///var/run/docker.sock info

 Docker API(Registry API、Docker Hub API、Docker Remote API)_docker_08

  • 也可以使用公开的tcp服务来访问Docker(用于外网访问)
sudo docker -H 111.229.177.161:2375 info

Docker API(Registry API、Docker Hub API、Docker Remote API)_Docker教程_09

客户端使用的DOCKER_HOST环境变量


  • 上面我们看到了,客户端访问Docker时都需要使用-H来指定Docker的地址,比较麻烦
  • Docker提供了DOCKER_HOST环境变量,设置之后客户端就会去访问DCOERK_HOST环境变量所设置的Docker,不需要每次执行命令时都要-H选项了
  • 例如,下面将DOCKER_HOST设置为我们上面指定的Docker服务地址

export DOCKER_HOST="tcp://111.229.177.161:2375"

Docker API(Registry API、Docker Hub API、Docker Remote API)_Docker教程_10

  • 现在我们就不需要再使用使用-H去访问Docker守护进程了
sudo docker info

Docker API(Registry API、Docker Hub API、Docker Remote API)_docker_11

  • 备注:与Docker守护进程之间的网络连接是没有经过认证的,是对外开放的。本文后面会介绍如何为网络连接加入认证功能

三、测试Docker Remote API


  • 下面我们开始使用Docker的一些API来对Docker进行测试操作
  • 下面我们都以curl命令来连接到Docker守护进程获取信息
  • 例如,我们还是获取Docker的信息,命令如下:

  • Docker给我返回了Docker的信息,这些信息都是以JSON格式返回的
  • 另外,由于默认的情况下,Docker返回的JSON数据都是非常乱的,因此我们在最后使用了Python的格式化工具对结果进行了格式化处理,看起来比较整洁(文本下面都会使用这个工具命令)


curl http://111.229.177.161:2375/info | python -mjson.tool

Docker API(Registry API、Docker Hub API、Docker Remote API)_守护进程_12

四、通过API管理Docker镜像

获取镜像列表(/images/json)

  • 想要获取Docker的镜像列表,可以输入下面的命令,结果如下所示:

  • 结果返回了当前Docker的所有镜像,并且信息都比较详细
  • 它们返回的结果与docker images命令非常类似

curl http://111.229.177.161:2375/images/json | python -mjson.tool

Docker API(Registry API、Docker Hub API、Docker Remote API)_json_13

查看指定的镜像的信息(/images/ID/json)

  • 我们也可以来查看指定的镜像的信息。例如:

  • 我们有一个容器的ID为:sha256:b27cd543106093a0f843c7689b4a7cb6e1454695a24093e3a0c2a76d691002fe
  • 下面我们来查看指定的镜像,就可以使用下面的命令

curl http://111.229.177.161:2375/images/sha256:b27cd543106093a0f843c7689b4a7cb6e1454695a24093e3a0c2a76d691002fe/json | python -mjson.tool

Docker API(Registry API、Docker Hub API、Docker Remote API)_Docker教程_14

  • 可以看到,这种做法与用"docker inspect"命令来查看某一镜像的信息是十分类似的

搜索镜像(/images/search?term=xxx)


  • 还可以使用Docker API从Docker Hub上搜索指定的镜像
  • 例如,下面从Docker Hub上搜索镜像名字中带"jamtur01"的所有镜像

curl "http://111.229.177.161:2375/images/search?term=jamtur01" | python -mjson.tool

Docker API(Registry API、Docker Hub API、Docker Remote API)_docker_15

五、通过API管理Docker容器

查看所有的容器(/containers/json?all=1)

  • 例如当前我们的系统中有这些容器
sudo docker ps -a

Docker API(Registry API、Docker Hub API、Docker Remote API)_守护进程_16

  • 可以输入下面的命令来查看所有的容器(不论是否在运行)
curl http://111.229.177.161:2375/containers/json?all=1 | python -mjson.tool

Docker API(Registry API、Docker Hub API、Docker Remote API)_json_17

列出正在运行的容器(/containers/json)

  • 例如当前系统中运行着一个Docker容器
sudo docker ps

Docker API(Registry API、Docker Hub API、Docker Remote API)_Docker教程_18

  • 可以输入下面的命令来查看当前系统中运行的容器,可以看到只有一个
curl http://111.229.177.161:2375/containers/json | python -mjson.tool

Docker API(Registry API、Docker Hub API、Docker Remote API)_守护进程_19

创建容器(/containers/create)

  • 我们可以输入下面的命来创建一个容器。命令如下:

  • 我们使用了POST请求调用了/containers/create接入点来创建容器
  • POST了一个JSON散列数据,其中Images指定了要创建的容器的名称
  • 创建完成之后命令会返回创建的容器的ID(8363b03a1994c2c9783282c32d1c8b98cb5cf8aa67b9014ee750ea7833aec4ce")以及可能的警告信息

curl -X POST -H "Content-Type:application/json" http://111.229.177.161:2375/containers/create -d '{ "Image":"redis:latest"}'

Docker API(Registry API、Docker Hub API、Docker Remote API)_Docker教程_20

  • 来查看我们新创建的容器,可以看到ID与上面.的一致
curl http://111.229.177.161:2375/containers/json?all=1 | python -mjson.tool

Docker API(Registry API、Docker Hub API、Docker Remote API)_守护进程_21

  • 通过下面的命令也可以看到新创建的容器
sudo docker ps -a

Docker API(Registry API、Docker Hub API、Docker Remote API)_json_22

  • 备注:当然,我们可以在创建容器时指定更多的信息,例如下面添加了一个容器的主机名
curl -X POST -H "Content-Type:application/json" http://111.229.177.161:2375/containers/create -d '{ "Image":"redis:latest","Hostname":"dongshao"}'

启动容器(/containers/ID/start)

  • 例如,我们可以输入下面的命令来启动上面我们创建的容器
curl -X POST -H "Content-Type:application/json" http://111.229.177.161:2375/containers/8363b03a1994c2c9783282c32d1c8b98cb5cf8aa67b9014ee750ea7833aec4ce/start -d '{ "PublishAllPorts":true}'

Docker API(Registry API、Docker Hub API、Docker Remote API)_json_23

  • 上面启动失败了,提示什么请求体,似乎在Docker 1.24版本被改了,百度搜索别的方法吧

六、改进TProv应用


  • 在前面一篇文章中:使用到了TProv
  • 待续,前面文章有错误,以后更新

七、对Docker Remote API进行认证

  • 见下一篇文章

  • 我是小董,V公众点击"笔记白嫖"解锁更多【Docker】资料内容。

Docker API(Registry API、Docker Hub API、Docker Remote API)_守护进程_24