Docker Restful API 控制容器创建,启动、停止、删除与安全认证

虚拟化系统 0 913 张长瑞 收藏

在使用 Docker restful api 之前,需要了解 docker restful api 的开启方式。

默认情况下,docker 是没有开启 rest api 服务器的,需要手工修改 docker.service 文件开启 rest api 的访问。

修改 ExecStart 行

默认:

ExecStart=/usr/bin/dockerd  -H unix:///var/run/docker.sock

修改为:

ExecStart=/usr/bin/dockerd -H=tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

其中 IP 地址可以是 0.0.0.0 也可以是 127.0.0.1 也可以是 ifconfig 看到的 IP 地址。

然后重启 docker

systemctl restart docker

以下操作默认 IP 地址为 192.168.1.1,新创建容器名称为 newdocker

使用 curl get 的方式查看下 rest api 是否开启成功

curl GET https://192.168.1.1:2375/version

如果开启成功,会返回 docker 版本相关信息,例如:

{"Platform":{"Name":"Docker Engine - Community"},"Components":[{"Name":"Engine","Version":"20.10.6","Details":{"ApiVersion":"1.41","Arch":"amd64","BuildTime":"2021-04-09T22:46:14.000000000+00:00","Experimental":"false","GitCommit":"8728dd2","GoVersion":"go1.13.15","KernelVersion":"3.10.0-1062.el7.x86_64","MinAPIVersion":"1.12","Os":"linux"}},{"Name":"containerd","Version":"v1.4.4","Details":{"GitCommit":"05f951a3781f4f2c1911b05e61c160e9c30eaa8e"}},{"Name":"runc","Version":"1.0.0-rc93","Details":{"GitCommit":"12644e614e25b05da6fd08a38ffa0cfe1903fdec"}},{"Name":"docker-init","Version":"0.19.0","Details":{"GitCommit":"de40ad0"}}],"Version":"20.10.6","ApiVersion":"1.41","MinAPIVersion":"1.12","GitCommit":"8728dd2","GoVersion":"go1.13.15","Os":"linux","Arch":"amd64","KernelVersion":"3.10.0-1062.el7.x86_64","BuildTime":"2021-04-09T22:46:14.000000000+00:00"}

此时,我们就可以对 docker 进行 curl 方式远程操作。

一、创建容器

curl -X POST -H Content-Type:application/json -d "{"image":"docker/test","ENV":["host=newdocker","testenv=aaa"],"HostConfig":{"PortBindings":{"22/tcp":[{"Hostip":"","Hostport":"2222"}],"80/tcp":[{"Hostip":"","Hostport":"8080"}]},"Memory":"2147483648"}}" https://192.168.1.1:2375/containers/create?name=newdocker

以上命令详解:

1、curl *******    :  curl 以 POST 方式提交,提交内容为 json 格式

2、提交内容说明:

    2.1、image     镜像名称

    2.2、ENV       设置容器内部环境变量,这里设置 host 这个环境变量为 newdocker,设置 testenv 为 aaa。(启动容器后  env 命令可查)

    2.3、HostConfig   主机设置

        2.3.1、PortBindings   设置端口绑定,这里将 docker 内部的 22 端口映射到主机 2222 端口,将 docker 内部的 80 端口映射到主机的 8080 端口。

    2.4、Memery   设置主机限制的内存量,本文设置为 2GB

 3、https://192.168.1.1:2375/containers/create?name=newdocker   提交到 create 这个 api 中,并且将容器命名为 newdocker,这样在 docker ps -a 命令中就可以看到已 newdocker 命名的容器

其他参数,请参考:https://docs.docker.com/engine/api/

创建成功则返回创建容器的 ID 号(长字符串,需要自行截取前 12 位

二、启动容器

使用 restful api 启动容器相对比较简单,没有复杂的 json 提交。

curl -X POST -H "Content-t-Type: application/json" https://192.168.1.1:2375/containers/newdocker/start

命令详解:

1、仍以 Curl  POST 方式提交,提交的数据类型依旧是 json,但是无需使用 - d 带上参数

2、提交的地址为 https://192.168.1.1:2375/containers/newdocker/start    其中 newdocker 既可以是第一步创建时使用的容器名称,也可以是第一步最后截取的前 12 为字符,例如

curl -X POST -H "Content-t-Type: application/json" https://192.168.1.1:2375/containers/28a5e8d7c464/start

使用 rest api 方式启动容器后无任何返回值信息,需自行查询容器状态。

curl https://192.168.1.1:2375/containers/newdocker/json

无论容器启动是否成功,都需要对返回的结果进行分析才可以获取。

启动成功可以看到如下字段内容

"Status":"running","Running":true

若容器未启动,则显示如下内容

"Status":"exited","Running":false

三、停止容器

相对于第一步的创建容器,启动和停止容器均是比较简单的操作,停止容器如同启动容器一样

curl -X POST -H "Content-t-Type: application/json" https://192.168.1.1:2375/containers/newdocker/stop

详解同启动容器

同样,停止容器也不会有返回值。

需要使用以下命令来查询容器状态,通过分析返回的 json 值来判断容器当前状态。

curl https://192.168.1.1:2375/containers/newdocker/json

四、删除容器

删除容器采用 curl delete 的方式

curl -X DELETE https://192.168.1.1:2375/containers/newdocker

同理,删除容器也不会有任何提示,请自行查询。

五、安全认证

通常,如果 api 没有认证,那么所有连接这个网络的人都可以使用这个 API 来对 docker 进行操作,这是极其不安全的,因此我们需要进行一些安全认证。

通常。restful api 采用证书的方式进行连接认证:

具体方法可以参考:https://my.oschina.net/u/2528821/blog/2120784

这里不再复制和转载。

在启用证书的方式后,如未携带证书进行认证,则提示如下 (启动证书后,curl 提交最后请添加 - k 参数):

curl: (58) NSS: client certificate not found (nickname not specified)

 

若未使用 - k 参数,则提示:

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

 

内容完毕,感谢您的御览!!!!


相关推荐:

网友留言:

您需要 登录账户 后才能发表评论

我要评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
验证码