安全地远程调用Docker API
引言
你也许知道如何在一台安装了 docker 的机器上创建、停止、删除容器。但是如果发号施令的程序和 docker 不在同一台机器上该怎么办?
本文将介绍如何开启 docker api 远程调用、使用 http api 或者 java sdk 操作另一台机器上的 docker、以及如何确保 docker api 不被他人调用。
开启 docker api 远程调用(简单,不鉴权,快速体验)
默认 docker 只允许本机使用docker
命令进行操作,我们现在来开启 http api 调用,使得其他机器可以通过 http 请求来操作 docker。
注意:这种方法不对调用者权限进行校验,也就是说互联网上任何一个人都可以控制你的 docker。我们这里为了快速体验临时使用这种方法,长期使用请务必使用 tls 来鉴权,具体方法下文会介绍。
vim /lib/systemd/system/docker.service
编辑 docker 启动命令,找到 service 模块下的 ExecStart=xxx
这一行,在其末尾添加`-H=tcp://0.0.0.0:2375
其中,0.0.0.0
意为允许任何来源的访问,docker 将会在 2375
端口监听 http 请求。(记得开放安全组或者防火墙)
重启 docker:
systemctl daemon-reload
sudo service docker restart
然后你就可以通过 http 请求远程操控 docker 了,例如通过curl http://ip:2375/images/json
来获取镜像列表。同样你也可以通过各种编程语言的 sdk 来发起请求,详见:https://docs.docker.com/engine/api/sdk/
接下来我们用 java sdk 举例
使用 java sdk 远程调用 docker api
我们使用 star 最多的 sdk:https://github.com/docker-java/docker-java
我的使用的 maven 依赖如下,其他版本可能会报错:
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java</artifactId>
<version>3.3.4</version>
</dependency>
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java-transport-httpclient5</artifactId>
<version>3.3.4</version>
</dependency