下载了linux_amd64_server.tar.gz和linux_amd64_client.tar.gz两个文件并且在说明文档上看到server的安装启动是:./nps install 和nps start
客户端的安装启动是:npc.exe install 其他参数(例如-server=xx -vkey=xx或者-config=xxx)和npc.exe start
要用ubuntu:22.04镜像构建nps和npc两个镜像
构建NPS(服务端)镜像
将以下内容保存为 Dockerfile.nps:
# 使用 Ubuntu 22.04 作为基础镜像
FROM ubuntu:22.04
# 设置环境变量,避免交互式安装时弹出时区选择等对话框
ENV DEBIAN_FRONTEND=noninteractive
# 安装必要的软件包,创建目录并清理缓存以减小镜像体积
RUN apt-get update && \
apt-get install -y --no-install-recommends wget && \
rm -rf /var/lib/apt/lists/* && \
mkdir -p /app/conf /app/data
# 将宿主机的 NPS 二进制文件和配置文件复制到镜像中
COPY linux_amd64_server.tar.gz /tmp/
RUN tar -zxvf /tmp/linux_amd64_server.tar.gz -C /app/ && \
rm -f /tmp/linux_amd64_server.tar.gz && \
chmod +x /app/nps
# 设置工作目录
WORKDIR /app
# 复制默认配置文件(如果宿主机构建目录下有 conf 文件夹,可选用)
# COPY conf /app/conf
# 暴露 NPS 常用端口
# 8080:Web管理界面, 8024:客户端连接, 80:HTTP代理, 443:HTTPS代理
EXPOSE 8080 8024 80 443
# 设置容器启动命令
CMD ["./nps"]
构建NPC(客户端)镜像
将以下内容保存为 Dockerfile.npc:
# 使用 Ubuntu 22.04 作为基础镜像
FROM ubuntu:22.04
# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive
# 安装必要的软件包,创建目录并清理缓存
RUN apt-get update && \
apt-get install -y --no-install-recommends wget && \
rm -rf /var/lib/apt/lists/* && \
mkdir -p /app/conf
# 将宿主机的 NPC 二进制文件复制到镜像中
COPY linux_amd64_client.tar.gz /tmp/
RUN tar -zxvf /tmp/linux_amd64_client.tar.gz -C /app/ && \
rm -f /tmp/linux_amd64_client.tar.gz && \
chmod +x /app/npc
# 设置工作目录
WORKDIR /app
# 设置容器启动命令
# 注意:这里使用环境变量,方便运行容器时覆盖
ENV NPC_SERVER=""
ENV NPC_VKEY=""
ENV NPC_TYPE="tcp"
CMD ./npc -server=${NPC_SERVER} -vkey=${NPC_VKEY} -type=${NPC_TYPE}
构建镜像
在包含 Dockerfile 和 .tar.gz 文件的目录下,执行以下命令构建镜像:
# 构建 NPS 服务端镜像
docker build -t my-nps -f Dockerfile.nps .
# 构建 NPC 客户端镜像
docker build -t my-npc -f Dockerfile.npc .
运行NPS服务端容器
建议使用 --net=host 模式运行NPS服务端,这样可以简化端口映射
# 首次运行生成默认配置文件
docker run -d --name nps-temp --net=host -v /path/to/nps/conf:/app/conf my-nps
# 等待几秒让容器生成默认配置文件
sleep 5
# 停止并删除临时容器
docker stop nps-temp && docker rm nps-temp
# 修改配置文件(根据实际情况调整)
# 主要修改 /path/to/nps/conf/nps.conf 中的 web_username, web_password, web_port, bridge_port 等[citation:3]
# 例如:web_username=admin, web_password=你的强密码, web_port=8080, bridge_port=8024
# 正式运行NPS服务端
docker run -d \
--name nps-server \
--restart=always \
--net=host \
-v /path/to/nps/conf:/app/conf \
-v /path/to/nps/data:/app/data \
my-nps
关键配置说明:
--net=host:容器使用宿主机的网络栈,直接绑定宿主机端口,无需 -p 映射。-v /path/to/nps/conf:/app/conf:将配置目录挂载到宿主机,防止容器删除后配置丢失。请将 /path/to/nps/conf 替换为你宿主机上的实际路径。-v /path/to/nps/data:/app/data:挂载数据目录,用于持久化存储。
运行NPC客户端容器
同样可以使用 --net=host 模式。
docker run -d \
--name npc-client \
--restart=always \
--net=host \
-e NPC_SERVER="你的NPS服务端IP:8024" \
-e NPC_VKEY="在NPS Web界面中添加客户端时生成的验证密钥" \
-e NPC_TYPE="tcp" \
my-npc
参数解释:
NPC_SERVER:你的NPS服务端的IP地址和端口(默认8024)。NPC_VKEY:在NPS Web管理界面(通常为 http://你的服务端IP:8080)中添加客户端时生成的"验证密钥"。这是客户端与服务端建立连接的核心凭证。NPC_TYPE:连接类型,一般使用tcp。
🔧 验证与调试
验证NPS服务端:
- 构建并运行NPS服务端容器后,访问 http://你的服务端IP:8080,使用你设置的账号密码登录Web管理界面。
- 查看NPC客户端连接:
登录NPS Web管理界面,在"客户端"页面查看对应Vkey的客户端连接状态。 - 日志排查:
如果客户端未能正常连接,可以查看其日志:docker logs npc-client。
💡 进阶优化
- 镜像体积优化:上述Dockerfile使用了Ubuntu基础镜像。若追求更小的镜像体积,可考虑使用Alpine Linux作为基础镜像,但需注意二进制文件的依赖兼容性。
- 使用Docker Compose:你可以编写 docker-compose.yml 文件来统一管理NPS和NPC服务的启动配置。
- 配置文件细化:NPS服务端的功能非常丰富,你可以在 nps.conf 中进一步配置隧道、代理等。
使用 Docker Compose 运行 NPS 和 NPC 的完整配置方案:
项目目录结构
nps-docker/
├── docker-compose.yml
├── nps-server/
│ ├── conf/
│ └── data/
└── npc-clients/
└── client1/
└── conf/
Docker Compose 配置
方案1:基础版本(推荐)
# docker-compose.yml
version: '3.8'
services:
# NPS 服务端
nps-server:
build:
context: .
dockerfile: Dockerfile.nps
container_name: nps-server
restart: always
network_mode: "host"
volumes:
- ./nps-server/conf:/app/conf
- ./nps-server/data:/app/data
# 首次运行需要生成配置,取消下面的注释
# command: ["./nps"]
# 正常运行时使用默认CMD
# NPC 客户端示例 1
npc-client-1:
build:
context: .
dockerfile: Dockerfile.npc
container_name: npc-client-1
restart: always
network_mode: "host"
environment:
- NPC_SERVER=你的服务端IP:8024
- NPC_VKEY=客户端1的验证密钥
- NPC_TYPE=tcp
depends_on:
- nps-server
# NPC 客户端示例 2(多个客户端)
npc-client-2:
build:
context: .
dockerfile: Dockerfile.npc
container_name: npc-client-2
restart: always
network_mode: "host"
environment:
- NPC_SERVER=你的服务端IP:8024
- NPC_VKEY=客户端2的验证密钥
- NPC_TYPE=tcp
depends_on:
- nps-server
方案2:使用端口映射(不用 host 模式)
# docker-compose.yml
version: '3.8'
services:
nps-server:
build:
context: .
dockerfile: Dockerfile.nps
container_name: nps-server
restart: always
ports:
- "8080:8080" # Web管理界面
- "8024:8024" # 客户端连接
- "80:80" # HTTP代理
- "443:443" # HTTPS代理
- "8081-8090:8081-8090" # 其他代理端口范围
volumes:
- ./nps-server/conf:/app/conf
- ./nps-server/data:/app/data
networks:
- nps-network
npc-client-1:
build:
context: .
dockerfile: Dockerfile.npc
container_name: npc-client-1
restart: always
environment:
- NPC_SERVER=nps-server:8024 # 使用服务名而不是IP
- NPC_VKEY=客户端1的验证密钥
- NPC_TYPE=tcp
networks:
- nps-network
depends_on:
- nps-server
networks:
nps-network:
driver: bridge
方案3:完整生产版本
# docker-compose.yml
version: '3.8'
x-npc-template: &npc-template
build:
context: .
dockerfile: Dockerfile.npc
restart: unless-stopped
network_mode: "host"
environment:
NPC_TYPE: "tcp"
healthcheck:
test: ["CMD", "ps", "aux", "|", "grep", "npc"]
interval: 30s
timeout: 10s
retries: 3
services:
# NPS 服务端
nps-server:
build:
context: .
dockerfile: Dockerfile.nps
container_name: nps-server
restart: unless-stopped
network_mode: "host"
volumes:
- ./nps-server/conf:/app/conf
- ./nps-server/data:/app/data
- /etc/localtime:/etc/localtime:ro # 同步时间
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
healthcheck:
test: ["CMD", "netstat", "-tulnp", "|", "grep", ":8024"]
interval: 30s
timeout: 10s
retries: 3
# 多个NPC客户端
npc-web-server:
<<: *npc-template
container_name: npc-web-server
environment:
- NPC_SERVER=你的服务端IP:8024
- NPC_VKEY=web服务器的验证密钥
npc-database:
<<: *npc-template
container_name: npc-database
environment:
- NPC_SERVER=你的服务端IP:8024
- NPC_VKEY=数据库的验证密钥
npc-ssh-server:
<<: *npc-template
container_name: npc-ssh-server
environment:
- NPC_SERVER=你的服务端IP:8024
- NPC_VKEY=ssh服务器的验证密钥
部署步骤
准备目录和文件
# 创建项目目录
mkdir nps-docker && cd nps-docker
# 创建必要的目录
mkdir -p nps-server/{conf,data}
mkdir -p npc-clients/{client1,client2}/conf
# 确保有 Dockerfile 和二进制文件
cp /path/to/linux_amd64_server.tar.gz .
cp /path/to/linux_amd64_client.tar.gz .
首次运行生成配置
# 临时运行NPS生成默认配置
docker compose run --rm nps-server
# 等待几秒后停止,配置文件会生成在 nps-server/conf/ 目录
# 按 Ctrl+C 停止
# 编辑配置文件
vim nps-server/conf/nps.conf
修改关键配置:
web_username=admin
web_password=你的强密码
web_port=8080
bridge_port=8024
启动所有服务
# 启动所有服务
docker compose up -d
# 查看运行状态
docker compose ps
# 查看日志
docker compose logs -f
# 查看特定服务日志
docker compose logs nps-server
docker compose logs npc-client-1
管理命令
# 启动服务
docker compose start
# 停止服务
docker compose stop
# 重启服务
docker compose restart
# 停止并删除容器
docker compose down
# 重新构建并启动
docker compose up -d --build
# 查看服务状态
docker compose ps
# 查看所有日志
docker compose logs
# 进入容器
docker compose exec nps-server bash
环境变量配置
创建 .env 文件
# .env
NPS_SERVER_IP=你的公网IP
NPC_VKEY_WEB=web服务器的vkey
NPC_VKEY_DB=数据库的vkey
NPC_VKEY_SSH=ssh服务器的vkey
然后在 docker-compose.yml 中使用:
environment:
- NPC_SERVER=${NPS_SERVER_IP}:8024
- NPC_VKEY=${NPC_VKEY_WEB}
完整的部署脚本
#!/bin/bash
# deploy-nps.sh
set -e
echo "开始部署 NPS 服务..."
# 创建目录
mkdir -p {nps-server,npc-clients}/{conf,data}
# 复制二进制文件
cp linux_amd64_server.tar.gz linux_amd64_client.tar.gz .
# 生成配置(首次运行)
echo "生成默认配置..."
docker compose run --rm nps-server &
sleep 10
docker compose down
# 修改默认密码
echo "请编辑 nps-server/conf/nps.conf 修改默认密码"
echo "主要修改: web_password=你的强密码"
read -p "按回车继续..."
# 启动服务
echo "启动服务..."
docker compose up -d
echo "部署完成!"
echo "Web管理界面: http://你的服务器IP:8080"
echo "查看状态: docker compose ps"
echo "查看日志: docker compose logs -f"
使用说明
首次部署:
- 运行部署脚本或手动执行上述步骤
- 访问 Web 界面添加客户端获取 VKEY
- 更新 docker-compose.yml 中的 VKEY
日常管理:
# 启动所有服务
docker compose up -d
# 停止所有服务
docker compose down
# 更新配置后重启
docker compose restart nps-server
故障排查:
# 查看所有服务状态
docker compose ps
# 查看服务日志
docker compose logs nps-server
# 进入容器检查
docker compose exec nps-server bash
这种 Docker Compose 的方式可以让你轻松管理多个 NPC 客户端,并且配置清晰、易于维护。
「点点赞赏,手留余香」
声明:本文为原创文章,版权归旷野小站所有,欢迎分享本文,转载请保留出处!