小试牛刀!Docker Engine API 了解一下?

今天继续 Docker,根据我最近的了解和实践,Docker是一个非常有前途的东西。如果大家关注各种软件开发大会,一定会听到这些词:DevOps,容器化,微服务,它们都与 Docker 密切相关。我们今天的主角是 Docker Engine API。那么什么是Docker Engine API呢?

The Engine API is an HTTP API served by Docker Engine. It is the API the Docker client uses to communicate with the Engine, so everything the Docker client can do can be done with the API.

上面是官网的描述,简单说就是用 HTTP 接口来执行 Docker 命令。有了这个东东,我们就可以写个页面,用 ajax 去执行 Docker 操作了,酷!

1. 开启HTTP服务

默认 Docker Engine API 只能通过 socket 访问,如果想用 HTTP 访问,得先手动开启一下.

1.1 编写配置文件

vi /etc/docker/daemon.json

1.2 添加hosts配置

{
   "hosts": ["unix:///var/run/docker.sock", "0.0.0.0:3000"]
}

这里的3000就是HTTP访问端口,当然也可以指定为其它端口.

1.3 重启docker服务(centerOS)

systemctl daemon-reload
systemctl restart docker
systemctl -l status docker

1.4 测试

在浏览器直接访问 http://ip:3000/containers/json, 看到JSON返回就说明配置成功了.

2. 实践

不吹牛逼,直接进入主题:完全用 Docker Engine API 来搭建一个 MySQL 服务.

当然在开始之前,你得有一台装好 Docker 的 Linux 主机. 发送HTTP请求可以用 curl 命令,我这里的是 Postman

2.1 镜像准备。

通过 Docker 官方的 MySQL 镜像创建镜像.

POST http://host:port/images/create?fromImage=mysql&tag=5.7

使用的 mysql 镜像 tag 是5.7,注意 Content-Type 要设置成 application/json

2.2 创建容器

POST http://host:port/containers/create?name=${containerName}

请求body参数:

{
    "Image":"mysql:5.7", # 容器使用镜像 
    "Env": [
        "MYSQL_ROOT_PASSWORD=123456" # 镜像可以使用的环境变量
    ],
    "ExposedPorts": {
        "3306/tcp": {} # 容器向外曝露的端口
    },
    "HostConfig": {
        "PortBindings": {
            "3306/tcp": [
                {
                    # 容器端口映射.这里表示把容器的3306端口映射成机器的3399端口
                    # 连接mysql时要使用此端口:3399
                    "HostPort": "3399" 
                }
            ]
        }
    }
}

创建成功后,会返回容器ID,后面的容器操作会用到此ID.

{
    "Id": "3cc0f9149230a89500336c644083812bbd2620a326ccb21c34a0ae24037d0237",
    "Warnings": null
}

2.3 运行容器

POST http://host:port/containers/{id}/start

运行后会返回一个204状态码.但有可能容器并没有真正运行.可以使用接口查看一下容器状态:

GET http://host:port/containers/json?filters={"id": ["3cc0f9149230a89500336c644083812bbd2620a326ccb21c34a0ae24037d0237"]}

如果容器运行成功,那么我们就可以连接此 mysql 数据库了.

2.4 停止容器

POST http://host:port/containers/{id}/stop

2.5 删除容器

DELETE http://host:port/containers/{id}

3. 创建 mongo 服务

如果我们要创建 mongo 数据库,与创建 mysql一样,只是创建容器时的参数稍作修改.

{
    "Image":"mongo:4.0",
    "ExposedPorts": {
        "27017/tcp": {} # 要曝露的端口.mongo的Dockerfile的端口都是27017,所以这里不能修改
    },
    "HostConfig": {
        "PortBindings": {
            "27017/tcp": [
                {
                    "HostPort": "27117" # 端口映射.连接时使用的端口
                }
            ]
        }
    }
}

4. 小结

本文使用 Dcoerk Engine API 的 HTTP 接口演示了如何创建 mysql, mongo 数据库服务.可以看到,基于Docker让以前这些繁琐的环境准备变得非常容易 .以至于一分钟都可以完成搭建一个mysql或mongo服务.而 Docker 容器是可以直接用于服务部署的,这大大减少了部署时间,并且可以保证不会因为环境问题导致出错.这正是Docker的意义所在.

  • Docker Engine API让我们可以使用socket和HTTP的方式执行 Docker 操作,非常方便
  • 要注意 Content-Type 要设置成 application/json
  • 另一个要注意的是,很多接口返回的HTTP状态码并不都是200.如容器启动接口返回的是204
POST http://host:port/images/create # 创建镜像
POST http://host:port/containers/create?name=${containerName}  # 创建容器
POST http://host:port/containers/{containerId}/start # 启动容器
POST http://host:port/containers/{containerId}/stop # 停止容器
DELETE http://host:port/containers/{containerId} # 删除容器

更多其它接口请参考:Docker Engine API.

最后,限于水平所限,如发现错误,请指正。以上!

留言列表
  • bandwagonhoster.com:
    朋友 交换链接吗
    • u3xyz:
      目前只交换技术博客的友链哈
      2018年07月21日 09:51
    2018年07月18日 07:31 回复

发表评论: