docker構建frp通道

docker構建frp通道

​ 實驗環境是阿里雲服務器和武漢局域網本地ubuntu之間建立frp內網穿透通道,之前用命令行的方式啓動frp是可以正常轉發端口的,現在使用docker鏡像來啓動frp容器,達到相同的目的,實驗過程如下:

首先需要構建server端和client端的docker鏡像,編寫dockerfile,指定容器運行命令。

一、準備工作

​ 選擇基礎鏡像alpine,是一個面向安全的輕型的Linux發行版。主要用於測試,也可用於生產環境,採用了 musl libcbusybox以減小系統的體積和運行時資源消耗。在保持瘦身的同時,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鏡像移植性更好,可以在不同的操作系統中無障礙運行;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章