目前应用程序按宿主类型分为以下三种:
-
终端应用 (Terminal)
通过控制台运行,适用调试。
-
后台应用 (Daemon)
编译和部署需要指定操作系统平台,由特定的容器进行托管运行。
- Linux/Unix 系统中由 systemd 进行托管,需要部署对应的
*.service文件; - Windows 系统中由服务控制器进行托管,需要以 管理员 模式运行;
- 使用 install.cmd 脚本安装服务;
- 使用 uninstall.cmd 脚本卸载服务;
- Linux/Unix 系统中由 systemd 进行托管,需要部署对应的
-
网站应用 (Web)
表示 Web 后台应用程序,通常按站点进行划分,常用站点:
- 管理端 (administration)
- 商家端 (business)
- 客户端 (customer)
- 伙伴端 (partner)
- 网关端 (gateway)
- 设备端 (iot)
宿主程序只负责初始化运行时环境,作为插件的承载容器其自身并不含有具体的功能实现,我们通过将需要的插件及其相关附属(配置、证书)文件放置在 plugins 目录下的相应子目录中,这个行为即为部署。
运行 deploy.cmd (Windows) 或 deploy.sh (Linux/Unix) 脚本以执行由部署文件 (*.deploy) 所定义的部署内容。
提示:部署脚本依赖 Zongsoft.Tools.Deployer 工具进行部署操作,有关该工具的使用说明,请参考其开源项目的相关文档:
通常配置文件与特定的 产品、项目、部署平台 (如:单机、内网、私有云、公有云) 及 环境 (如:开发、测试、生产) 等相关,所以应该将这些特定相关性的文件单独存放在 /hosting/.deploy 目录下,以便于统一管理与维护。
提示:更多部署项的用法请参考宿主程序目录中的
.deploy部署文件。
应该根据配置内容的环境相关性来定义配置文件,相应的环境名作为配置文件名的尾部。下面以 Zongsoft.Security 插件的配置文件为例进行说明:
Zongsoft.Security.option表示环境无关的配置文件,其配置作为其他环境有关性配置的缺省值;
Zongsoft.Security.test.option表示测试环境有关的配置文件,譬如该配置文件内的数据库连接字符串指向的是测试数据库并且使用的是内网地址等。
Zongsoft.Security.production.option表示生产环境有关的配置文件,譬如该配置文件内的数据库连接字符串指向的是生产数据库并且使用的是内网地址等。
Zongsoft.Security.development.option表示开发环境有关的配置文件,譬如该配置文件内的数据库连接字符串指向的是开发数据库并且使用的是内网地址等。
Zongsoft.Security.test-debug.option表示测试环境有关的配置文件,譬如该配置文件内的数据库连接字符串指向的是测试数据库并且使用的是外网地址等。
Zongsoft.Security.production-debug.option表示生产环境有关的配置文件,譬如该配置文件内的数据库连接字符串指向的是生产数据库并且使用的是外网地址等。
Zongsoft.Security.development-debug.option表示开发环境有关的配置文件,譬如该配置文件内的数据库连接字符串指向的是开发数据库并且使用的是外网地址等。
位于 hosting 目录下的 .deploy 目录即为存放部署相关的各种资源的‘根’目录,其下级结构如下:
-
certificates证书文件目录注:部署平台无关的证书文件。
-
{scheme}部署方案certificates证书文件目录注:与部署方案有关联的证书文件。
options配置文件目录
在运行 deploy.cmd 脚本之前必须确保 deploy 工具已经安装,可通过下面命令查看已安装的全局工具:
dotnet tool list -g如果尚未安装 deploy 工具,可通过下面命令进行全局安装:
dotnet tool install -g zongsoft.tools.deployer如果已经安装了 deploy 工具,可通过下面命令进行升级更新:
dotnet tool update -g zongsoft.tools.deployer💡 有关 Zongsoft.Tools.Deployer 部署工具的更多内部原理与实现,请访问该项目的开源网址:https://github.com/Zongsoft/tools/deployer
💡 如果需要本地编译调试 Zongsoft 框架源码,建议安装 Cake.Tool 工具:
dotnet tool install -g cake.tool
由于一些插件需要使用到 Redis、RustFS、MySQL 或 PostgreSQL 等,因此可以容器化这些依赖的服务。
建议安装 Podman CLI 进行容器化处理,下面是它的下载地址:
💡 如果是 Windows 环境,请确保安装了 WSL-2。
在 %USERPROFILE% 目录中可能存在名为 .wslconfig 文件,该文件中可能指定了 WSL 的网络模式,譬如:
[wsl2]
networkingMode=Mirrored
dnsTunneling=true
firewall=false
autoProxy=true💡 注意:这表明 WSL 网络模式为 镜像 模式,这种模式下的多个容器实例之间网络很可能无法互通,即使在 .wslconfig 文件中指定了 hostAddressLoopback=true 选项,同时在 .yaml 容器文件中也指定了 hostNetwork: true 参数都不行,更稳妥的方案是采用 NAT 网络模式。下面是重置 WSL 网络模式为 NAT 模式的操作步骤。
- 关闭 WSL 虚拟机
wsl --shutdown-
删除
.wslconfig文件-
方式一:在文件资源管理器地址栏输入:
%USERPROFILE%,找到并删除.wslconfig文件。需要在资源管理器的选项设置中开启显示隐藏文件。
-
方式二:在宿主机的 PowerShell 中执行下列命令进行删除:
rm $env:USERPROFILE\.wslconfig -Force
-
-
重置网络设置
在宿主机的 PowerShell 中执行以下命令:
注:执行完下面两步后可能需要重启电脑。
netsh winsock reset
netsh int ip reset- 检查网络情况
重启后,在宿主机的 PowerShell 中执行以下命令:
# 检查 WSL 网络接口状态
wsl ip addr show eth0
# 检查某个端口是否可访问(以6379为例)
wsl ss -tlnp | grep ':6379'预期结果:
- 返回的
eth0网络接口状态应该变为UP- 应该能看到
inet地址 (通常为172.x.x.x范围)
为方便开发,可以将宿主机中的相关开发目录映射到虚拟机的根目录中,操作步骤:
-
进入虚拟机,编辑
/etc/fstab文件:sudo vi /etc/fstab
-
在文件末尾追加 (示例):
/mnt/d/Automao /Automao none bind 0 0 /mnt/d/Zongsoft /Zongsoft none bind 0 0 -
重启虚拟机
podman machine stop podman machine start
基于某些众所周知的国情,务必先配置 Docker 镜像,步骤如下:
-
进入虚拟机
podman machine ssh
-
编辑容器注册表文件
sudo vi /etc/containers/registries.conf
编辑该文件内容大致如下:
[[registry]] prefix = "docker.io" location = "docker.io" [[registry.mirror]] prefix = "mcr.microsoft.com" location = "mcr.m.daocloud.io" [[registry.mirror]] location = "docker.m.daocloud.io"
-
退出并重启虚拟机
podman machine stop podman machine start
我们提供了一些 Pod 容器文件:
-
zongsoft.pod-host.yaml 该文件定义了一个包含 .NET SDK 10 以及
systemd、nginx等开发环境的容器。💡 该容器定义了网络代理,你应该根据自己的实际情况编辑该文件中的代理设置。
-
zongsoft.pod-redis.yaml 该文件定义了 Redis 分布式缓存容器。
-
zongsoft.pod-rustfs.yaml 该文件定义了 RustFS 分布式文件系统容器。
-
zongsoft.pod-mysql.yaml 该文件定义了 MySQL 数据库容器,以及一个名为
zongsoft的数据库 (该库已初始化),确保开箱即用。 -
zongsoft.pod-postgres.yaml 该文件定义了 PostgreSQL 数据库容器,以及一个名为
zongsoft的数据库 (该库已初始化),确保开箱即用。
请确保 hosting 的同级位置有如下仓库,因为 zongsoft 数据库创建后会加载运行这些仓库中的 SQL 脚本,以完成建表和数据初始化。
使用 zongsoft.pod(start).cmd 和 zongsoft.pod(stop).cmd 脚本可以更方便的启用或停止指定的容器,并确保它创建的容器都共享同个网络。
-
在 文件管理器 中双击
zongsoft.pod(start).cmd文件,或者在 命令提示符 中运行该脚本文件;在提示中根据需要输入要启动的容器:
host启动 宿主应用程序 的开发容器;redis启动 Redis 分布式缓存容器;rustfs启动 RustFS 分布式文件容器;mysql启动 MySQL 数据库容器;postgres启动 PostgreSQL 数据库容器。
-
使用下列命令检查 Pod 是否成功运行
podman ps -a --pod
- 💡 当
host容器启动时会下载并初始化 systemd、nginx 等基础服务,即使容器启动成功,而 systemd、nginx 可能尚未准备就绪,建议稍等一会再进入podmapodman exec -it zongsoft-host bash容器虚拟机。
- 通过
podman logs zongsoft-host命令查看其启动日志以确定加载进度。
- 💡 由于 MySQL 和 PostgreSQL 数据库容器在启动时会执行建表及初始化数据等 SQL 操作,因此即使容器已显示启动成功,也建议稍等片刻再连接数据库,以确保相关 SQL 脚本已执行完成。
- 在 文件管理器 中双击
zongsoft.pod(stop).cmd文件,或者在 命令提示符 中运行该脚本文件;在提示中根据需要输入要关闭的容器:
*关闭所有容器;host关闭 宿主应用程序 的开发容器;redis关闭 Redis 分布式缓存容器;rustfs关闭 RustFS 分布式文件容器;mysql关闭 MySQL 数据库容器;postgres关闭 PostgreSQL 数据库容器。
在容器中如果需要连接到其他容器中的服务,需要使用连接服务容器的 Pod 名作为其连接的网络地址。
| Pod 名 | 容器名 |
|---|---|
zongsoft |
zongsoft-host |
zongsoft.io |
zongsoft.io-rustfs |
zongsoft.data |
zongsoft.data-mysql |
zongsoft.data |
zongsoft.data-postgres |
zongsoft.caching |
zongsoft.caching-redis |
-
进入
zongsoft-host容器:podman exec -it zongsoft-host bash -
连接到其他容器服务
# 访问 RustFS 的管理页面(网址为 RustFS 容器的 Pod 名) curl -L -A "Mozilla/5.0(Linux; x64)" http://zongsoft.io:9001 # 连接 Redis 服务(连接地址为 Redis 容器的 Pod 名) redis-cli -h zongsoft.caching -p 6379
-
使用 Redis 服务
zongsoft.caching:6379> auth xxxxxx OK zongsoft.caching:6379> get key (nil)
-
查看容器日志
podman logs zongsoft-host podman logs zongsoft.data-mysql podman logs zongsoft.data-postgres podman logs zongsoft.caching-redis
-
进入指定容器的 bash
podman exec -it zongsoft-host bash podman exec -it zongsoft.data-mysql bash podman exec -it zongsoft.data-postgres bash podman exec -it zongsoft.caching-redis bash
-
启动 Pod 容器
podman kube play --replace .\zongsoft.pod-redis.yaml podman kube play --replace .\zongsoft.pod-mysql.yaml podman kube play --replace .\zongsoft.pod-postgres.yaml
-
关闭 Pod 容器
podman kube down .\zongsoft.pod-host.yaml podman kube down .\zongsoft.pod-redis.yaml podman kube down .\zongsoft.pod-mysql.yaml podman kube down .\zongsoft.pod-postgres.yaml
-
停止所有容器
podman stop -a
-
停止并移除所有容器及卷
podman rm -afv
-
删除本地映像
podman rmi rustfs:latest