容器化 FRP 使用方案

愛喝啤酒的雷神發表於2020-10-20
最近在折騰過程中,使用到了 FRP 這款軟體,碰巧作者在幾天前更新的  v0.34.1 版本只發布了容器版本,並未像之前一樣釋出多種編譯版本。

距離上一次寫 FRP  相關的內容,已經過去了兩年。本文就基於官方容器版本,介紹該軟體的簡單使用方法吧。

在容器中使用 FRP 服務端

首先在服務端找一個合適的目錄,建立  frps.ini 配置檔案,考慮到後續的便捷使用,這裡我們使用環境變數來對配置進行抽象。


[common]
bind_port = {{ .Envs.FRP_SERVER_PORT }}
token     = {{ .Envs.FRP_SERVER_TOKEN }}
dashboard_addr = 0.0.0.0
dashboard_port = {{ .Envs.FRP_ADMIN_PORT }}
dashboard_user = {{ .Envs.FRP_ADMIN_USER }}
dashboard_pwd  = {{ .Envs.FRP_ADMIN_PASS }}
接著,就可以在  docker-compose.yml 中使用環境變數來對程式的服務端進行“動態”配置了:
version: "3.7"
services:
  frps:
    restart: always
    container_name: frps
    image: fatedier/frps:v0.34.1
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./frps.ini:/app/frps.ini:ro
    command: frps -c /app/frps.ini
    ports:
      - 9870:9870
      - 7890:7890
      - YOURPORT:YOURPORT
    environment:
      - FRP_SERVER_PORT=9870
      - FRP_SERVER_TOKEN=CMW9viCpy1FZ
      - FRP_ADMIN_PORT=7890
      - FRP_ADMIN_USER=soulteary
      - FRP_ADMIN_PASS=soulteary
    networks:
      - frps
    logging:
        driver: "json-file"
        options:
          max-size: "1m"
# docker network create frps
networks:
  frps:
    external: true
上面配置中需要注意的是, ports 欄位中,目前只宣告瞭  FRP_SERVER_PORT 服務端通訊介面和  FRP_ADMIN_PORT 服務端管理介面,所以我們需要再根據自己的情況新增一個/一些應用介面。

當然,更好的方案是搭配 Traefik 使用服務發現來對外提供服務。後面有機會,我再行文詳述。

在服務端使用  docker-compose up -d 啟動服務,如果順利的話,將看到類似下面的日誌:


frps    | 2020/10/04 19:52:27 [I] [service.go:190] frps tcp listen on 0.0.0.0:9870
frps    | 2020/10/04 19:52:27 [I] [service.go:289] Dashboard listen on 0.0.0.0:9870
frps    | 2020/10/04 19:52:27 [I] [root.go:212] start frps success
接著我們來配置客戶端。

在容器中使用 FRP 客戶端

同服務端一樣,我們先確定客戶端配置  frpc.ini 的“架子”:
[common]
server_addr = {{ .Envs.FRP_SERVER_ADDR }}
server_port = {{ .Envs.FRP_SERVER_PORT }}
token       = {{ .Envs.FRP_SERVER_TOKEN }}
[app]
type        = tcp
remote_port = {{ .Envs.APP_REMOTE_PORT }}
local_ip    = {{ .Envs.APP_HOST }}
local_port  = {{ .Envs.APP_PORT }}
接著是完成客戶端的  docker-compose.yml 配置檔案:
version: "3.7"
services:
  frpc:
    restart: always
    image: fatedier/frpc:v0.34.1
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./frpc.ini:/app/frpc.ini:ro
    environment:
      - FRP_SERVER_ADDR=123.456.789.012
      - FRP_SERVER_PORT=9870
      - FRP_SERVER_TOKEN=CMW9viCpy1FZ
      - APP_REMOTE_PORT=YOURPORT
      - APP_HOST=YOUR_APP_HOST
      - APP_PORT=YOUR_APP_PORT
    networks:
      - frpc
    logging:
      driver: "json-file"
      options:
        max-size: "1m"
# docker network create frpc
networks:
  frpc:
    external: true
這裡  APP_HOST 和  APP_PORT 指代的是 FRPC 客戶端在容器網路中能夠訪問到的要對映到前文伺服器中的應用的地址及埠。而  APP_REMOTE_PORT 指的則是上文中的  YOURPORT,比如 80 埠、或者 443 埠。

在客戶端同樣使用  docker-compose up -d 啟動服務,然後可以看到客戶端的執行日誌:


frpc  | 2020/10/04 20:42:56 [I] [service.go:288] [62e9e2de742523fe] login to server success, get run id [62e9e2de742523fe], server udp port [0]
frpc  | 2020/10/04 20:42:56 [I] [proxy_manager.go:144] [62e9e2de742523fe] proxy added: [confluence-app]
frpc  | 2020/10/04 20:42:56 [I] [control.go:180] [62e9e2de742523fe] [app] start proxy success
服務端此時也會多一條連線日誌:
frps    | 2020/10/04 20:42:56 [I] [control.go:446] [62e9e2de742523fe] new proxy [app] success
至此,FRP 在容器內的使用就全部完畢了,隨後就由你自由發揮啦。


最後

FRP 是一款優秀的軟體,隨著越來越多的廉價公有云的面世,使用這款軟體搭配家用伺服器使用,可以大幅降低除錯開發成本、以及簡化一些臨時場景下的複雜組網,值得一試。

最後,希望本文能對你想在容器中玩 FRP 的你。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69984138/viewspace-2728139/,如需轉載,請註明出處,否則將追究法律責任。

相關文章