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

一、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守护进程的默认配置文件

  • 不同系统中,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安装在桌面版ubuntu的时候,默认的配置文件/etc/default/docker里的配置是无效的(server版并无问题),导致之前的很多工作进展缓慢,这个问题在官方文档中有出现

访问Docker API

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

远程访问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

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

  • 备注:
    • 前面还有一个-H选项,这个选项是让守护进程监听在默认的域套接字上
    • Docker允许守护进程监听在多个端口上,因此我们在后面又添加了一个-H,让其监听在tcp端口上
  • 首先重启Docker服务,然后再重启Docker守护进程
sudo systemctl daemon-reload

sudo service docker restart

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

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

 

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

客户端使用的DOCKER_HOST环境变量

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

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

  • 备注:与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

四、通过API管理Docker镜像

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

  • 想要获取Docker的镜像列表,可以输入下面的命令,结果如下所示:
    • 结果返回了当前Docker的所有镜像,并且信息都比较详细
    • 它们返回的结果与docker images命令非常类似
curl http://111.229.177.161:2375/images/json | python -mjson.tool

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

  • 我们也可以来查看指定的镜像的信息。例如:
    • 我们有一个容器的ID为:sha256:b27cd543106093a0f843c7689b4a7cb6e1454695a24093e3a0c2a76d691002fe
    • 下面我们来查看指定的镜像,就可以使用下面的命令
curl http://111.229.177.161:2375/images/sha256:b27cd543106093a0f843c7689b4a7cb6e1454695a24093e3a0c2a76d691002fe/json | python -mjson.tool

  • 可以看到,这种做法与用"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

五、通过API管理Docker容器

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

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

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

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

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

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

创建容器(/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"}'

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

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

  • 备注:当然,我们可以在创建容器时指定更多的信息,例如下面添加了一个容器的主机名
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 1.24版本被改了,百度搜索别的方法吧

六、改进TProv应用

七、对Docker Remote API进行认证


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

<p> <strong><span style="font-size:20px;color:#FF0000;">本课程主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者</span></strong> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">1. 包含:<span style="color:#FFFF00;background-color:#FF0000;">项目源码</span><span style="color:#FFFF00;background-color:#FF0000;">项目文档数据库脚本软件工具</span>等所有资料</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">2. 手把手的带你从零开始部署运行本套系统</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">3. 该项目附带的源码资料可作为毕设使用</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">4. 提供技术答疑和远程协助指导</span></strong></span><strong><span style="font-size:18px;"></span></strong> </p> <p> <br /> </p> <p> <span style="font-size:18px;"><strong>项目运行截图:</strong></span> </p> <p> <strong><span style="font-size:18px;">1系统登陆界面</span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241015433522.png" alt="" /><br /> </span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">2学生模块</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241015575966.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">3教师模块</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016127898.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">4系统管理员</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016281177.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016369884.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><br /> </span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">更多Java毕设项目请关注我的毕设系列课程 <a href="https://edu.csdn.net/lecturer/2104">https://edu.csdn.net/lecturer/2104</a></span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><br /> </span></strong> </p>
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页