Найти в Дзене
Один Rust не п...Rust

Фронтенд и бэкенд Rust в Docker

t.me/oneRustnoqRust Для чего нужна данная статья? : Реализовать взаимодействие между фронтендом и бэкендом внутри Docker image.
Зачем Вам это уметь? : - Изолировать окружения и упростить деплой. Сборка и запуск сервера:
FROM rust:latest
WORKDIR /app COPY . . RUN cargo build --release CMD ["./target/release/your_app"] - Работать с базой данных изолированно: Пример Rust-сервера и базы данных в одном docker-compose.yml: version: '3.8' services: app: build: . ports: - "8080:8080" depends_on: - db db: image: postgres:latest environment: POSTGRES_USER: user POSTGRES_PASSWORD: password POSTGRES_DB: mydb ports: - "5432:5432" - Микросервисы в изолированных контейнерах: - Фронтенд на Rust в Docker Использование Yew, Leptos, Sycamore в Docker помогает автоматизировать сборку и развертывание. Сборка SPA (Single Page Application) на Yew с WebAssembly и Nginx: FROM rust:latest as builder
WORKDIR /app RUN rustup target add wasm32-unknown-unknown RUN cargo install trunk COPY . . RUN trunk build -
Оглавление
ML на RUST без заморочек

t.me/oneRustnoqRust

Для чего нужна данная статья? :

Реализовать взаимодействие между фронтендом и бэкендом внутри Docker image.

Зачем Вам это уметь? :

- Изолировать окружения и упростить деплой.

Сборка и запуск сервера:
FROM rust:latest
WORKDIR /app

COPY . .

RUN cargo build --release

CMD ["./target/release/your_app"]

- Работать с базой данных изолированно:

  • через библиотеки Diesel или SQLx подключаться к базе данных, которая также запускается в Docker-контейнере (например, PostgreSQL, MySQL).

Пример Rust-сервера и базы данных в одном docker-compose.yml:

version: '3.8'

services:

app:

build: .

ports:

- "8080:8080"

depends_on:

- db

db:

image: postgres:latest

environment:

POSTGRES_USER: user

POSTGRES_PASSWORD: password

POSTGRES_DB: mydb

ports:

- "5432:5432"

- Микросервисы в изолированных контейнерах:

  • Actix Web или Axum разворачиваются в изолированных контейнерах, связываются через Docker Compose или Kubernetes.

- Фронтенд на Rust в Docker

Использование Yew, Leptos, Sycamore в Docker помогает автоматизировать сборку и развертывание.

Сборка SPA (Single Page Application) на Yew с WebAssembly и Nginx:

FROM rust:latest as builder
WORKDIR /app

RUN rustup target add wasm32-unknown-unknown

RUN cargo install trunk

COPY . .

RUN trunk build --release

FROM nginx:alpine

COPY --from=builder /app/dist /usr/share/nginx/html

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

В docker-compose.yml фронтенд связывается с Rust-бэкендом:

version: '3.8'

services:

frontend:

build:

context: ./frontend

ports:

- "3000:80"

depends_on:

- backend

backend:

build:

context: ./backend

ports:

- "8080:8080"

- Фуллстек-приложения:

  • Rust может использоваться как для фронтенда (например, на Yew), так и для бэкенда (на Actix Web). С Docker Compose можно запускать оба слоя одновременно.

- Универсальные кейсы

  • Docker позволяет изолировать зависимости (например, разные версии Rust для разных проектов).
    Используйте тома (volumes) для работы с кодом без необходимости пересборки контейнера:

version: '3.8'
services:

app:

image: rust:latest

volumes:

- .:/app

working_dir: /app

command: cargo run

- CI/CD (сборка и тестирование):

  • Docker облегчает настройку CI/CD конвейеров. Например, тестирование Rust-приложения в GitHub Actions:

name: Build and Test

on: [push]

jobs:

build:

runs-on: ubuntu-latest

steps:

- uses: actions/checkout@v2

- name: Set up Docker

run: docker build . -t rust-app

- name: Run Tests

run: docker run rust-app cargo test

- Load Balancing и масштабирование:

  • Использование Docker вместе с Kubernetes для масштабирования Rust-приложений с балансировкой нагрузки.

Пример Yew (фреймворк для фронтенда на Rust), и Actix Web (высокопроизводительный веб-фреймворк).

project/

├── backend/ # Код бэкенда

│ ├── src/

│ │ ├── main.rs

│ ├── Cargo.toml

│ ├── Dockerfile

├── frontend/ # Код фронтенда

│ ├── src/

│ │ ├── main.rs

│ ├── Cargo.toml

│ ├── Dockerfile

├── docker-compose.yml

backend/Cargo.toml

[package]

name = "backend"

version = "0.1.0"

edition = "2021"

[dependencies]

actix-web = "4"

backend/src/main.rs

use actix_web::{get, App, HttpServer, Responder};

#[get("/api/hello")]

async fn hello() -> impl Responder {

"Hello from Rust Backend!"

}

#[actix_web::main]

async fn main() -> std::io::Result<()> {

HttpServer::new(|| App::new().service(hello))

.bind("0.0.0.0:8080")?

.run()

.await

}

backend/Dockerfile

FROM rust:latest as builder

WORKDIR /app

COPY . .

RUN cargo build --release

FROM debian:buster-slim

WORKDIR /app

COPY --from=builder /app/target/release/backend .

CMD ["./backend"]

EXPOSE 8080

frontend/Cargo.toml

[package]

name = "frontend"

version = "0.1.0"

edition = "2021"

[dependencies]

yew = { version = "0.20", features = ["csr"] }

frontend/src/main.rs

use yew::prelude::*;

#[function_component(App)]

fn app() -> Html {

html! {

<div>

<h1>{ "Hello from Rust Frontend (Yew)!" }</h1>

<p>{ "This is a simple Rust-based frontend application." }</p>

</div>

}

}

fn main() {

yew::Renderer::<App>::new().render();

}

frontend/Dockerfile

FROM rust:latest as builder

WORKDIR /app

RUN rustup target add wasm32-unknown-unknown

RUN cargo install trunk

COPY . .

RUN trunk build --release

FROM nginx:alpine

COPY --from=builder /app/dist /usr/share/nginx/html

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

Docker Compose для совместного запуска

docker-compose.yml

version: "3.8"

services:

backend:

build:

context: ./backend

ports:

- "8080:8080"

restart: always

frontend:

build:

context: ./frontend

ports:

- "3000:80"

depends_on:

- backend

restart: always

Запуск проекта

Соберите и запустите проект:

docker-compose up --build

Откройте в браузере:

  • Фронтенд: http://localhost:3000
  • Бэкенд: http://localhost:8080/api/hello