Deploy Frp with Docker Compose

2019-12-13 1940点热度 0条评论

项目简介

https://github.com/fatedier/frp

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。

准备工作

  • 公网ip服务器(阿里云、腾讯云等) - 服务端
  • 内网服务器 - 客户端
  • frp

服务端安装

从 v0.52.0 版本开始,frp 开始支持 TOML、YAML 和 JSON 作为配置文件格式。

请注意,INI 已被弃用,并将在未来的发布中移除。新功能只能在TOML、YAML 或 JSON 中使用。希望使用这些新功能的用户应相应地切换其配置格式。

下载

您可以从 GitHub 的 Release 页面中下载最新版本的客户端和服务器二进制文件。所有文件都打包在一个压缩包中,还包含了一份完整的配置参数说明。

部署

  1. 解压下载的压缩包。
  2. 将 frpc 复制到内网服务所在的机器上。
  3. 将 frps 复制到拥有公网 IP 地址的机器上,并将它们放在任意目录。

开始使用!

  1. 编写配置文件,目前支持的文件格式包括 TOML/YAML/JSON,旧的 INI 格式仍然支持,但已经不再推荐。
  2. 使用以下命令启动服务器:./frps -c ./frps.toml
  3. 使用以下命令启动客户端:./frpc -c ./frpc.toml
  4. 如果需要在后台长期运行,建议结合其他工具,如 systemd 和 supervisor

如果您是 Windows 用户,需要在命令提示符中执行相同的命令。

当然你也可以使用docker来部署,我做了一个frp及vlmcsd的镜像。

git clone https://github.com/jalena/toolkit.git
cd toolkit

# Use docker-compose service 
docker-compose up -d 

使用Docker容器部署客户端

本镜像使用Alpine构建,只包含了 Frpc 客户端,如果你需要自己构建镜像,可以参考 Frpc 客户端 自行修改。

暴露服务

这里继承了docker容器内的自定义网络,从安全角度来讲它并没有将docker母机的网络给暴露出去。

services:
  frp:
    image: jalena/frpc:latest
    container_name: frp
    restart: always
    volumes:
      - ./frpc.toml:/etc/frpc.toml
    networks:
      - frp_network
    deploy:
      resources:
        limits:
          cpus: '0.20'
          memory: 100M
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "10"

networks:                                                                                                                       
  frp_network:
    external: true                                                                                                              
    name: CustomNetWork

frpc参考配置

serverAddr = "frp.baidu.com"
serverPort = 7000
loginFailExit = true

# console or real logFile path like ./frpc.log
log.to = "./frpc.log"
# trace, debug, info, warn, error
log.level = "info"
log.maxDays = 3
# disable log colors when log.to is console, default is false
log.disablePrintColor = false

auth.method = "token"
# auth.additionalScopes specifies additional scopes to include authentication information.
# Optional values are HeartBeats, NewWorkConns.
# auth.additionalScopes = ["HeartBeats", "NewWorkConns"]

# auth token
auth.token = "123456789"

# connections will be established in advance, default value is zero
transport.poolCount = 5

[[proxies]]
name = "test1"
type = "stcp"
secretKey = "11111111111111111111"
localIP = "172.16.0.1"
localPort = 8081

[[proxies]]
name = "test_mysql"
type = "stcp"
secretKey = "222222222222222222"
localIP = "10.100.0.10"
localPort = 3306

本地网络代理

这里因为本地可能同时处理多个代理,所以在网络模式采用了host,因此就不需要为每个代理服务单独暴露端口了

services:
  frp:
    image: jalena/frpc:latest
    container_name: frp
    restart: always
    network_mode: host
    volumes:
      - ./frpc.toml:/etc/frpc.toml
    deploy:
      resources:
        limits:
          cpus: '0.20'
          memory: 100M
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "10"

frpc配置

通过docker容器暴露代理服务,bindAddr 参数需要将其绑定在0.0.0.0,否则可能无法使用。

serverAddr = "frp.baidu.com"
serverPort = 7000
loginFailExit = true

# console or real logFile path like ./frpc.log
log.to = "./frpc.log"
# trace, debug, info, warn, error
log.level = "info"
log.maxDays = 3
# disable log colors when log.to is console, default is false
log.disablePrintColor = false

auth.method = "token"
# auth.additionalScopes specifies additional scopes to include authentication information.
# Optional values are HeartBeats, NewWorkConns.
# auth.additionalScopes = ["HeartBeats", "NewWorkConns"]

# auth token
auth.token = "123456789"

# connections will be established in advance, default value is zero
transport.poolCount = 5

[[visitors]]
name = "test_api"
type = "stcp"
serverName = "test1"
secretKey = "11111111111111111111"
bindAddr = "0.0.0.0"
bindPort = 8081

[[visitors]]
name = "test_mysql"
type = "stcp"
serverName = "test_mysql"
secretKey = "222222222222222222"
bindAddr = "0.0.0.0"
bindPort = 13306

Jalena

原创内容,转载请注明出处! 部分内容来自网络,请遵守法律适用!

文章评论