wmproxy

wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子

项目地址

国内: https://gitee.com/tickbh/wmproxy

github: https://github.com/tickbh/wmproxy

容器化

现在服务器环境已经大部分转为了docker这类容器类的部署方式,因为容器化可以与宿主机隔离,又可以虚拟出统一的环境,保证程序在任何系统上表现是一样的。

我们需要将当前的Rust程序打包成docker的image然后发布到部署的整个过程。

初始化

  1. 将项目的源码clone下来
git clone https://github.com/tickbh/wmproxy.git
  1. 安装docker desktop版本,需要比较新的版本
  2. 进入到当前的目录下执行docker init,如果提示没有init则表示docker版本过低,建议升级
docker init
Welcome to the Docker Init CLI! This utility will walk you through creating the following files with sensible defaults for your project:
- .dockerignore
- Dockerfile
- compose.yaml Let's get started! ? What application platform does your project use? Rust
? What version of Rust do you want to use? 1.71.1
? What port does your server listen on? 82
  1. 执行完毕后将会创建三个文件,我们来分析Dockerfile处理了什么
# 拉取了可以编译的RUST版本
FROM rust:${RUST_VERSION}-slim-bullseye AS build
ARG APP_NAME
WORKDIR /app # 挂载相应的文件目录结构
RUN --mount=type=bind,source=src,target=src \
--mount=type=bind,source=Cargo.toml,target=Cargo.toml \
--mount=type=bind,source=.cargo,target=.cargo \
--mount=type=bind,source=Cargo.lock,target=Cargo.lock \
--mount=type=cache,target=/app/target/ \
--mount=type=cache,target=/usr/local/cargo/registry/ \
<<EOF
set -e
cargo build --locked --release
cp ./target/release/$APP_NAME /bin/wmproxy
EOF # 用较小的发行版本做载体,保证较小的image
# 目标image中不包含Rust环境
FROM debian:bullseye-slim AS final ARG UID=10001
RUN adduser \
--disabled-password \
--gecos "" \
--home "/nonexistent" \
--shell "/sbin/nologin" \
--no-create-home \
--uid "${UID}" \
appuser
USER root # 拷贝编译好的可执行文件到目标系统,到时可直接执行目标程序
COPY --from=build /bin/wmproxy /bin/
# 拷贝相应的配置文件
COPY config /etc/config EXPOSE 82:82 8837:8837 8090:8090
  1. 接下来编译镜像
docker build --tag wmproxy .

按照正常情况将会像正常环境编译Rust项目编译成image,但是在国内的环境下,下载crates.io数据可能有频繁失败的可能,此时应该把Cargo设置成国内源,Cargo的配置是和git类似的分层结构,即当前目录会优先寻找当前,然后再往上级推,最终找用户目录下的。例如/projects/foo/bar/baz调用Cargo

/projects/foo/bar/baz/.cargo/config
/projects/foo/bar/.cargo/config
/projects/foo/.cargo/config
/projects/.cargo/config
/.cargo/config
$HOME/.cargo/config

所以此时我们在项目下建立.cargo/config.toml的文件,其中的内容为

[source.crates-io]
replace-with = 'ustc'
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"
[http]
check-revoke = false

如此我们在重新编译一次,将显示表示成功

...
=> exporting to image 0.1s
=> => exporting layers 0.1s
=> => writing image sha256:ca62d7bf9c2684912b27994c2d09917a4836c0fd63867cc9765bf 0.0s
=> => naming to docker.io/library/wmproxy 0.0s
  1. 查询image

    此时可以利用docker images查询当前的images
REPOSITORY                        TAG                                        IMAGE ID       CREATED         SIZE
wmproxy latest ca62d7bf9c26 2 minutes ago 101MB
  1. 运行docker

    因为代理端有监听82(http反向),8090代理,8837控制端,并且需要将本地的配置文件映射到容器中。
docker run -p 82:82 -p 8090:8090 -p 127.0.0.1:8837:8837 --name proxy_bash -v $PWD/reverse.toml:/etc/config/reverse.toml:rw wmproxy /bin/./wmproxy -c /etc/config/reverse.toml

通过netstat可以查看到

TCP    0.0.0.0:82             0.0.0.0:0              LISTENING
TCP 0.0.0.0:8090 0.0.0.0:0 LISTENING
TCP 127.0.0.1:8837 0.0.0.0:0 LISTENING

查看当前服务器状态curl http://127.0.0.1:8837/now



可以正常的获取当前配置

8090为http代理,接下来测试代理是否工作

export http_proxy=http://127.0.0.1:8090/

接下来进行curl测试



可以通过代理正常访问,关掉docker就会返回错误。

发布image

  1. https://hub.docker.com/注册登陆你的账号

  2. 创建respository

  3. 创建成功后,本地images打标签

docker tag wmproxy dreamwhat/wmporxy
  1. 登陆seesion到docker hub
docker login

如果安装desktop版会自动读取token

5. 接下来直接把目标镜像push

docker push dreamwhat/wmproxy

此时后台上可以查看到,表示已发表成功

  1. 此时可以在别的机器拉取远程库docker pull dreamwhat/wmproxy

  2. 直接运行docker,可以查看已经可以运行成功

docker run -p 82:82 -p 8090:8090 -p 127.0.0.1:8837:8837 --name proxy_bash -v $PWD/reverse.toml:/etc/config/reverse.toml:rw dreamwhat/wmproxy /bin/./wmproxy -c /etc/config/reverse.toml

至此已经可以运行完毕

结语

容器化已经在服务器中属于密不可分的一环,包括k8s等编排技术也是基于容器化的基本上去大规模部署的,保证不会因为系统的差别而带来不一致的体验。

点击 [关注][在看][点赞] 是对作者最大的支持

26. 干货系列从零用Rust编写正反向代理,如何发布Rust项目到Docker的更多相关文章

  1. 【WEB API项目实战干货系列】- 导航篇(十足干货分享)

    在今天移动互联网的时代,作为攻城师的我们,谁不想着只写一套API就可以让我们的Web, Android APP, IOS APP, iPad APP, Hybired APP, H5 Web共用共同的 ...

  2. (转)Spring Boot干货系列:(七)默认日志logback配置解析

    转:http://tengj.top/2017/04/05/springboot7/ 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的, ...

  3. (转)Spring Boot干货系列:(四)开发Web应用之Thymeleaf篇

    转:http://tengj.top/2017/03/13/springboot4/ 前言 Web开发是我们平时开发中至关重要的,这里就来介绍一下Spring Boot对Web开发的支持. 正文 Sp ...

  4. 【转】Spring Boot干货系列:(一)优雅的入门篇

    转自Spring Boot干货系列:(一)优雅的入门篇 前言 Spring一直是很火的一个开源框架,在过去的一段时间里,Spring Boot在社区中热度一直很高,所以决定花时间来了解和学习,为自己做 ...

  5. Spring Boot干货系列:(八)数据存储篇-SQL关系型数据库之JdbcTemplate的使用

    Spring Boot干货系列:(八)数据存储篇-SQL关系型数据库之JdbcTemplate的使用 原创 2017-04-13 嘟嘟MD 嘟爷java超神学堂 前言 前面几章介绍了一些基础,但都是静 ...

  6. Spring Boot干货系列:(七)默认日志框架配置

    Spring Boot干货系列:(七)默认日志框架配置 原创 2017-04-05 嘟嘟MD 嘟爷java超神学堂 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候, ...

  7. Spring Boot干货系列:(五)开发Web应用JSP篇

    Spring Boot干货系列:(五)开发Web应用JSP篇 原创 2017-04-05 嘟嘟MD 嘟爷java超神学堂 前言 上一篇介绍了Spring Boot中使用Thymeleaf模板引擎,今天 ...

  8. Spring Boot干货系列:(四)Thymeleaf篇

    Spring Boot干货系列:(四)Thymeleaf篇 原创 2017-04-05 嘟嘟MD 嘟爷java超神学堂 前言 Web开发是我们平时开发中至关重要的,这里就来介绍一下Spring Boo ...

  9. Spring Boot干货系列:(一)优雅的入门篇

    Spring Boot干货系列:(一)优雅的入门篇 2017-02-26 嘟嘟MD 嘟爷java超神学堂   前言 Spring一直是很火的一个开源框架,在过去的一段时间里,Spring Boot在社 ...

  10. Java多线程干货系列—(四)volatile关键字

    原文地址:http://tengj.top/2016/05/06/threadvolatile4/ <h1 id="前言"><a href="#前言&q ...

随机推荐

  1. 王道oj/problem12(动态申请内存存储数组)

    网址:http://oj.lgwenda.com/problem/12 思路:用输入的整型创建对应数组,用scanf消除换行键: 用gets()输入语句并输出,再释放. 代码: #define _CR ...

  2. 用 Tensorflow.js 做了一个动漫分类的功能(二)

    前言: 前面已经通过采集拿到了图片,并且也手动对图片做了标注.接下来就要通过 Tensorflow.js 基于 mobileNet 训练模型,最后就可以实现在采集中对图片进行自动分类了. 这种功能在应 ...

  3. 新一代开源流数据湖平台Apache Paimon入门实操-下

    @ 目录 实战 写表 插入和覆盖数据 更新数据 删除数据 Merge Into 查询表 批量查询 时间旅行 批量增量查询 流式查询 时间旅行 ConsumerID 查询优化 系统表 表指定系统表 分区 ...

  4. 强化学习 Proximal Policy Optimization (PPO)

    参考: 李宏毅老师课件 PPO = Policy Gradient 从 On-policy 到 Off-policy, 再加一些constraint Policy Gradient Basic Con ...

  5. Jmeter关联之正则表达式提取器

    正则表达式简介 摘自网上的说法,正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"))操作的一种 逻辑公式,就是用事先定义好的一些特定字符 ...

  6. 《Web安全基础》03. SQL 注入

    @ 目录 1:简要 SQL 注入 2:MySQL 注入 2.1:信息获取 2.2:跨库攻击 2.3:文件读写 2.4:常见防护 3:注入方法 3.1:类型方法明确 3.2:盲注 3.3:编码 3.4: ...

  7. UI自动化项目1说明 | 网页计算器自动化测试项目

    需求: 1.对网页计算器, 进行加法的测试操作. 通过读取数据文件中的数据来执行用例. 2.网址: http://cal.apple886.com/ 测试点: 1.加法:1+1=2 2+9!=10 . ...

  8. Linux下Python环境安装

    Linux通常都附带Python环境,但是Linux附带的大多数Python都是2.7.5版本.如果我们想使用Python3或者Anaconda3,最好安装一个新的Python3环境,但不要尝试删除P ...

  9. T-SQL——关于数据合并(Merge)

    目录 0. 背景说明及测试数据 1. 直接清空,重新插入 2. 单条记录执行插入.更新操作 3. Merge函数 3.1 准备测试数据 3.2 测试Merge 3.3 关于Merge 4.参考 sha ...

  10. 集群部署专题之一:详解集群间SSH无密码登录配置步骤

    一.SSH简介 SSH(Secure Shell)是一种网络安全协议,通过加密和认证机制实现安全访问和文件传输等业务.传统远程登录和文件传输方式有Telnet或FTP,这两种方式都使用明文传输数据,存 ...