docker构建frp通道
docker构建frp通道实验环境是阿里云服务器和武汉局域网本地ubuntu之间建立frp内网穿透通道,之前用命令行的方式启动frp是可以正常转发端口的,现在使用docker镜像来启动frp容器,达到相同的目的,实验过程如下:首先需要构建server端和client端的docker镜像,编写dockerfile,指定容器运行命令。一、准备工作选择基础镜像alpine,是一个面向安全...
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镜像移植性更好,可以在不同的操作系统中无障碍运行;
更多推荐
所有评论(0)