[ Docker ] 部署 nps 和 npc 实现内网穿透

云主机上运行 nps

创建映射目录

mkdir -p ~/docker/nps/config

拉取镜像

docker pull oldiy/nps-server

运行容器

创建容器

docker run -d --name nps --net=host -v /root/docker/nps/config:/nps/conf oldiy/nps-server

现在 nps 已经开始运行了。

停止运行容器

docker stop nps

为什么这里要停止运行呢?

因为这时候在 config 目录下已经生成了一些配置文件,考虑到安全性,我们需要做一些改动。

修改配置

vim /root/docker/nps/config/nps.conf

打开后重点关注下面这几项:

...
bridge_port=8024    # 客户端连接端口
...
web_username=admin  # 后台管理用户名
web_password=123    # 后台管理密码
web_port = 8080     # 后台管理端口
...

以上是默认的配置,建议改掉。

启动容器

docker start nps

现在可以在网页端访问 <ip_addr>:<web_port>,并通过用户名 <web_username> 和密码 <web_password> 登录后台管理界面了。
能够成功访问后,继续下面的步骤。

添加客户端

点击左侧菜单栏的 客户端 选项,再点击新增。

设置一个 客户端验证密钥,这里可以随便填。压缩、加密愿意的话也可以选 yes。

设置好后点击 新增 即可。

留意一下这里的 id 和 vkey

本地机上运行 npc

本地机建议选择一台 7*24 小时运行的设备,一般是路由器或者 NAS ,我这里就选择群晖了,DSM 有很好用的 docker 图形化管理套件,所以下面用图形化界面演示如何部署 npc 。

拉取镜像

点击菜单栏中的注册表,搜索 npc-client,下载第一个就行。

创建容器

点击菜单栏中的映像,找到下载好的npc,启动。

高级设置->网络中注意勾选使用与 Docker Host 相同的网络。

再到高级设置->环境中修改两个环境变量:

  • SERVERIP
    对应云主机的 <ip>:<bridge_port>
  • VKEY
    对应上面添加过的客户端的 vkey

接着一路点击 应用,启动容器即可。

这时候在 nps 后台可以看到客户端已经在线。

后台配置 nps

前面部署 nps 时候已经配置了一部分了,接下来要配置的就是具体需要穿透的端口了。

添加 tcp 隧道

这里举例配置一下 Jellyfin 的 http 端口 8096
进入 nps 后台管理,点击左侧菜单栏的 客户端 选项,再点击新增。

  • 类型
    这里选 tcp 不用动它。
  • 备注
    随便填,方便自己记就行。
  • 服务器端口
    指外放访问端口,我这里跟 Jellyfin 内网一致了,这里只是为了演示用默认,等下就会改掉。
  • 目标
    指内网对应服务的地址和端口。
  • 客户端 id
    就是上面我说了要留意一下的 id,我这里是 3

然后点击 新增

这样一条隧道就添加好了。

至此内网穿透算是部署好了。

尝试访问一下 Jellyfin。

容器保活

有时候运行的容器会自己挂掉,虽然不经常发生,但是偶尔来一次,遇上刚好要用的时候就很烦人。
下载演示我在服务端如何让容器保活的,方法比较粗暴但有效。

创建目录

创建目录来存放脚本和日志文件。

mkdir -p /root/docker/nps/script
mkdir -p /root/docker/nps/log

获取容器 ID

docker ps -q --no-trunc

会得到一长串 ID,记下来 <nps_id>

如果你返回了多个 ID,那你应该知道要怎么区分那个是 nps 的。

keepActive.sh

创建 bash 脚本,放到 /root/docker/nps/script/keepActive.sh

#!/bin/bash
cur=$(cd $(dirname $0); pwd -P)
log="$cur/../log/log"
a=$(docker ps -q --no-trunc | grep '<nps_id>')  # 这里其实就是去匹配看看当前运行中的容器有没有nps,<nps_id>改成上一步获取到的。
if [[ "_$a" == "_" ]]; then
    docker restart nps  # 第一次重启 nps
    if [[ $? == 0 ]]; then
        echo "Revive  $(date +'%F %T')" >> $log
    else
        echo "Failed  $(date +'%F %T')" >> $log
        systemctl restart docker.service  # 重启失败大概率是 docker 服务挂了,这里重启服务
        docker restart nps
        echo "Restart $(date +'%F %T')" >> $log
    fi
else
    echo "Active  $(date +'%F %T')" >> $log
fi

如果是服务 docker 挂了,且重启失败,那就不是保不保活的问题了,登上服务器检查吧。

crontab.set

创建一个 crontab.set,用来配置定时任务。这个文件就随便放了,一次性的。

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

*  *  *  *  * /root/docker/nps/script/keepActive.sh

接着运行:

crontab crontab.set

这里是配置一分钟运行一次 keepActive.sh 脚本,所以如果 nps 挂了,一分钟内它就会重启了。

如果你还配置了其他的定时任务,那你应该知道怎么设置 crontab,别把以前配置的任务给覆盖了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在将前端项目部署Docker 中时,你需要执行以下步骤: 1. 创建一个 Dockerfile 文件。Dockerfile 是一个文本文件,用于定义要在 Docker 容器中运行的应用程序所需的各种设置。 2. 在 Dockerfile 中,你需要指定要使用的基础镜像。这可以是一个现有的镜像,例如 node,也可以是你自己创建的镜像。 3. 在 Dockerfile 中,你还需要设置环境变量、工作目录、挂载卷等选项。 4. 在 Dockerfile 中,你还需要指定要执行的命令。这通常是用于安装依赖项、构建前端项目的命令。 5. 在命令行中,使用 `docker build` 命令来构建 Docker 镜像。 6. 使用 `docker run` 命令来运行 Docker 容器。 7. 在浏览器中访问你的前端项目。 请注意,这只是部署前端项目到 Docker 中的一般流程。实际步骤可能因项目而异。 ### 回答2: Docker是一种容器化技术,可以将应用程序及其依赖项打包成一个独立的可移植容器。使用Docker部署前端项目可以简化开发和部署流程,提高项目的可移植性和可扩展性。 要实现Docker部署前端项目,以下是一些主要的步骤: 1. 创建Dockerfile:在项目根目录下创建一个名为Dockerfile的文件。Dockerfile是一个文本文件,其中定义了构建Docker镜像的指令。 2. 编写Dockerfile指令:在Dockerfile中,可以使用指令来描述Docker镜像的构建过程。以下是一些可能用到的指令: - FROM:指定基础镜像,可以选择官方提供的Node.js镜像。 - WORKDIR:设置工作目录,将之后的指令在此目录下执行。 - COPY:将项目文件复制到镜像中的指定路径。 - RUN:执行一些必要的命令,如安装依赖项、打包项目等。 3. 构建Docker镜像:在终端中执行构建命令,通过Dockerfile构建镜像,例如:docker build -t frontend-image . 4. 运行Docker容器:使用构建好的镜像运行Docker容器,可以指定容器的端口映射等配置,例如:docker run -d -p 8080:80 frontend-image。 5. 验证部署:通过浏览器访问宿主机的地址和映射的端口,能够看到前端应用程序正常运行。 使用Docker部署前端项目可以提供更加独立和可靠的开发环境,避免了直接在开发机上安装各种依赖项和配置的复杂性。同时,将前端项目打包成Docker镜像后,可以在不同的服务器和环境上进行部署,提高了项目的可移植性。此外,Docker还提供了更好的隔离性,使得不同的项目可以在同一个主机上并存,而互不干扰。 ### 回答3: 在使用Docker部署前端项目时,我们可以通过以下步骤来实现编码: 1. 安装Docker:首先,我们需要在本地计算机上安装Docker。可以通过官方网站或其他可靠的渠道下载并安装适合自己操作系统的Docker版本。 2. 编写Dockerfile:在项目的根目录下创建一个名为Dockerfile的文件。Dockerfile是一个文本文件,用于定义如何构建Docker镜像。可以使用文本编辑器打开Dockerfile并编写相关的指令。 3. 定义基础镜像:在Dockerfile中,我们需要指定要使用的基础镜像。对于前端项目,通常会选择一个包含基本Web服务器的镜像,例如nginx。可以使用"FROM"指令来指定基础镜像,例如:"FROM nginx:latest"。 4. 添加项目文件:将前端项目的所有文件添加到Docker镜像中。可以使用"ADD"指令将项目文件复制到镜像中的指定目录中。例如:"ADD . /usr/share/nginx/html"将当前目录的所有文件复制到nginx默认服务目录。 5. 定义端口映射:在Dockerfile中,我们可以使用"EXPOSE"指令定义容器内的服务监听的端口。例如:"EXPOSE 80"将容器的80端口映射到宿主机器上。 6. 构建Docker镜像:使用Docker命令行工具,在命令行中进入到项目目录,并运行"docker build -t frontend:1.0 ."命令来构建镜像。其中,"frontend:1.0"是镜像的名称和标签,可以自行定义。 7. 运行容器:构建完成后,可以使用"docker run -d -p 8080:80 frontend:1.0"命令来创建并运行容器。其中,"8080"是宿主机的端口,"80"是容器内服务的监听端口,"frontend:1.0"是之前构建的镜像名称。 通过以上步骤,我们就可以使用Docker部署前端项目了。在部署完成后,我们可以通过浏览器访问宿主机的"localhost:8080"来访问前端项目。这样可以确保在不同环境中,我们的前端项目能够以一致的方式运行,并且方便部署和迁移。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzzzl333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值