docker構建frp通道
實驗環境是阿里雲服務器和武漢局域網本地ubuntu之間建立frp內網穿透通道,之前用命令行的方式啓動frp是可以正常轉發端口的,現在使用docker鏡像來啓動frp容器,達到相同的目的,實驗過程如下:
首先需要構建server端和client端的docker鏡像,編寫dockerfile,指定容器運行命令。
一、準備工作
選擇基礎鏡像alpine,是一個面向安全的輕型的Linux發行版。主要用於測試,也可用於生產環境,採用了 musl libc 和 busybox以減小系統的體積和運行時資源消耗。在保持瘦身的同時,Alpine Linux還提供了自己的包管理工具apk。
1.frps的dockerfile:
FROM alpine:3.8
MAINTAINER huangxiang6
WORKDIR /
ENV FRP_VERSION 0.24.1
RUN set -x && \
wget --no-check-certificate https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/frp_${FRP_VERSION}_linux_amd64.tar.gz && \
tar xzf frp_${FRP_VERSION}_linux_amd64.tar.gz && \
cd frp_${FRP_VERSION}_linux_amd64 && \
mkdir /frp && \
mv frps /frp && \
mv frps.ini /frp/frps.ini && \
cd .. && \
rm -rf *.tar.gz && \
rm -rf frp_${FRP_VERSION}_linux_amd64
VOLUME /frp
CMD ./frp/frps -c /frp/frps.ini
構建frps鏡像的命令:
docker build -t huangxiang6/frps:v0.24.1 .
在測試服指定路徑/home/hikstorage/tmp/lascala/frp/frp_docker存放編寫好的配置文件frps.ini:
[common]
bind_port = 8221
dashboard_user = hikstor
dashboard_pwd = 123456
dashboard_port = 8501
max_pool_count = 50000
vhost_http_port = 7088
subdomain_host = testngrok.hikstorage.com
2.frpc的dockerfile
FROM alpine:3.8
MAINTAINER huangxiang6
WORKDIR /
ENV FRP_VERSION 0.24.1
RUN set -x && \
wget --no-check-certificate https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/frp_${FRP_VERSION}_linux_amd64.tar.gz && \
tar xzf frp_${FRP_VERSION}_linux_amd64.tar.gz && \
cd frp_${FRP_VERSION}_linux_amd64 && \
mkdir /frp && \
mv frpc /frp && \
mv frpc.ini /frp/frpc.ini && \
cd .. && \
rm -rf *.tar.gz && \
rm -rf frp_${FRP_VERSION}_linux_amd64
VOLUME /frp
CMD ./frp/frpc -c /frp/frpc.ini
構建frpc鏡像的命令:
docker build -t huangxiang6/frpc:v0.24.1 .
在ubuntu客戶端指定路徑存放編寫好的配置文件frpc.ini:
[common]
server_addr = 47.97.188.238
server_port = 8221
[web]
type = tcp
local_ip = 10.197.163.15
local_port = 8668
remote_port = 8668
注意事項:
frp的server端和client端版本要嚴格一致,如本例中均爲0.24.1,否則無法通信;
二、運行鏡像
1.運行服務器端的frps docker鏡像,命令中-v爲映射本地配置文件到容器中的指定路徑,這樣做的好處是可以在容器外部方便修改配置文件內容:
docker run --restart always -v /home/hikstorage/tmp/lascala/frp/frp_docker/frps.ini:/frp/frps.ini huangxiang6/frps:v0.24.1
2.運行客戶端的frpc docker鏡像:
docker run --restart always -v /volume1/docker/frpc/conf/frpc.ini:/frp/frpc.ini huangxiang6/frpc:v0.24.1
上圖結果可以發現,服務器端frps容器啓動正常,但是客戶端frpc容器無法連接到服務器,這說明服務器端frps容器網絡並沒有與eth0網卡直連,而是創建了一個獨立的網絡命名空間,在docker run啓動容器的時候,如果不加–net參數,就默認採用bridge網絡模式。因此需要手動指定host模式,host模式下創建出來的容器,直接使用容器宿主機的網絡命名空間,將不擁有自己獨立的Network Namespace,即沒有獨立的網絡環境,它使用宿主機的ip和端口。
3.指定網絡模式爲host之後的frps服務器端容器:
docker run --net=host --restart always -v /home/hikstorage/tmp/lascala/frp/frp_docker/frps.ini:/frp/frps.ini huangxiang6/frps:v0.24.1
4.客戶端frpc docker鏡像照常運行:
docker run --restart always -v /volume1/docker/frpc/conf/frpc.ini:/frp/frpc.ini huangxiang6/frpc:v0.24.1
在此基礎上做了四組通道實驗,測試frp通道是否能夠建立:
Aliyun服務器端方式 | ubuntu客戶端方式 | 通道建立 |
---|---|---|
./frps -c frps.ini | ./frpc -c frpc.ini | 可以 |
docker | ./frpc -c frpcs.ini | 可以 |
./frps -c frps.ini | docker | 可以 |
docker | docker | 可以 |
三、測試內網穿透效果
前面兩步搭建好了內網穿透通道,現在在內網環境部署一個小應用gogs,這是一個類似於git的個人網站,作爲實驗對象較爲簡單,步驟如下:
1.創建gogs的數據庫目錄:
mkdir /opt/docker/gogs/
2.直接運行命令自動拉取鏡像:
參數說明:
-d: 後臺方式運行容器
-p: 端口映射, 將容器的22端口映射到宿主機的10022端口, 將容器的3000端口映射到宿主機的10080端口
–name: 指定容器名稱
–net: 將容器加入backend網絡, 目的是爲了能夠連接backend網絡中的mysql數據庫
-v: 數據卷掛載, 用於將容器和數據分離
docker run -d -p 10022:22 -p 8668:3000 \
--name=gogs --net=backend \
-v /opt/docker/gogs/:/data \
gogs/gogs
3.進入網頁進行安裝配置:
http://宿主機ip:8668 ,詳細配置方法在這裏。
四、結論
通過docker容器來啓動frp有兩點好處:①在部署了docker的設備中,運行和維護更加地穩定和便捷,可以通過docker api來管理通道的開關;②配置爲docker鏡像移植性更好,可以在不同的操作系統中無障礙運行;