ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

gVisor + Docker 实战:用 runsc 沙箱运行时部署 WordPress 站点

gVisor + Docker 实战:用 runsc 沙箱运行时部署 WordPress 站点 gVisor Docker 实战用 runsc 沙箱运行时部署 WordPress 站点【免费下载链接】gvisorApplication Kernel for Containers项目地址: https://gitcode.com/GitHub_Trending/gv/gvisor本文基于 gVisor 官方教程讲解如何在 Docker 中使用runscgVisor 容器运行时部署一个由 WordPress 前端 MySQL 后端组成的两容器站点。读完你将掌握runsc install如何将 gVisor 注册为 Docker 运行时、--runtimerunsc下 WordPress 与 MySQL 的完整部署流程以及gVisor 只沙箱化前端、不沙箱化数据库这一生产取舍背后的性能原理。前置条件安装并注册 runsc 运行时按照 gVisor 的 Docker 快速入门 完成安装要求 Docker 17.09.0 或更高版本并假定运行时名称为runsc。核心步骤用runsc install将 gVisor 注册为名为runsc的 Docker 运行时它会向/etc/docker/daemon.json写入运行时条目sudo runsc install重启 Docker 守护进程使配置生效sudo systemctl restart docker源码解析runsc install到底做了什么从 runsc/cmd/install.go 的源码可以确认该命令的具体行为默认目标配置文件为/etc/docker/daemon.json--config_file可覆盖运行时默认名为runsc--runtime可自定义如runsc-debug命令会把runtimes映射中指定运行时的path当前 runsc 可执行文件绝对路径与runtimeArgs--之后透传给 runsc 的参数如--debug、--strace写入 daemon 配置见 doInstallConfig写入前会把旧配置备份为daemon.json~失败可回滚见 defaultWriteConfig对应地仓库提供了uninstall子命令用于从 daemon.json 中移除runsc运行时条目。因此runsc install --runtime runsc-debug -- --debug --strace这类命令实际是注册一个带调试参数透传的运行时这也是 Docker 快速入门文档中调试模式的实现原理。部署架构与沙箱策略WordPress 站点需要两个容器前端 Web 服务器WordPress Apache与后端 MySQL 数据库。本教程的部署策略是WordPress 前端使用--runtimerunsc沙箱化前端是对外暴露面积最大、攻击面最关键的组件gVisor 在这里的安全/性能权衡最划算MySQL 后端不使用 runscgVisor 会带来额外的运行时开销官方在生产指南中明确不建议把数据库放进沙箱因为数据库属于 I/O 密集型负载。这一建议有性能模型上的依据。根据 Performance GuidegVisor 的开销分为两类结构性开销structural costsSentry 内核引入额外内存且系统调用必须穿越更多软件层。对系统调用密集型应用高性能数据存储、静态网络服务影响显著——MySQL 正是这类负载小型操作类似 redis 中的短命令相对开销最大实现性开销implementation costsgVisor 是独立的系统调用面实现网络栈与内部 VFS 仍在持续优化。相反gVisor 对纯内存访问和 CPU 指令执行不引入额外开销前端这类每请求做较多用户态工作的 Web 服务受影响相对较小。完整的权衡讨论可参考 Production guide。部署 WordPress 站点第 1 步定义共享环境变量两个容器通过以下环境变量共享数据库凭据export MYSQL_PASSWORD${YOUR_SECRET_PASSWORD_HERE?} export MYSQL_DBwordpress export MYSQL_USERwordpress其中${VAR?}是 bash 语法若MYSQL_PASSWORD未设置会直接报错退出避免空密码被静默写入。第 2 步启动 MySQL 后端容器# If you want to sandbox the database, add --runtimerunsc to this command. $ docker run --name mysql -d \ -e MYSQL_RANDOM_ROOT_PASSWORD1 \ -e MYSQL_PASSWORD${MYSQL_PASSWORD} \ -e MYSQL_DATABASE${MYSQL_DB} \ -e MYSQL_USER${MYSQL_USER} \ mysql:5.7 # Wait until this message appears in the log. $ docker logs mysql | grep port: 3306 MySQL Community Server (GPL)参数说明参数作用--name mysql指定容器名为mysql后续前端通过--link用这个名字解析主机名-d后台运行-e MYSQL_RANDOM_ROOT_PASSWORD1让官方 MySQL 镜像随机生成 root 密码-e MYSQL_PASSWORD / MYSQL_DATABASE / MYSQL_USER创建应用数据库wordpress及专用账号wordpress注意此命令没有--runtimerunsc数据库走原生 runc 运行时。若确实需要沙箱化数据库按注释加上该参数即可但如上文所述并不推荐。第二条命令会阻塞等待直到 MySQL 初始化完成、日志中出现port: 3306 MySQL Community Server (GPL)提示这是前端连接前的健康检查点。第 3 步启动 WordPress 前端容器runsc 沙箱$ docker run --runtimerunsc --name wordpress -d \ --link mysql:mysql \ -p 8080:80 \ -e WORDPRESS_DB_HOSTmysql \ -e WORDPRESS_DB_USER${MYSQL_USER} \ -e WORDPRESS_DB_PASSWORD${MYSQL_PASSWORD} \ -e WORDPRESS_DB_NAME${MYSQL_DB} \ -e WORDPRESS_TABLE_PREFIXwp_ \ wordpress参数说明参数作用--runtimerunsc使用 gVisor 作为本容器的容器运行时前提是该运行时已在 daemon.json 注册--link mysql:mysql将前一步的mysql容器链接到本容器并在容器内以主机名mysql可达-p 8080:80把宿主机 8080 端口映射到容器内 80 端口浏览器通过http://localhost:8080访问-e WORDPRESS_DB_HOSTmysqlWordPress 通过链接得到的主机名连接数据库-e WORDPRESS_DB_USER / WORDPRESS_DB_PASSWORD / WORDPRESS_DB_NAME与 MySQL 侧变量一致完成账号、库名配对-e WORDPRESS_TABLE_PREFIXwp_设置数据表前缀第 4 步验证访问打开浏览器访问http://localhost:8080进入 WordPress 安装向导即可完成部署。验证容器确实在 gVisor 中运行在沙箱内执行dmesg会看到 gVisor 特有的启动日志而非宿主机内核日志$ docker run --runtimerunsc -it ubuntu dmesg [ 0.000000] Starting gVisor... ... [ 2.610538] Rewriting operating system in Javascript... [ 2.613217] Ready!需要强调官方文档原话这种特征很容易被攻击者伪造因此安全敏感的上下文里应用绝不应依赖dmesg来判定自己是否在沙箱中。从单容器命令走向编排Compose 与 Kubernetes本教程用裸docker run完成演示官方还给出了两种演进路径Docker Compose见 Wordpress with Docker Compose。用一份docker-compose.yaml声明db与wordpress两个服务WordPress 侧通过runtime: runsc指定沙箱。该文档特别提醒了一个 gVisor 特有的坑Compose 默认自建网络并用127.0.0.11提供内部 DNS而该地址在 gVisor 沙箱内不可达因此需要显式配置dns: [8.8.8.8]并使用允许路由到该地址的网络另外 docker-compose 3.x 早期版本移除了服务级runtime字段需使用 2.x 格式或 docker-compose 1.27.0。Kubernetes / GKE Sandbox见 WordPress with Kubernetes。思路相同——仅给 WordPress Deployment 加runtimeClassName: gvisorMySQL 保持注释掉的默认运行时用 Secret 共享密码并用kubectl get runtimeclass/gvisor验证节点上 gVisor 运行时已就绪。上线生产前的检查清单在把这套部署推向生产之前建议通读 Production guide要点包括先通过网络隔离、服务网格等手段收敛对外攻击面再决定哪些组件需要沙箱化平台选择是对性能影响最大的决策裸机推荐 KVM 平台虚拟机中推荐systrap平台文件 I/O 与网络通常是受沙箱化影响最大的两项可分别通过 文件系统配置 与网络栈选项如半可信负载的网络直通进一步调优I/O 密集数据库、网络密集负载均衡负载性能受损最明显CPU 密集型负载几乎无感——这正是本教程前端进沙箱、数据库留在宿主机的部署依据。至此你已经完整走通了 gVisor Docker 的 WordPress 部署理解了runsc运行时的注册机制、两容器的环境变量与网络串联以及沙箱化边界划分背后的安全与性能权衡。【免费下载链接】gvisorApplication Kernel for Containers项目地址: https://gitcode.com/GitHub_Trending/gv/gvisor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表