Docker 开启 Rest API

环境:Ubuntu 16.04 LTS 64bit,Docker CE 1.38

配置方法

修改:/lib/systemd/system/docker.service

把ExecStart那行改成:

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:想要开启的端口 -H unix:///var/run/docker.sock

保存,并重启服务:

sudo systemctl docker restart

然后就可以用curl或者浏览器进行测试

API文档(1.37版本)

Engine API

配置的时候遇到三个无效配置

1.修改 /usr/lib/systemd/system/docker.service

不知道是不是个例,我的服务器上/usr/lib/systemd下面根本没有system目录

2.修改 /etc/default/docker

说是添加DOCKER_OPTS = " -H=unix:///var/run/docker.sock -H=0.0.0.0:端口",然后重启服务就可以,但是实测无效

3.使用 systemctl edit docker.service

然后添加

[Service]
ExecStart=

ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:端口

实测使用命令后打开的是空白文件,并且输入配置后,由于ExecStart重复配置还导致服务无法运行,并且无法重装或卸载,提示:

Failed to stop docker.service: Unit docker.service not loaded.

并且让我使用 systemctl status docker.service 查看服务状态

使用命令以后,根据显示的信息,找到了 /etc/systemd/system/docker.service.d/override.conf 文件(也就是保存刚刚添加的配置内容的文件),把这个文件清空,启动服务成功,恢复正常

API 测试(使用Postman或Chrome)

1.搜索镜像(java)

get /images/search?term=java

返回结果:

Docker 开启 Rest API_第1张图片

给出了搜索结果

2.查看container

get /containers/json

返回:

[
    {
        "Id": "9a84f2443f038050115140155c46f3c7791de4f92a6be300a50f1c6586c42369",
        "Names": [
            "/lucid_stonebraker"
        ],
        "Image": "ubuntu",
        "ImageID": "sha256:ea4c82dcd15a33e3e9c4c37050def20476856a08e59526fbe533cc4e98387e39",
        "Command": "/bin/bash",
        "Created": 1541509446,
        "Ports": [],
        "Labels": {},
        "State": "running",
        "Status": "Up 18 hours",
        "HostConfig": {
            "NetworkMode": "default"
        },
        "NetworkSettings": {
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "c26e32aa88e8ba869fff5332c3dafb865e1eafcadd12c1e99f217cbfaa77fc00",
                    "EndpointID": "ae4c138cc718ea87de95a0eb8b59dedc424907223282bfd10cfefa40bb72c2a3",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        },
        "Mounts": []
    }
]

3.停止container

post /container/{id}/stop

id就是上一步返回结果中的Id字段

成功后没有返回值,在putty中查询,结果如下:

ubuntu@VM-0-6-ubuntu:~$ sudo docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
9a84f2443f03        ubuntu              "/bin/bash"         18 hours ago        Exited (0) About a minute ago                       lucid_stonebraker

说明该容器确实是被这次请求关闭的

安全问题

查询相关资料的时候,看到了一篇博文

Docker Remote Api未授权访问漏洞

提到了可以使用Docker挂载功能达到免密登录,推荐大家看看

我是使用腾讯云的入站规则进行防御,但是效果肯定有限,如果只是学习目的的话,推荐大家不使用Docker Rest API的时候关闭该功能,或者干脆停止docker服务

你可能感兴趣的:(Docker)