Docker新手入门之八:Docker API详解

转载过程中,图片丢失,代码显示错乱。

为了更好的学习内容,请访问原创版本:

https://www.missshi.cn/api/view/blog/5a63285f0a745f6335000008

Ps:初次访问由于js文件较大,请耐心等候(5s左右)

 

 

Docker本身提供了强大的API功能。

我们可以通过访问Docker API来对Docker服务进行管理。

在本章中,我们将会学习如何使用Docker API以及在Python中如何更加高效的使用Docker API。

Docker API

在Docker的生态系统中,存在下列三种API:

  1. Reistry API:与存储Docker镜像的Registry相关的功能。
  2. Docker Hub API:与Docker Hub相关的功能
  3. Docker Remote API:与Docker守护进程相关的功能。

其中,Docker Remote API是使用最为频繁的API类型,后续我们也将针对此类API展开讲解。

启动Remote API

Remote API主要用于远程访问Docker守护进程从而下达指令的。 
因此,我们在启动Docker守护进程时,需要添加-H参数并指定开启的访问端口。 
通常,我们可以通过编辑守护进程的配置文件来实现。 
不过对于不同操作系统而言,守护进程启动的配置文件也不尽相同:

  • Ubuntu系统:/etc/default/docker文件
  • Centos系统:/etc/sysconfig/docker文件

在该配置文件最后,添加内容如下:

 
  
  1. OPTIONS='-H=tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock'

修改完成后执行如下命令,重启Docker守护进程:

 
  
  1. systemctl stop docker
  2. systemctl start docker

此时,我们可以在其他机器上执行如下命令来测试一下:

 
  
  1. docker -H example.com:2375 info

Docker新手入门之八:Docker API详解_第1张图片

测试Remote API

上面的试验中,我们已经确认了与Docker守护进程之间的连通性。 
下面,我们来使用一些Remote API。

 
  
  1. curl http://example.com:2375/info

从返回结果看,我们可以得到类似的docker info时的JSON格式的数据。

通过API管理Docker镜像

调用/images/json接口可以获取镜像列表:

 
  
  1. curl http://example.com:2375/images/json | python -mjson.tool

Docker新手入门之八:Docker API详解_第2张图片 
Ps:通过python -mjson.tool可以将JSON数据格式化显示。

通过API管理Docker容器

调用/containers/json接口可以获取正在运行中的容器列表:

 
  
  1. curl http://example.com:2375/containers/json | python -mjson.tool

Docker新手入门之八:Docker API详解_第3张图片 
如果想要查询全部的容器(包含不是正在运行的容器)时,可以调用如下接口:

 
  
  1. curl http://example.com:2375/containers/json?all=1 | python -mjson.tool

此外,我们还可以使用/containers/create以及/containers/start来创建和启动容器,从而实现docker run的功能。 
但是在此处,我们并不对其进行展开描述。因为在本文后续内容中,会详细描述如果利用Python来调用Remote API,这种方式则更加方便和强大。

对Docker Remote API进行认证

之前我们已经学到了可以通过Docker Remote API来控制Docker服务。 
但是,细心的同学应该已经发现了,在连接的过程中并没有认证机制。 
也就是说任何人只要知道了Docker API的地址和端口都可以用于控制Docker服务,而这样则大大增加了服务的风险。 
接下来,我们将会学习如何给Docker Remote API添加认证机制。

创建所需的CA证书

 
  
  1. cd /etc/docker
  2. openssl genrsa -aes256 -out ca-key.pem 4096
  3. # 设置证书密码

完成该步骤后,我们创建了一个ca-key.pem文件。这个文件就是我们的CA密钥。 
下面,我们需要继续创建我们的CA证书。

 
  
  1. openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pem
  2. # 输入一系列相关信息,可省略部分直接输入.
  3. # 国家:CN
  4. # 省:.
  5. # 市:.
  6. # 公司:.
  7. # 组织:.
  8. # Common Name:网站地址
  9. # Email Address:.

创建服务端证书、签名请求和密钥

 
  
  1. # 创建证书
  2. openssl genrsa -out server-key.pem 4096
  3. # 设置证书密码
  4. # 创建签名
  5. openssl req -sha256 -new -key server-key.pem -out server.csr
  6. # 输入一系列相关信息,可省略部分直接输入.
  7. # 国家:CN
  8. # 省:.
  9. # 市:.
  10. # 公司:.
  11. # 组织:.
  12. # Common Name:*
  13. # Email Address:.
  14. # 生成服务器证书
  15. openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem

修改Docker守护进程配置文件

在启动参数OPTIONS中添加如下内容:

 
  
  1. -H=tcp://0.0.0.0:2376 # 修改端口号为2376
  2. -H=unix:///var/run/docker.sock
  3. --tlsverify
  4. --tlscacert=/etc/docker/ca.pem
  5. --tlscert=/etc/docker/server-cert.pem
  6. --tlskey=/etc/docker/server-key.pem

修改完成后重启Docker守护进程:

 
  
  1. systemctl stop docker && systemctl start docker

创建客户端证书和密钥

 
  
  1. # 创建证书
  2. openssl genrsa -out key.pem 4096
  3. # 设置证书密码
  4. # 创建签名
  5. openssl req -new -key key.pem -out client.csr
  6. # 输入一系列相关信息,可省略部分直接输入.
  7. # 国家:CN
  8. # 省:.
  9. # 市:.
  10. # 公司:.
  11. # 组织:.
  12. # Common Name:*
  13. # Email Address:.
  14. # 生成服务器证书
  15. openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem
  16. # 删除无效文件并最小化权限
  17. rm -v client.csr server.csr
  18. chmod -v 0400 ca-key.pem key.pem server-key.pem
  19. chmod -v 0444 ca.pem server-cert.pem cert.pem

配置Docker客户端使用证书

ca.pemclient-cert.pem以及client-key.pem这三个文件复制到`~/.docker/文件夹下即可,因为默认在会该文件夹下寻找证书。

 
  
  1. cp ca.pem ~/.docker
  2. cp cert.pem ~/.docker
  3. cp key.pem ~/.docker

下面,我们来测试一下:

 
  
  1. curl https://example.com:2376/info --cert ./cert.pem --key ./key.pem -k

如果能够正常显示结果,表示配置完成,一切正常了!

Python调用Docker API

对于原生Docker Remote API而言,虽然功能很强大,但是使用起来并不是十分的方便。 
为了简化Docker Remote API的使用,Python针对Docker API进行了封装,提供了一套完整的Python第三方库:docker,专门用于操作调用Docker服务。 
接下来,我们将会详细详解如何使用Python的第三方库来调用Docker。

安装第三方库

第一步,当然是安装Python第三方库啦!我们可以直接使用Python自带的包管理工具进行安装:

 
  
  1. pip install docker

试用一下吧:

创建一个docker_api.py的文件,修改文件内容如下:

 
  
  1. import docker
  2. client = docker.DockerClient(base_url='tcp://example.com:2375', version="auto")
  3. client.containers.run("ubuntu", "echo hello world")

这是一个最简单的例子,我们先来了解一下。 
第一行表示引入第三方库docker。 
第二行用于配置Docker服务端的基本信息,次数包含了base_url(Docker服务端的地址)以及version。 
Ps:version设置为”auto”可以自动检查Docker API的版本。 
第三行则是相当于运行了一个docker run ubuntu echo hello world的命令。

下面,我们逐步来进行扩展。 
在之前的内容中,我们讲解了如何对docker remote API添加认证机制。 
如果对docker remote API添加了TLS的认证机制后,此处则无法这样连接至Docker服务端了,因为我们同样需要添加认证信息。添加认证信息的方式如下:

 
  
  1. import docker
  2. tls_config = docker.tls.TLSConfig(
  3. client_cert=(r'e:\git\log\cert.pem', r'e:\git\log\key.pem'),
  4. verify=False
  5. )
  6. client = docker.DockerClient(base_url='tcp://example.com:2376', tls=tls_config, version="auto")
  7. client.containers.run("ubuntu", "echo hello world")

观察一下,此处我们修改了三个位置。 
首先是创建了tls_config。其中包含了客户端的密钥信息。 
其次是修改了base_url的端口号,因为通过TLS认证服务的端口会设置为2376。 
第三点是在DockerClient中增加了一个参数tls,其值为我们刚创建的变量tls_config

最后,我们在来了解一下针对容器运行时,复杂的参数如何进行传递的问题。 
client.containers.run的函数格式如下:

 
  
  1. run(image, command=None, **kwargs)

其中,第一个参数为镜像名称(必填),第二个参数为执行命令,默认为空,可以是字符串或者列表(同docker run时的命令),**kwargs表示一组参数,核心参数见下表。

参数标识 类型 含义
detach Bool 是否以后台服务的方式运行
entrypoint 字符串或者列表 docker run
hostname 字符串 主机名称
links 字典 docker run
name 字符串 容器名称
ports 字典 端口映射 {8000: 80}表示容器的8000端口映射到宿主机的80端口
remove Bool 运行结束后是否自动删除
restart_policy 字典 重启策略
user 字符串 运行用户
volumes 字典 卷映射 示例:{‘/home/user1/’: {‘bind’: ‘/mnt/vol2’, ‘mode’: ‘rw’}, ‘/var/www’: {‘bind’: ‘/mnt/vol1’, ‘mode’: ‘ro’}}
working_dir 字符串 工作目录
runtime 字符串 容器的运行时间

对于client.containers.run的函数的返回值,当detach=False时,返回值是运行过程中的日志,而当detach=True时,返回值是Container对象。

更多关于Python第三方库操作Docker的内容可以参考官方手册:https://docker-py.readthedocs.io/en/stable/index.html


 

更多更详细的内容,请访问原创网站:

https://www.missshi.cn/api/view/blog/5a63285f0a745f6335000008

Ps:初次访问由于js文件较大,请耐心等候(5s左右)

你可能感兴趣的:(Docker,Docker,Swarm,Kubernetes技术栈学习)