尝试了两种方式:
1.第一种是利用已经构建好了的镜像,应该是hteen这位大神构建了,docker仓库里也有,搭建起来毕竟容易,从原作者的博客中稍微整理而来
2.另一种是用Dockfile在自己机子上构建,稍微麻烦些
准备
1.一台云服务器并配置好docker环境
2.申请好域名
3.SSL证书(没有也行)
1.利用已构建好的镜像:hteen/ngrok
1.1拉取镜像
docker pull hteen/ngrok
1.2启动一个容器生成ngrok客户端,服务器端和CA证书
docker run --rm -it -e DOMAIN="ngrok.yourdomain.cn" \
-v /data/ngrok:/myfiles hteen/ngrok /bin/bash /build.sh
如果出现下面这个报错,就把/bin/bash换成sh就可以了
alpine docker exec: "/bin/bash": stat /bin/bash: no such file or directory
如下:
docker run --rm -it -e DOMAIN="ngrok.yourdomain.cn" \
-v /data/ngrok:/myfiles hteen/ngrok sh /build.sh
挂载宿主机目录/data/ngrok到容器内/myfiles目录
DOMAIN可以自己设定,作为ngrok服务端的地址(注意,这个DOMAIN后面是要写在客户端的配置文件里的,不可随意更改,更改意味着客户端要重新构建,和服务端启动时配置的DOMAIN不同)
然后等待构建完毕,有点久,耐心等待
最后看到build ok !就代表成功了
1.3获取客户端、服务端文件
到挂载宿主机目录/data/ngrok/bin中获取生成的客户端和服务端,复制到客户端机子上来
bin/ngrokd 服务端
bin/ngrok linux客户端
bin/darwin_amd64/ngrok osx客户端
bin/windows_amd64/ngrok.exe windows客户端
1.4启动ngrok服务端
挂载刚刚的/data/ngrok到容器即可启动服务
docker run -idt --name ngrok-server \
-v /data/ngrok:/myfiles \
-p 80:80 \
-p 443:443 \
-p 4443:4443 \
-e DOMAIN='ngrok.yourdomain.cn' hteen/ngrok sh /server.sh
这里的DOMAIN是客户端访问的时候用的,如这里配了abc.def.cn,那么客户端连接成功后,访问的地址就是xxx.abc.def.cn,而配置文件中(见1.6)的内容则使用的是1.2中设置的DOMAIN的内容
1.5服务器配置域名解析
我使用的是腾讯云
添加两个A记录:* 和 *.ngrok
1.6客户端连接ngrok服务
注意,客户端创建配置文件ngrok.cfg,server_addr配置的是1.2的DOMAIN中的内容,而不是1.4的DOMAIN的内容!
server_addr: "ngrok.yourdomain.cn:4443"
trust_host_root_certs: false
然后linux下命令:
./ngrok -config ./ngrok.cfg -subdomain abc 8080
windows下命令:
ngrok -config=ngrok.cfg -subdomain abc 8080
然后用abc.ngrok.yourdomain.cn就可以访问客户端机子的8080端口
方便使用可以写个.bat(windows下)
@echo OFF
set /p clientid= 请输入前缀:
echo.
set /p port= 请输入端口:
echo.
ngrok -config=ngrok.cfg -subdomain %clientid% %port%
PAUSE
1.7配置证书
前面的配置会自动生成自建证书,有些浏览器,或者微信小程序开发会不认,所有需要用正式的证书,如果有这方面需要,到/data/ngrok替换掉原来的证书即可
cd /data/ngrok
mv xxxxx.key device.key
mv xxxxx.pem device.crt
2.通过Dockerfile自行构建
首先在任意一个文件夹创建两个文件
touch Dockerfile
touch build.sh
然后参考下面内容即可
https://www.jianshu.com/p/53c72ae1446c
https://www.lylinux.net/article/2018/9/18/51.html
附:hteen构建的镜像,原作者的博客的内容
防止原作者个人博客挂了或者换路径而无法访问,下面复制原作者的博客内容
----------------------------------------begin----------------------------------------
准备工作
- 公网服务器一台并且安装docker,我用的阿里云Centos7.0
- 域名一枚,本文使用 tunnel.hteen.cn 做Ngrok服务器域名
- hteen/ngrok Docker镜像
拉取镜像
[root@iZ25f738hs2Z ngrok]# docker pull hteen/ngrok
启动一个容器生成ngrok客户端,服务器端和CA证书
[root@iZ25f738hs2Z ngrok]# docker run --rm -it -e DOMAIN="tunnel.hteen.cn" \
-v /data/ngrok:/myfiles hteen/ngrok /bin/bash /build.sh
挂载宿主机目录/data/ngrok到容器内/myfiles目录 ,之后会
Generating RSA private key, 2048 bit long modulus
...............+++
..........+++
.....
build ok !
[root@iZ25f738hs2Z ngrok]#
当看到build ok !的时候就成功了
[root@iZ25f738hs2Z ngrok]# ls -Al
-rw-r--r-- 1 root root 1679 6月 14 18:58 base.key
-rw-r--r-- 1 root root 1111 6月 14 18:58 base.pem
-rw-r--r-- 1 root root 17 6月 14 18:58 base.srl
drwxr-xr-x 4 root root 4096 6月 14 19:01 bin
-rw-r--r-- 1 root root 993 6月 14 18:58 device.crt
-rw-r--r-- 1 root root 899 6月 14 18:58 device.csr
-rw-r--r-- 1 root root 1675 6月 14 18:58 device.key
生成了我们要的客户端和服务端在/data/ngrok/bin目录下,包括
bin/ngrokd 服务端
bin/ngrok linux客户端
bin/darwin_amd64/ngrok osx客户端
bin/windows_amd64/ngrok.exe windows客户端
启动Ngrok server
直接挂载刚刚的/data/ngrok到容器即可启动服务
[root@iZ25f738hs2Z ngrok]# docker run -idt --name ngrok-server \
-v /data/ngrok:/myfiles \
-p 80:80 \
-p 443:443 \
-p 4443:4443 \
-e DOMAIN='tunnel.hteen.cn' hteen/ngrok /bin/bash /server.sh
这样我们就启动了一个ngrok服务端程序
域名解析
这里我们需要添加两条A记录到阿里云服务器
这样我们才能将 tunnel.hteen.cn 和 *.tunnel.hteen.cn DNS解析到我们的服务器
客户端连接
下载我们生成的客户端,我这里以osx为例,其他平台一样
首先创建一个ngrok.cfg配置文件
server_addr: "tunnel.hteen.cn:4443"
trust_host_root_certs: false
然后在命令行执行
./ngrok -config ./ngrok.cfg -subdomain wechat 192.168.99.100:80
我这里是将wechat.tunnel.hteen.cn绑定的本地192.168.99.100:80
如果不指定-subdomain参数,每次启动客户端的时候会随机分配一个域名,随意并不方便
Nginx + Docker + Ngrok
由于ngrok默认使用80和443端口,我服务器已经运行了Nginx服务 ,
所以我这里启动Ngrok Server的时候并不是绑定的80和443端口,而是绑定的8082和4432
[root@iZ25f738hs2Z ngrok]# docker run -idt --name ngrok-server \
-v /data/ngrok:/myfiles \
-p 8082:80 \
-p 4432:443 \
-p 4443:4443 \
-e DOMAIN='tunnel.hteen.cn' hteen/ngrok /bin/bash /server.sh
启动之后需要在nginx.conf 添加两条反向代理配置
server {
listen 80;
server_name tunnel.hteen.cn *.tunnel.hteen.cn;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://10.24.198.241:8082;
}
}
server {
listen 443;
server_name tunnel.hteen.cn *.tunnel.hteen.cn;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://10.24.198.241:4432;
}
}
10.24.198.241 是我阿里云内网IP
----------------------------------------end----------------------------------------