Docker 插件开发

Summary: Author: 张亚飞 | Read Time: 1 minute read | Published: 2023-10-17
Filed under Categories: MarkDownTags: Tag,

Docker Plugins

Docker 授权插件示例 Access authorization plugin AuthZ& AuthN - Docker Access Authorization Plugin docker container ls

安装 docker 插件

启动 Python 授权插件脚本

import json
from http.server import HTTPServer, BaseHTTPRequestHandler

class DockerAuthHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        """
        处理 docker 授权请求
        """
        content_length = int(self.headers['Content-Length'])
        request_body = self.rfile.read(content_length).decode('utf-8')
        print(request_body)
        if self.path == '/Plugin.Activate':
            res = {'Implements': ['authz']}
        else:
            # 可以增加权限判断
            res = {'Allow': True, 'Msg': '', 'Err': ''}  # 允许所有的请求
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        self.wfile.write(json.dumps(res).encode(encoding='utf-8'))


def run_server():
    host = '0.0.0.0'  # 监听所有网络接口
    port = 8080

    server_address = (host, port)
    httpd = HTTPServer(server_address, DockerAuthHandler)
    print(f'Starting HTTP server on {host}:{port}')

    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        print('Stopping HTTP server...')
    finally:
        httpd.server_close()


if __name__ == "__main__":
    run_server()
python3 test.py

/etc/docker/plugins 目录下创建插件配置文件

{
    "Name": "simple",
    "Addr": "http://127.0.0.1:8080/"
}

修改 /lib/systemd/system/docker.service,添加授权参数 --authorization-plugin=simple

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --authorization-plugin=simple

最后重启 docker 服务

systemctl restart docker

执行 docker 命令,可以看到 docker daemon 会把请求发到上面的授权中间件进行处理

问题: 使用 docker 命令默认会列出系统所有运行的容器,通过授权查询暂时不能限制访问特定容器资源。

可以使用 label 打标签,然后执行 docker 命令的时候检查标记进行限制

docker run -it --rm --name test-1 --label cases="case" ubuntu
docker run -it --rm --name test-2 --label cases="case" ubuntu

通过标签进行限制

docker ps --filter "label=cases=case"

通过检查标签来进行限制


Comments

Cor-Ethan, the beverage → www.iirii.com