Docker 系列(七):Docker API使用

 

Docker API种类

docker 的api遵循rest的风格,可以查看https://docs.docker.com/engine/api/

docker官方主要有三大对外api:

  • Docker Registry API
  • Docker Hub API
  • Docker Remote API

1. Docker Registry API

这个是docker镜像仓库的api,通过操作这套API,你可以*的自动化、程序化的管理你的镜像仓库。

2. Docker Hub API

Docker Hub API是用户管理操作的API,docker hub是使用校验和公共 namespaces 的方式来存储账户信息、认证账户、进行账户授权。API同时也允许操作相关的用户仓库和 library 仓库。

3. Docker Remote API

这套API用于控制主机 Docker 服务端的 API,等价于 docker命令行客户端。 有了它,你能远程操作docker容器,更重要的是你可以通过程序自动化运维docker进程。

API使用前准备

在体验之前,我们需要开启docker rest api。具体开启的方法:

$ vim /usr/lib/systemd/system/docker.service

在 ExecStart=/usr/bin/dockerd 后面直接添加 -H tcp://0.0.0.0:8088 -H unix:///var/run/docker.sock (注意端口8088自己随便定义,别跟当前的冲突即可)

$ systemctl daemon-reload
$ systemctl restart docker

命令行执行测试:curl 127.0.0.1:8088/info | python -mjson.tool

 

如何操作docker API

最简单的curl方式

CURL这个命令,我想大家都熟悉,默认linux下都自带安装。很多测试http的方法都可以直接使用 CURL的方式。

比如我们查看docker的images详细信息,就可以直接用curl 来调取:

 $ curl -X GET http://127.0.0.1:8088/images/json

这样显示会比较错乱无章,我们可以在命令后面加个 python -mjson.tool 格式化下

$  curl -X GET http://127.0.0.1:8088/images/json | python -mjson.tool

这样的结果格式就比较标准化,比较容易阅读。

查看所有containers容器:

$ curl -X GET http://127.0.0.1:8088/containers/json | python -mjson.tool

创建一个containers容器:

这里创建一个mariadb数据库的容器,设置了密码是123456,监听端口是3306

$ curl -X POST -H "Content-Type: application/json" -d '{
    "Image": "mariadb",
    "Env": ["MYSQL_ROOT_PASSWORD=123456"],
    "ExposedPorts": {
        "3306/tcp": {}
    },
    "HostConfig": {
        "PortBindings": {
            "3306/tcp": [{"HostIp": "","HostPort": "3306"}]
        }
    },
    "NetworkSettings": {
        "Ports": {
            "5000/tcp": [{"HostIp": "0.0.0.0","HostPort": "3306"}]
        }
    }
}' http://127.0.0.1:8088/containers/create

启动/停止/重启 一个containers容器:

$ curl -X POST http://127.0.0.1:8088/containers/{id}/start   (注意这里是POST方法)
$ curl -X POST http://127.0.0.1:8088/containers/{id}/stop   (注意这里是POST方法)
$ curl -X POST http://127.0.0.1:8088/containers/{id}/restart   (注意这里是POST方法)
...

具体还有很多API方法,大家都可以登录上面提到的链接进行查看

https://docs.docker.com/engine/api/v1.38

python程序脚本方式

Docker给python提供了一个非常强大的库,名字就叫做docker。我们可以登录官方的python sdk地址来学习认识python如何具体操作docker。

地址是:https://docker-py.readthedocs.io/en/stable/

安装docker python库

$ pip install docker

开始使用

import docker
client = docker.DockerClient(base_url='unix://var/run/docker.sock', version="auto")
client.containers.run("ubuntu", "echo hello world")
  • 第一行表示引入第三方库docker。
  • 第二行用于配置Docker服务端的基本信息,包含了base_url(Docker服务端的地址)以及version(auto可以自动检查docker的版本)。
  • 第三行则是相当于运行了一个docker run ubuntu echo hello world的命令。

进阶使用

import docker
client = docker.DockerClient(base_url="tcp://ip:port")
client.images.list()       # 类似docker images命令,显示image的信息列表
client.containers.list()       #  类似docker ps命令
client.containers.list(all=True)       # 类似docker ps -a命令
container = client.containers.get(container_id)           # 获取daodocker容器,这里container_id 是你要输入的具体容器id
container.start()     #启动容器

端口映射

import docker

client = docker.DockerClient(base_url="tcp://ip:port")
container = client.containers.run('mysql/mysql-server:5.7',ports={'3306/tcp': 3300}, auto_remove=True, name='shark_mysql',
detach=True)

# 查看容器对象的方法和属性
print(dir(container))
print(container.short_id)
  • {'3306/tcp': 3300} 将容器的 TCP 3306 端口映射到宿主机的 3300 端口
  • name 指定了容器的名称
  • detach=True 后台运行,此时这个 Python 程序不用被挂起
  • container 是被创建容器的对象




上一篇:Linux-Docker容器没有给我壳


下一篇:将多个应用程序作为群集中的Docker容器,处理MySQL的方法