[P4基础]p4app的Docker镜像仓使用详解

How to use the p4lang/p4app Docker image

本文参考 孙勇峰博客 和 p4app README 以及 p4app Dockerfile 结合自己的理解做一些记录,有错误或不足之处欢迎批评指正。

简介

p4app是一个可以构建、运行、调试和测试P4程序的工具,p4app背后蕴含的哲学是“简单的事情应尽可能简单”,旨在使小而简单的P4程序易于编写、易于与他人分享。

p4lang/p4app的镜像结构

Docker 镜像是分层结构以Ubuntu 16.04为base镜像依次构建,p4app为最顶层.
对于如何构建这些镜像,有兴趣的可以看p4app的Dockerfile.

p4app

p4c

pi

bmv2

third-party

Ubuntu 16.04

安装p4app

下载github的p4app源码

$ git clone https://github.com/p4lang/p4app

为了方便可将p4app脚本拷贝到PATH路径

$ sudo cp p4app /usr/local/bin

安装docker

以下两种均可

docker安装教程

一键安装

$ wget -qO- https://get.docker.com/ | sh

如何使用

p4app运行p4app程序包. p4app程序包是一个以.p4app为后缀的目录,例如你用P4写了一个路由器程序,将其放在router.p4app目录文件夹下. 该目录应当包括你的P4程序、其他与你的程序相关联的文件和一个p4app.json文件. p4app.json指定如何执行你的p4程序(自定义执行动作).

在p4app/examples中包含多个样例,具体如下:

broadcast.p4app

compile_only.p4app

customtopo.p4app

multi_iface.p4app

multiswitch.p4app

paxos_acceptor.p4app

simple_counter.p4app

simple_router.p4app

source_routing.p4app

例如,你要执行simple_router.p4app程序包

$ p4app run p4app/examples/simple_router.p4app

当你执行这条命令,最终会进入mininet命令行界面.

那么执行这条命令后具体发生了什么?我们先来看看p4app这个可执行脚本在做什么

Ps:对于脚本感兴趣的可以查看p4app脚本源码

p4app可执行脚本详解 p4app命令参数

p4app run

运行p4app程序包

p4app run

运行p4app程序包并指定target

p4app build

构建p4app程序包并输出json文件

p4app pack

将p4app程序包压缩为单个文件,替换当前目录下的p4app程序包,使用gzip压缩

p4app unpack

解压上述压缩包

p4app update

更新到最新版本的p4app的docker镜像

p4app exec

在最新运行的p4app容器实例中执行一条命令

p4app run 内部具体执行流程

以simple_router.p4app为例

执行run-comman函数

传入参数为目录

//如simple_router.p4app $ run-p4app /tem/p4app.tar.gz.XXXXXX

传入参数为文件

$ run-p4app 文件的绝对路径 简单理解,如果是文件夹就压缩打包后传入其路径,是文件就传入绝对路径.

执行run-p4app函数

重点来了,运行p4app容器实例

$ docker run --privileged --interactive --tty --rm \ --name "p4app_$RANDOM" \ -v $1:/tmp/app.tar.gz \ -v "P4APP_LOGDIR":/tmp/p4app_logs \ $P4APP_IMAGE /tmp/p4app.tar.gz "${@:2}" #docker run # --tty 分配tty设备 可支持终端登录 # --interactive 打开STDIN 用于控制台交互 # 上面两个是-it # --name 随机取了一个名字 # -v 将主机上/tmp/p4app.tar.gz.XXXXXX 挂载到容器的 /tmp/app.tar.gz 中 # 如果只是文件 将文件绝对路径挂载到容器的 /tem/app.tar.gz中 # -v 将主机的log目录挂载到容器的/tmp/p4app_logs 中 # $P4APP_IMAGE $APP_TO_RUN "${@:2}" # 指定 镜像 文件 其他参数(指定target)

进入容器实例

p4app容器实例启动后执行的是p4apprunner.py脚本

p4apprunner.py参数

必要参数

app

p4app程序包路径

target

compile-bmv2 编译成bmv2目标

mininet 单P4交换机测试

multiswitch 多P4交换机测试

stf 进行stf测试

custom

可选参数

--buid-dir

构建目录,默认为/tmp

--quiet

不显示log消息

--build-only

仅编译不运行

--json

Use this compiled JSON file instead of compiling

--manifest

manifest 清单文件路径,默认为./p4app.json

p4apprunner.py解析流程

解压提取p4app程序包

根据p4app程序包中的p4app.json解析

根据其中的target执行相应函数

p4app build 具体执行流程

执行build-command函数

$ run-command --build-only "${@:3}"

执行run-command函数(同上)

执行run-p4app函数(同上)

进入容器实例(同上)

copy容器中$P4APP_LOGDIR/program.json到host本地目录下

总结,添加--build-only选项,仅编译p4app程序输出json文件

p4app运行流程小结

第一次运行p4app时会自动下载docker镜像p4lang/p4app:latest

该镜像中包括P4编译器、mininet、抓包工具tshark、发包工具scapy、net-tools和nmap套件等工具

启动一个p4app容器实例,并在容器中执行p4apprunner.py脚本

根据传入的p4app.json执行相应操作

p4app.json解析 p4app程序包最终如何运行,由manifest指定的p4app.json文件配置.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyjyw.html