一、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应用
- 在前面一篇文章中:使用到了TProv
- 待续,前面文章有错误,以后更新
七、对Docker Remote API进行认证
- 见下一篇文章
- 我是小董,V公众点击"笔记白嫖"解锁更多【Docker】资料内容。