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 本身不用动:
| 环境变量 | 默认值 | 说明 |
|---|---|---|
IP | 127.0.0.1 | 要穿透的本地服务地址(一般不用改) |
PORT | 8000 | 要穿透的本地服务端口(改成你实际的端口) |
USERNAME | sh | 你的内网云隧道用户名 |
ASKPASS | '' | 你的内网云隧道密码 |
SERVER_NODE | node.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
💡 把
PORT、USERNAME、ASKPASS、SERVER_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
常见原因:
USERNAME或ASKPASS填错了 → 认证失败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
📚 参考资料
📝 本教程由内网云团队整理,如有问题欢迎反馈。