首页 > 系统相关 >26从零开始用Rust编写nginx,如何发布Rust项目到Docker

26从零开始用Rust编写nginx,如何发布Rust项目到Docker

时间:2024-01-29 10:32:55浏览次数:26  
标签:cargo 26 -- 0.0 nginx docker config Rust wmproxy

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/config/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

26从零开始用Rust编写nginx,如何发布Rust项目到Docker_TCP

可以正常的获取当前配置

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

export http_proxy=http://127.0.0.1:8090/

接下来进行curl测试

26从零开始用Rust编写nginx,如何发布Rust项目到Docker_Rust_02

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

发布image

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

26从零开始用Rust编写nginx,如何发布Rust项目到Docker_docker_03

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

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

如果安装desktop版会自动读取token5. 接下来直接把目标镜像push

docker push dreamwhat/wmproxy

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

26从零开始用Rust编写nginx,如何发布Rust项目到Docker_docker_04

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

26从零开始用Rust编写nginx,如何发布Rust项目到Docker_Rust_05

  1. 直接运行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
  1. 打tag发布版本
docker tag wmproxy dreamwhat/wmproxy:0.2.3
docker push dreamwhat/wmproxy:0.2.3

至此已经可以运行完毕

结语

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

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

标签:cargo,26,--,0.0,nginx,docker,config,Rust,wmproxy
From: https://blog.51cto.com/u_16321542/9460447

相关文章

  • 【2024-01-26】有点年味
    20:00世界上没有哪一道伤口是永远不能愈合的,虽然愈合后在阴雨的日子还会感觉到痛。                                                 ——迟子建我今天开始在公司感受......
  • Rust学习笔记
    迭代器迭代器是一个值,它可以生成一系列值Iterrator类型和IntoIterator类型迭代器是实现了Iterator类型的任意值IntoIterator是迭代器本身类型,Item是它生成的值的类型。任意实现了IntoIterator的类型都可以成为可迭代者,可以通过into_iter获得一个迭代器迭代器能生成值迭......
  • 跟着思兼学习Klipper(26): 大卸八块 Klipper 远程控制实验汇总
    又名《给创想三维K1找个"强力外援"》前言原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎交流指正。文章如有更新请访问DFRobot社区及cnblogs博客园,前者内容较全,后者排版及阅读体验更佳。我们约定:主板指MCU部分,上位机指运行Klippy的MPULinux部分。玩了好......
  • Slint-UI移植到任意平台-概述-Rust
    前言本文仅为笔者记忆,个人经验写着玩,目前1.3.2版本。注:本文尚未完成。注:本文尚未完成。注:本文尚未完成。本人目前想要移植一种贴近前端技术的GUI到裸机上,但是裸机不支持UNIX环境,所以绝大部分框架都用不了(如Flutter/skia等),最后发现Slint最合适。Slint有三种渲染器{femtovg/Op......
  • ue4.26 CurveLinearColorAtlas支持非正方形尺寸
    默认CurveAtlas只能是正方形 改代码可以让它支持非正方形: 改法如下:CurveLinearColorAtlas.h//CopyrightEpicGames,Inc.AllRightsReserved.#pragmaonce#include"CoreMinimal.h"#include"UObject/ObjectMacros.h"#include"UObject/Object.h"#in......
  • NGINX 实战操作(yarn-proxy)
    目录一、概述二、部署Hadoop环境三、部署yarn-proxyondocker1)部署docker2)部署docker-compose3)部署dnsmasq4)下载yarn-proxy5)修改配置6)开始部署7)通过subs_filter进行改进四、部署yarn-proxyonk8s一、概述NGINX代理是非常常见的,内网生成环境一般不让在本机直接访问,......
  • Rust学习之Diesel setup报错解决
    Dieselsetup报错解决Diesel是一个安全、可扩展的RustORM和查询生成器。Diesel是Rust中与数据库交互最高效的方式,因为它对查询进行了安全且可组合的抽象。1.报错信息diesel_demoonmaster[?]via......
  • MySQL 8.0.26 新增参数 group_replication_view_change_uuid
    MySQL8.0.26新增参数group_replication_view_change_uuidGreatSQL[root@localhost][test]>showglobalvariableslike'group_replication_view_change_uuid';+------------------------------------+-----------+|Variable_name|V......
  • 1.26 闲话
    推歌:万分之一的光/洛天依起床铃/下午一半家桶再见杰克完美生活YesterdayOnceMore龙拳触摸天空篇章起风了(翻唱,唱的和食一样)一路生花(一路生草)闪耀(欢迎收听猪猪电台,每天都分享不同的歌曲....这首歌是一首写给少年的歌....)光芒新宝岛(但是在初一只放了一天)......
  • Windows 下 Nginx 配置 多个conf 文件的过程与注意事项
    Windows下配置Nginx使用多个conf文件的Include路径与Linux有所不同。 如上:Windows:include../conf.d/*.confLinux:include /etc/nginx/conf.d/*.conf; 分别来看单个配置文件的内容:总配置文件nginx.conf###########################################......