前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker API的使用

Docker API的使用

作者头像
Al1ex
发布2023-05-12 11:41:53
1.3K0
发布2023-05-12 11:41:53
举报
文章被收录于专栏:网络安全攻防网络安全攻防
文章前言

Docker作为最流行的容器化解决方案其API接口提供了强大的容器管理功能,通过Docker API我们可以实现自动化的容器lifecycle管理、数据管理、网络管理等,大大简化容器的使用难度,本篇文章我们主要介绍Docker API的基本使用

版本划分

Docker API分为三个版本:

  • V1:Docker最初的API版本,目前已被废弃
  • V2:Docker现在的稳定版本API,与Docker CLI和Docker Engine完全兼容
  • V3:Docker的最新API版本(alpha 版本),提供Swarm、Network、Plugin等新特性的支持
调用方式

Docker API是Docker引擎提供的一组RESTful API,用于管理和操作Docker容器、镜像、网络和数据卷等资源,Docker API支持以下几种调用方式:

Docker CLI

Docker CLI是Docker命令行工具,可以通过命令行界面来管理和操作Docker引擎,Docker CLI实际上是对Docker API的一层封装,它可以直接调用Docker API来完成相应的操作,下面是一个使用Docker CLI启动一个新的Docker容器的示例:

代码语言:javascript
复制
docker run -d -p 8080:80 nginx:latest
Docker SDK

Docker SDK是一组编程语言特定的API,用于访问和管理Docker引擎,,Docker SDK提供了一组简单的API可以直接在程序中调用而无需手动构造HTTP请求和解析响应,Docker SDK支持多种编程语言,包括Python、Go、Java、JavaScript等,下面是一个使用Python Docker SDK创建一个新的Docker容器的示例:

代码语言:javascript
复制
import docker

client = docker.from_env()
container = client.containers.run('nginx:latest', detach=True, ports={'80/tcp': '8080'})
print(container.id)

上述示例使用Python Docker SDK创建了一个Docker客户端对象,然后调用containers.run()方法来创建一个新的容器,containers.run()方法的参数包括镜像名称、容器名称、命令、端口映射等,创建容器后,程序打印出容器的ID

HTTP RESTful API

HTTP RESTful API是Docker API最基本的调用方式,通过HTTP请求和响应来管理和操作Docker引擎,HTTP RESTful API使用标准的HTTP方法和URL路径来表示请求的操作并使用JSON格式的数据来传输请求和响应的参数和结果,下面是一个使用HTTP RESTful API列出所有Docker容器的示例,通过发送了一个HTTP GET请求到Docker引擎的/containers/json路径表示要列出所有的Docker容器,Docker引擎收到请求后返回一个JSON格式的数组,表示所有容器的信息,例如:容器ID、名称、状态等

代码语言:javascript
复制
GET /containers/json HTTP/1.1
Host: localhost:2375
安全机制

为了保障Docker API的安全性,Docker引擎提供了以下几种安全机制:

认证授权

Docker API支持基于OAuth2.0的认证和授权机制,可以通过访问令牌(access token)来验证客户端的身份并授权客户端访问Docker API的特定资源,Docker引擎还支持基于TLS的X.509证书认证,可以使用客户端证书来验证客户端的身份并授权客户端访问Docker API的特定资源

Step 1:安装配置OAuth2.0认证插件

首先需要安装和配置一个OAuth2.0认证插件,例如:Docker OAuth2 Authentication Plugin,该插件支持基于OAuth 2.0的认证和授权机制并提供了一个简单的RESTful API用于管理和操作访问令牌和授权规则,我们可以使用以下命令来安装和启动OAuth2.0认证插件,CLIENT_IDCLIENT_SECRET是OAuth2.0提供的客户端ID和客户端密钥,COOKIE_SECRET是用于加密访问令牌的秘钥

代码语言:javascript
复制
  docker run -d \
    --name oauth2_proxy \
    -p 4180:4180 \
    -e OAUTH2_PROXY_CLIENT_ID=<CLIENT_ID> \
    -e OAUTH2_PROXY_CLIENT_SECRET=<CLIENT_SECRET> \
    -e OAUTH2_PROXY_COOKIE_SECRET=<COOKIE_SECRET> \
    quay.io/oauth2-proxy/oauth2-proxy

Step 2:配置Docker API认证授权

接下来需要配置Docker API认证和授权机制以便使用OAuth 2.0认证插件验证客户端的身份并授权客户端访问Docker API的特定资源,我们可以使用以下命令来启动Docker引擎并将OAuth2.0认证插件作为Docker API的认证和授权服务,其中token_urlauth_url分别是OAuth2.0认证插件的访问令牌和授权URL,user_key是OAuth2.0提供的用户信息键名

代码语言:javascript
复制
  dockerd \
    --authorization-plugin=oauth2_proxy \
    --authorization-plugin-auth-config=token_url=http://localhost:4180/token,auth_url=http://localhost:4180/auth,user_key=email

Step 3:获取用户访问令牌

现在可以使用OAuth2.0认证插件提供的RESTful API来获取访问令牌并使用该访问令牌来访问Docker API的特定资源,我们可以使用以下命令来获取访问令牌,其中CLIENT_IDCLIENT_SECRET是OAuth2.0提供的客户端ID和客户端密钥

代码语言:javascript
复制
 curl -X POST \
    -d "client_id=<CLIENT_ID>&client_secret=<CLIENT_SECRET>&grant_type=client_credentials" \
    http://localhost:4180/token

获取到访问令牌后可以将其作为Authorization请求头的值来访问Docker API的特定资源,如下所示:

代码语言:javascript
复制
 curl -H "Authorization: Bearer <ACCESS_TOKEN>" http://localhost:2375/containers/json

总的来说,使用OAuth2.0认证和授权机制可以帮助管理员保障Docker API的安全性,同时提供了灵活的认证和授权方案,管理员可以根据实际需求来选择合适的认证和授权插件并对其进行配置和调整以达到最佳的安全效果

TLS 加密

Docker API支持基于TLS的加密机制,可以通过HTTPS协议来加密Docker API的通信防止数据在传输过程中被篡改或窃取,Docker引擎还支持自签名证书和第三方证书的使用,可以根据实际需求来选择合适的证书

Step 1:生成证书和密钥

首先需要生成一个自签名的TLS证书和密钥用于加密Docker API的通信,可以使用以下命令来生成一个有效期为365天的自签名TLS证书和密钥,保存在cert.pemkey.pem文件中

代码语言:javascript
复制
openssl req -newkey rsa:4096 -nodes -keyout key.pem -x509 -days 365 -out cert.pem

Step 2:配置Docker引擎

接下来需要配置Docker引擎以便使用TLS加密机制加密Docker API的通信,我们可以使用以下命令来启动Docker引擎并将自签名TLS证书和密钥作为Docker API的加密证书和密钥:

代码语言:javascript
复制
  dockerd \
    --tlsverify \
    --tlscacert=ca.pem \
    --tlscert=cert.pem \
    --tlskey=key.pem \
    -H=0.0.0.0:2376

备注:--tlsverify表示开启TLS加密机制,--tlscacert--tlscert--tlskey分别是TLS证书的CA证书、公钥和私钥,-H是Docker API的监听地址和端口号

Step 3:配置Docker客户端

现在需要配置Docker客户端以便使用TLS加密机制连接Docker API,我们可以使用以下命令来配置Docker客户端并将自签名TLS证书和密钥作为Docker API的加密证书和密钥,其中的<SERVER_IP>是Docker引擎的IP地址或主机名,DOCKER_TLS_VERIFY表示开启TLS加密机制,DOCKER_CERT_PATH是TLS证书和密钥的路径

代码语言:javascript
复制
export DOCKER_HOST=tcp://<SERVER_IP>:2376 DOCKER_TLS_VERIFY=1 DOCKER_CERT_PATH=.

Step 4:测试TLS加密

现在可以使用Docker客户端连接到Docker API并测试TLS加密机制是否正常工作,可以使用以下命令来测试TLS加密,如果返回结果中包含Security Options: tls,则表示TLS加密机制已经成功启用

代码语言:javascript
复制
docker info

访问控制

Docker API支持基于IP地址和端口号的访问控制机制,用户可以限制特定IP地址或端口号的客户端访问Docker API的特定资源,Docker引擎还支持基于Docker网络的访问控制机制,可以根据网络名称或ID来限制客户端访问Docker API的特定资源

Step 1:配置Docker引擎

配置Docker引擎以便使用基于IP地址和端口的访问控制机制限制Docker API的访问,我们可以使用以下命令来启动Docker引擎并将允许访问的IP地址和端口作为Docker API的监听地址和端口号:

代码语言:javascript
复制
  dockerd \
    -H tcp://127.0.0.1:2375 \
    --ip=<ALLOWED_IP_ADDRESS> \
    --ip=<ANOTHER_ALLOWED_IP_ADDRESS> \
    --ip=<...> \
    --iptables=true \
    --iptables-chain=DOCKER-API \
    --iptables-rule='--proto tcp --dport 2375 -j DOCKER-API' \
    --iptables-rule='--proto tcp --dport 2376 -j DOCKER-API' \
    --iptables-rule='--proto tcp --dport 2377 -j DOCKER-API'

参数说明:

  • -H:Docker API的监听地址和端口号
  • --ip:指定允许访问的IP地址,可以多次使用该选项来指定多个IP地址
  • --iptables=true:启用iptables规则
  • --iptables-chain=DOCKER-API:指定iptables规则的链名称
  • --iptables-rule:指定iptables规则的内容,可以多次使用该选项来指定多个iptables规则

Step 2:配置iptables规则

接下来需要配置iptables规则以便将允许访问的IP地址和端口添加到iptables规则中,我们可以使用以下命令来添加iptables规则:

代码语言:javascript
复制
$ iptables -N DOCKER-API
$ iptables -A DOCKER-API -s <ALLOWED_IP_ADDRESS> -j ACCEPT
$ iptables -A DOCKER-API -s <ANOTHER_ALLOWED_IP_ADDRESS> -j ACCEPT
$ iptables -A DOCKER-API -j DROP

命令说明:

  • iptables -N DOCKER-API:创建一个名为DOCKER-API的新链
  • iptables -A DOCKER-API -s <ALLOWED_IP_ADDRESS> -j ACCEPT:添加一个允许访问的IP地址到DOCKER-API链中
  • iptables -A DOCKER-API -j DROP:将所有其他IP地址的访问都拒绝

Step 3:测试基于IP地址和端口的访问控制

现在可以使用Docker客户端连接到Docker API并测试基于IP地址和端口的访问控制机制是否正常工作,可以使用以下命令来测试,如果返回结果正常,则表示基于IP地址和端口的访问控制机制已经成功启用

代码语言:javascript
复制
$ docker -H tcp://<ALLOWED_IP_ADDRESS>:2375 info
日志记录

Docker API支持日志记录机制,可以记录所有的API请求和响应信息并将其保存到Docker引擎的日志文件中,日志记录可以帮助管理员追踪和分析Docker API的使用情况以及发现和解决安全问题,下面是一个使用日志记录机制的Docker API示例:

Step 1:配置Docker引擎的日志记录

首先需要配置Docker引擎的日志记录以便记录Docker引擎的操作、容器的状态、事件的信息等,我们可以使用以下命令来启动Docker引擎并将日志输出到指定的文件中:

代码语言:javascript
复制
$ dockerd \
    --log-driver=json-file \
    --log-opt max-file=5 \
    --log-opt max-size=10m \
    --log-opt labels=docker \
    --log-opt env=NODE \
    --log-opt env=DEV \
    --log-opt env=PROD \
    -H tcp://0.0.0.0:2375

参数说明:

  • --log-driver=json-file:指定使用json-file作为日志记录驱动
  • --log-opt max-file=5:指定最多保存5个日志文件
  • --log-opt max-size=10m:指定每个日志文件的最大大小为10MB
  • --log-opt labels=docker:指定记录具有docker标签的日志条目
  • --log-opt env=NODE--log-opt env=DEV--log-opt env=PROD:指定只记录指定环境变量的日志条目
  • -H tcp://0.0.0.0:2375:Docker API的监听地址和端口号

Step 2:查看Docker引擎的日志记录

接下来可以使用以下命令来查看Docker引擎的日志记录

代码语言:javascript
复制
$ journalctl -u docker.service -f

Step 3:查看容器的日志记录

除了记录Docker引擎的操作、事件等信息外,Docker API还可以记录容器的状态、日志等信息,可以使用以下命令来查看容器的日志记录,下面的命令会输出容器的日志信息,包括容器启动的日志、应用程序的输出等

代码语言:javascript
复制
$ docker logs <CONTAINER_NAME>
使用实例
系统信息
代码语言:javascript
复制
curl -X GET http://192.168.17.140:2375/info
版本信息
代码语言:javascript
复制
curl -X GET http://192.168.17.140:2375/version
容器列表

获取所有容器的清单:

代码语言:javascript
复制
curl http://192.168.17.140:2375/containers/json
容器信息
代码语言:javascript
复制
curl http://192.168.17.140:2375/containers/18729864daa3/json
进程列表
代码语言:javascript
复制
curl http://192.168.17.140:2375/containers/18729864daa3/top
镜像列表
代码语言:javascript
复制
curl -X GET http://192.168.17.140:2375/images/json

镜像信息

代码语言:javascript
复制
curl -X GET http://192.168.17.140:2375/images/c059bfaa849c/json
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 七芒星实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章前言
  • 版本划分
  • 调用方式
    • Docker CLI
      • Docker SDK
        • HTTP RESTful API
        • 安全机制
          • 认证授权
            • TLS 加密
              • 日志记录
              • 使用实例
                • 系统信息
                  • 版本信息
                    • 容器列表
                      • 容器信息
                        • 进程列表
                          • 镜像列表
                          相关产品与服务
                          容器镜像服务
                          容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档