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.inidocker可以
dockerdocker可以
三、测试内网穿透效果

前面两步搭建好了内网穿透通道,现在在内网环境部署一个小应用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镜像移植性更好,可以在不同的操作系统中无障碍运行;

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐