使用 Docker Desktop进行 BPF 开发

简介: Docker Desktop 是 Windows 和 Mac 上最为流行 Docker 开发环境。是否有办法在Docker Desktop中,利用容器来使用eBPF呢?

![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/b1f5d318-c2ed-4d08-8170-270644c62d41.jpeg) Docker Desktop 是 Windows 和 Mac 上最为流行 Docker 开发环境。我平时很多日常开发和测试也是以 Docker Desktop 为主。之前开发测试eBPF应用大多是直接在Linux上面完成的,是否有办法在Docker Desktop中,利用容器来使用eBPF呢?本文参考了部分 https://github.com/singe/ebpf-docker-for-mac 相关实现,来帮助大家尝试一下。 ## bcc & bpftrace Docker Desktop for Mac 通过一个虚拟机,来运行基于[Linuxkit](https://github.com/linuxkit/linuxkit)构建的操作系统支持Docker环境。我们无法直接访问Virtual Machine,我们需要在 Docker容器中运行 eBPF 工具, 这需要有如下的前提条件: - /usr/src/ 需要包含内核源代码 - debugfs 被正确挂载。 ```mount -t debugfs debugfs /sys/kernel/debug``` - /lib/modules/ 需要挂载 host 宿主机上相关目录 - 需要在特权方式运行,比如 ```docker run --privileged ...``` - 需要使用宿主机 PID 名空间,比如 ```docker run --pid=host ... ``` 我们首先获取当前宿主机内核版本信息 ``` $ docker run -it --rm --privileged --pid=host justincormack/nsenter1 # uname -r 5.10.47-linuxkit ``` 在Docker Hub上,Docker 在 [docker/for-desktop-kernel](https://hub.docker.com/r/docker/for-desktop-kernel/tags) 仓库中发布了 Docker Desktop 所包含的 linuxkit 内核代码的容器镜像。大家根据上面的内核版本信息就能定位相应的镜像 tag。 然后,我们来构建属于自己的 Docker 镜像,比如我希望构建一个Docker镜像包含,[bcc](https://github.com/iovisor/bcc) 和 [bpftrace](https://github.com/iovisor/bpftrace) 等eBPF开发工具。我们创建如下 Dockerfile.tools 来构建相应镜像 ``` FROM docker/for-desktop-kernel:5.10.47-0b705d955f5e283f62583c4e227d64a7924c138f AS ksrc FROM ubuntu:20.04 AS bpftrace COPY --from=ksrc /kernel-dev.tar / RUN tar xf kernel-dev.tar && rm kernel-dev.tar # Use Alibaba Cloud mirror for ubuntu RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/' /etc/apt/sources.list # Install LLVM 10.0.1 RUN apt-get update && apt install -y wget lsb-release software-properties-common && wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && ./llvm.sh 10 ENV PATH "$PATH:/usr/lib/llvm-10/bin" # Build/Install bpftrace RUN apt-get install -y bpftrace # Build/Install bcc WORKDIR /root RUN DEBIAN_FRONTEND="noninteractive" apt install -y kmod vim bison build-essential cmake flex git libedit-dev \   libcap-dev zlib1g-dev libelf-dev libfl-dev python3.8 python3-pip python3.8-dev clang libclang-dev && \   ln -s $(which python3) /usr/bin/python RUN git clone https://github.com/iovisor/bcc.git && \     mkdir bcc/build && \     cd bcc/build && \     cmake .. && \     make && \     make install && \     cmake -DPYTHON_CMD=python3 .. && \     cd src/python/ && \     make && \     make install && \     sed -i "s/self._syscall_prefixes\[0\]/self._syscall_prefixes\[1\]/g" /usr/lib/python3/dist-packages/bcc/__init__.py CMD mount -t debugfs debugfs /sys/kernel/debug && /bin/bash ``` 运行如下命令,构建镜像 (执行时间较长,可以出去喝喝咖啡,吃吃饭) ``` $ docker build -t ebpf-for-mac -f ./Dockerfile.tools . [+] Building 6097.8s (16/16) FINISHED ... ``` 或者可以直接拉取以构建好的镜像, ``` $ docker pull registry.cn-hangzhou.aliyuncs.com/denverdino/ebpf-for-mac $ docker tag registry.cn-hangzhou.aliyuncs.com/denverdino/ebpf-for-mac ebpf-for-mac ``` 运行如下命令,来通过Docker镜像运行 bcc 测试应用。 ``` $ docker run -it --rm \   --name ebpf-for-mac \   --privileged \   -v /lib/modules:/lib/modules:ro \   -v /etc/localtime:/etc/localtime:ro \   --pid=host \   ebpf-for-mac    # wget https://raw.githubusercontent.com/singe/ebpf-docker-for-mac/main/hello_world.py # python3 hello_world.py b'      kube-proxy-5454    [003] d... 10679.347316: bpf_trace_printk: Hello world' b'' b'      kube-proxy-5469    [002] d... 10679.355387: bpf_trace_printk: Hello world' b'' b'         dockerd-1807    [001] d... 10680.178545: bpf_trace_printk: Hello world' b'' b'            runc-95361   [003] d... 10680.191472: bpf_trace_printk: Hello world' b'' ... ``` bpftrace 是IO Visor开发的eBPF的追踪工具。它允许开发者用简洁的DSL(Domain Specific Language)编写eBPF程序,而不必在内核中手动编译和加载它们。## 在Kubernetes上调度 bpftrace 应用 Docker Desktop也内置了Kubernetes集群开发环境。为了帮助国内开发者解决由于无法访问 gcr.io 镜像仓库,导致无法开启 Kubernetes 的问题,阿里云团队维护了一个简单的 helper 工具可以解决相应问题,请参考: https://github.com/AliyunContainerService/k8s-for-docker-desktop 。 kubectl-trace 是可以让用户在Kubernetes集群中安排执行bpftrace程序的kubectl插件。它的架构图如下,当通过 ```kubectl trace``` 命令创建一个trace应用时,kubectl-trace插件会在Kubernetes集群上,通过API创建一个被称作“trace-runner”的临时任务来执行bpftrace应用,可以调度到指定的节点或者Pod对其进行追踪。 ![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/cad1045e-75c8-468b-ab86-75a712d9977b.png) kubectl-trace的安装过程比较简单,请参考 [Installing](https://github.com/iovisor/kubectl-trace#installing) 进行操作。然而其默认带的 trace-runner 镜像是不支持 Docker Desktop,执行会自动退出。我们来根据上文原理,hack 一个扩展的版本。其中的代码实现在 https://github.com/denverdino/trace-runner-for-docker-desktop 项目中。 其实现与上文类似,在  /usr/src/ 中添加内核源代码,并挂载 debugfs , 然后就可以愉快的玩耍了。具体实现可以参见项目中 Dockerfile 与 main.go ,此处不在赘述。其运行效果如下: ``` $ kubectl trace run docker-desktop --imagename=registry.cn-hangzhou.aliyuncs.com/denverdino/kubectl-trace-runner -e "tracepoint:syscalls:sys_enter_* { @[probe] = count(); }" trace 7b64f4b4-226e-4aaf-83b1-94858c72f91f created $ kubectl trace attach 7b64f4b4-226e-4aaf-83b1-94858c72f91f Attaching 327 probes... ^C first SIGINT received, now if your program had maps and did not free them it should print them out @[tracepoint:syscalls:sys_enter_getrlimit]: 1 @[tracepoint:syscalls:sys_enter_newstat]: 1 @[tracepoint:syscalls:sys_enter_fsync]: 1 @[tracepoint:syscalls:sys_enter_rt_sigsuspend]: 2 ... ``` 或者利用别名来简化命令使用 ``` $ alias kubectl-trace-run="kubectl trace run --imagename=registry.cn-hangzhou.aliyuncs.com/denverdino/kubectl-trace-runner" $ kubectl-trace-run docker-desktop -e 'tracepoint:syscalls:sys_enter_open { printf("%s %s\n", comm, str(args->filename)); }' trace 96209723-f439-4fb8-8bdc-d32e41e53e35 created $ kubectl trace attach 96209723-f439-4fb8-8bdc-d32e41e53e35 Attaching 1 probe... sntpc /etc/services sntpc /dev/urandom sntpc /dev/urandom ... ``` Have fun and Happy Halloween!

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
NoSQL Redis Docker
【从零开始】Docker Desktop:听说你小子要玩我
本文旨在帮助读者重新掌握Docker知识,特别是在Windows 10环境下安装与使用Docker Desktop的过程。文章详细介绍了从下载安装到配置镜像源的具体步骤,并通过Redis实例演示了如何拉取镜像和启动容器。
6634 1
【从零开始】Docker Desktop:听说你小子要玩我
|
6月前
|
存储 持续交付 Docker
Docker:颠覆传统开发的轻量级容器革命
Docker:颠覆传统开发的轻量级容器革命
|
11月前
|
存储 开发工具 开发者
揭秘 Microsoft.Docker.SDK:让容器开发更轻松的强大工具揭秘
随着云计算和容器技术的快速发展,`Docker` 已经成为容器化技术的事实标准。`Microsoft` 作为 `Docker` 的主要支持者和参与者,推出了 `Microsoft.Docker.SDK`,旨在帮助开发者更轻松地进行容器开发。本文将深入揭秘 Microsoft.Docker.SDK 的功能、使用方法以及它在容器开发中的应用。
328 13
|
11月前
|
运维 网络安全 文件存储
找不到类似 Docker Desktop 的 Web 管理界面?试试这些开源方案
Docker Desktop 是本地容器化开发的利器,但存在无法通过 Web 远程管理、跨平台体验不一致等问题。为此,推荐几款轻量级、可 Web 化管理的 Docker 工具:Portainer 功能全面,适合企业级运维;CasaOS 集成应用商店和 NAS 功能,适合家庭/个人开发环境;Websoft9 提供预集成环境,新手友好。这些工具能有效提升容器管理效率,满足不同场景需求。
827 3
|
11月前
|
安全 开发者 Docker
Docker技术背景与应用:解决现代开发中的关键问题
Docker作为一种革命性的容器化技术,极大地改变了现代软件开发的方式。通过解决环境一致性、依赖管理、部署复杂性和资源利用率等问题,Docker为开发者提供了高效、灵活的开发和部署环境。尽管面临着一些挑战,但随着技术的发展和完善,Docker将继续在现代软件开发中发挥重要作用。作为全栈工程师,掌握并善用Docker技术,将为我们的开发工作带来更多便利和可能性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
|
缓存 监控 开发者
掌握Docker容器化技术:提升开发效率的利器
在现代软件开发中,Docker容器化技术成为提升开发效率和应用部署灵活性的重要工具。本文介绍Docker的基本概念,并分享Dockerfile最佳实践、容器网络配置、环境变量和秘密管理、容器监控与日志管理、Docker Compose以及CI/CD集成等技巧,帮助开发者更高效地利用Docker。
|
缓存 运维 Docker
容器化运维:Docker Desktop 占用磁盘空间过大?教你轻松解决!
Windows Docker Desktop 使用过程中,因镜像、容器数据及构建缓存的累积,可能导致磁盘空间占用过高。通过删除无用镜像与容器、压缩磁盘以及清理构建缓存等方法,可有效释放空间。具体步骤包括关闭WSL、使用`diskpart`工具压缩虚拟磁盘、执行`docker buildx prune -f`清理缓存等。这些操作能显著减少磁盘占用,提升系统性能。
4648 5
|
数据可视化 数据挖掘 Docker
Docker Desktop 安装 ClickHouse 超级简单教程
Docker Desktop 安装 ClickHouse 超级简单教程
909 1