跳到主要内容

Dockerfile 模板:Docker 部署内网云隧道

一行命令构建容器,自动运行 nssh 隧道,适合喜欢 Docker 的用户。


🤔 这个模板能干什么?

把这个 Dockerfile 构建成一个 Docker 镜像,它会:

  • ✅ 自动运行 nssh 隧道,把内网服务暴露到公网
  • ✅ 容器挂了 Docker 自动重启
  • ✅ 基于 Alpine(~5MB),极度轻量
  • ✅ 不需要手动装 nssh,镜像自带

💡 适合谁? 已经在用 Docker 的环境,或者不想在宿主机装 nssh 的用户。


一、使用方法

1.1 准备文件

把下面的内容保存为 Dockerfile

FROM alpine:3.8

ENV IP=127.0.0.1
ENV PORT=8000
ENV USERNAME=sh
ENV ASKPASS=''
ENV SERVER_NODE=node.neiwangyun.net

RUN addgroup -S nwy
RUN adduser -S -D -H -s /bin/false -g "nwy" -G nwy nwy
RUN set -x
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
RUN apk add --no-cache openssh-client
RUN mkdir -p /home/nwy/.ssh && chown nwy:nwy /home/nwy/.ssh
RUN echo '#!/bin/sh' >> /usr/local/bin/askpass
RUN echo 'echo $ASKPASS' >> /usr/local/bin/askpass
RUN echo '#!/bin/sh' >> /usr/local/bin/ssh_no_pass
RUN echo 'export SSH_ASKPASS=/usr/local/bin/askpass' >> /usr/local/bin/ssh_no_pass
RUN echo 'export DISPLAY=:0' >> /usr/local/bin/ssh_no_pass
RUN echo 'setsid ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking no" "$@"' >> /usr/local/bin/ssh_no_pass
RUN chmod +x /usr/local/bin/askpass /usr/local/bin/ssh_no_pass

USER nwy
WORKDIR /tmp

CMD /usr/local/bin/ssh_no_pass -R 80:${IP}:${PORT} ${USERNAME}@${SERVER_NODE}

1.2 你需要改什么?

只需修改启动时传入的 5 个环境变量,Dockerfile 本身不用动:

环境变量默认值说明
IP127.0.0.1要穿透的本地服务地址(一般不用改)
PORT8000要穿透的本地服务端口(改成你实际的端口)
USERNAMEsh你的内网云隧道用户名
ASKPASS''你的内网云隧道密码
SERVER_NODEnode.neiwangyun.net内网云服务器地址

⚠️ IP 一般保持 127.0.0.1 即可。如果你的服务跑在宿主机上而不是容器内,用 host.docker.internal 或宿主机的局域网 IP。

1.3 构建并运行

# 构建镜像(在 Dockerfile 所在目录执行)
docker build -t nwy-tunnel .

# 运行容器
docker run -d \
--name nwy-tunnel \
--restart=always \
-e PORT=8080 \
-e USERNAME=yourname \
-e ASKPASS=yourpassword \
-e SERVER_NODE=gz2.neiwangyun.net \
nwy-tunnel

💡 把 PORTUSERNAMEASKPASSSERVER_NODE 换成你自己的值。


二、日常管理

命令作用
docker ps查看容器是否在运行
docker logs nwy-tunnel查看隧道日志
docker logs -f nwy-tunnel实时跟踪日志
docker restart nwy-tunnel重启隧道
docker stop nwy-tunnel停止隧道
docker start nwy-tunnel启动隧道
docker rm -f nwy-tunnel删除容器(停止 + 删除)

验证隧道是否通了

# 查看日志,看到下面的输出就说明成功了
docker logs nwy-tunnel
# INF Tunnel established successfully!

# 或者用 nssh_client --list 查看(如果宿主机装了 nssh)
nssh_client --list

三、进阶:配合 docker-compose

如果你喜欢用 docker-compose,创建一个 docker-compose.yml

version: '3'
services:
nwy-tunnel:
image: nwy-tunnel
container_name: nwy-tunnel
restart: always
environment:
- IP=127.0.0.1
- PORT=8080
- USERNAME=yourname
- ASKPASS=yourpassword
- SERVER_NODE=gz2.neiwangyun.net

然后一条命令搞定:

docker-compose up -d

💡 用 docker-compose 的好处:所有配置写在文件里,不用每次记命令参数,换机器直接 docker-compose up -d 就完事。


四、常见问题

Q: 容器一直重启(Restarting)怎么办?

大概率是环境变量配错了:

# 查看报错信息
docker logs nwy-tunnel

常见原因:

  • USERNAMEASKPASS 填错了 → 认证失败
  • SERVER_NODE 填错了 → 连不上服务器
  • PORT 对应的服务没有运行 → 本地连接被拒绝

Q: 怎么修改配置?

Docker 的环境变量改了不会自动生效,需要重新创建容器:

docker rm -f nwy-tunnel
docker run -d \
--name nwy-tunnel \
--restart=always \
-e PORT=新的端口 \
-e USERNAME=yourname \
-e ASKPASS=yourpassword \
-e SERVER_NODE=gz2.neiwangyun.net \
nwy-tunnel

或者用 docker-compose,改完 docker-compose.yml 后执行:

docker-compose up -d

Q: 想更新镜像怎么办?

# 重新构建
docker build -t nwy-tunnel .

# 重建容器
docker rm -f nwy-tunnel
docker run -d \
--name nwy-tunnel \
--restart=always \
-e PORT=8080 \
-e USERNAME=yourname \
-e ASKPASS=yourpassword \
-e SERVER_NODE=gz2.neiwangyun.net \
nwy-tunnel

📚 参考资料


📝 本教程由内网云团队整理,如有问题欢迎反馈。