技术解析
GitHub 地址: https://github.com/yangxuan8282/frpd
使用 docker 的过程中容器的 ip 可能是变动的,这样访问起来不太方便, 而用类似 jwilder/nginx-proxy 这种镜像可以在其它容器启动或停止之后自动生成配置文件,通过指定域名,就可以方便的访问容器内的服务
frpd 本身和 jwilder/nginx-proxy 原理一样,也是利用 docker-gen 去在容器起停之后按照模板和用户给的环境变量自动生成 frp 的配置文件
大致使用过程是先在服务器端(有公网 IP 的机器)和客户端分别创建网络:
docker network create proxy-network
然后用项目里提供的 docker-compose.yml 模板启动 frps
再在客户端利用 docker-compose.yml 模板启动 frpc
之后启动服务就可以了,比如启动 gogs,下载这个 docker-compose.yml 模板,然后把 VIRTUAL_HOST=
后面改成你的域名,用 docker-compose up -d
启动后就可以通过刚才指定的域名访问你部署的 gogs 了,其它服务也都类似
这有一些应用的 docker-compose.yml 模板: https://github.com/yangxuan8282/docker-recipes
我尝试连了三个 client,一个是和 frps 运行在同一台机器上,一个是家里的树莓派,还有一个是虚拟机里的 ubuntu,三个 frpc 用的同样的域名,不同前缀,都可以连接成功,使用不同域名应该也可行
想起做这个起因是前段时间在 v 站发帖 t/362833 求大家推荐一款好用的内网穿透软件,然后不少 v 友推荐 frp,尝试之后发现确实比较方便,能直接完成端口转发,后来在使用过程中想能不能配置成类似 jwilder/nginx-proxy 那样的自动化配置的反向代理,方便访问容器里的服务,毕竟 nginx 不是专门的反代,支持的协议有限
用单独的容器验证了一下发现确实可以实现
大致过程:
启动 frps
容器
启动要访问的容器
用 docker ps -a
查看 container ID
用 docker inspect $CONTAINER_ID
查看 container ip
编辑 frpc.ini
, 更改 local_ip
为 container ip, 更改 local_port
为 container expose 的端口
启动 frpc
手动验证可行之后就尝试用 docker-gen 进行自动化配置,对照 docker-gen 提供的 nginx 模板和 golang 的 template 文档,改好了模板文件,测试成功,后来在写 frpc 的 Dockerfile 时候参照了 BlackGlory/caddy-proxy
frp 内置的 dashboard 可以访问,转发本地的 ssh 端口 和 udp 也都可用,这几个没默认开启,需要开启的话看一下 frpc.tmpl
,对照注释把对应的部分反注释掉,然后启动 docker 的时候给一下相应的环境变量即可,当然也需要启动 frps 时 publish 相应的端口