컨테이너화는 이동성, 격리, 효율성 등 여러 가지 이점을 제공합니다. 이 기술을 사용하면 격리된 실행을 통해 보안과 안정성을 유지하면서 여러 플랫폼에 걸쳐 애플리케이션을 일관되게 배포할 수 있습니다. 또한 컨테이너화는 리소스 사용을 최적화하고 개발 및 관리 프로세스를 간소화하며 확장성을 높이는 데 도움이 됩니다.

Docker를 활용하여 Rust 애플리케이션을 컨테이너화하면 소프트웨어와 필수 종속성을 자율적이고 이식 가능한 플랫폼으로 번들링할 수 있는 신뢰할 수 있고 유용한 방법을 제공합니다. 이를 통해 기본 아키텍처에 대한 제약 없이 다양한 시스템에 손쉽게 배포할 수 있습니다.

Actix로 Rust에서 간단한 웹 서버 설정하기

Actix 프레임워크를 활용하는 Rust 기반 웹 서버는 지정된 포트를 통해 들어오는 요청에 대한 인터페이스 역할을 하도록 쉽게 설정할 수 있습니다. Docker를 사용한 애플리케이션의 컨테이너화는 추가적인 유연성과 확장성을 제공합니다.

 cargo new my-app

새로운 Rust 작업이 시작되면 Cargo는 벤처의 루트 폴더에 cargo.toml 파일을 추가합니다. cargo.toml 파일에 액세스하여 다음과 유사한 방식으로 종속성 세그먼트 내에 Actix 크레이트를 통합합니다:

 [dependencies]
actix-web = "4.3.1"

Rust에서 Actix 크레이트를 사용하여 기본 서버를 구성하는 프로세스는 다음 단계를 포함합니다:

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

// Import necessary dependencies from Actix Web framework

#[get("/")]
async fn hello() -> impl Responder {
    // Define a handler function for GET requests to the root path ("/")
    // The function returns a type that implements the Responder trait

    HttpResponse::Ok().body("Hello, World!")
    // Return an HTTP response with a status code of 200 (OK)
    // and a response body of "Hello, World!"
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    // Entry point of the application

    HttpServer::new(|| {
        // Create a new instance of the HttpServer

        App::new().service(hello)
        // Create a new instance of the App and register the hello function

    }).bind("127.0.0.1:8080")?.run().await
    // Bind the server to the IP address and port
    // Start the server and await its completion
}

애플리케이션은 Actix를 사용하여 기본 HTTP 웹 서버를 설정하고 hello 함수는 “Hello, World!”라는 인사말로 포트 8080으로 향하는 GET 요청을 승인하는 수용체 역할을 합니다.

이 글도 확인해 보세요:  HTTP와 HTTPS: 차이점은 무엇인가요?

이 코드의 주요 목적은 `HttpServer::new` 함수를 사용하여 웹 서버 인스턴스를 생성한 다음 로컬 호스트의 IP 주소 `127.0.0.1` 및 포트 번호 `8080`과 연결하는 것입니다.

카고 실행 명령을 실행하여 웹 서버를 시작하세요. 다음 이미지는 웹 브라우저를 통해 웹사이트에 접속했을 때의 결과입니다.

Rust 앱용 Docker파일 작성하기

Docker를 사용하여 Rust 애플리케이션을 캡슐화하려면 Docker파일을 생성하고 컨테이너화 절차에 대한 지침을 지정해야 합니다.

Docker파일은 단순히 기본 이미지와 컨테이너에 필요한 추가 소프트웨어 또는 구성을 지정하는 텍스트 파일이기 때문에 파일 이름 확장자가 필요하지 않습니다. .dockerignore 파일 생성은 선택 사항이지만 작업 디렉터리 내의 특정 파일을 빌드에서 제외하거나 최종 이미지에 포함시키지 않는 데 유용할 수 있다는 점에 유의하세요.

도커파일에서 명령어 정의하기

도커파일은 도커 레지스트리에서 기본 이미지 검색, 작업 디렉토리 설정, 파일 복사, 종속성 설치, 애플리케이션 빌드, 최소 이미지 생성, 필요한 포트 노출, 애플리케이션 실행에 대한 지침으로 구성되어야 합니다.

 # Use the latest version of the Rust base image
FROM rust:latest

# Set the working directory in the container to /my
WORKDIR /usr/src/my-app

# Copy the Rust project files to the working directory
COPY . .

# Build the Rust app
RUN cargo build

# Set the command to run the Rust app
CMD cargo run

애플리케이션을 컨테이너화하는 작업에는 컨테이너 환경 내에서 실행하기 위해 필요한 지침을 설명하는 작업이 포함됩니다. 이러한 지침이 설정되면 특정 명령을 사용하여 컨테이너 생성을 시작할 수 있습니다.

 docker build -t my-app .

이 명령은 현재 디렉토리에서 파생된 “my-app”의 지정된 태그를 사용하여 “my-app” 애플리케이션에 대한 Docker 이미지를 쉽게 생성할 수 있도록 합니다.

Docker 실행 명령은 Docker 이미지를 실행하는 데 유용한 도구입니다.

 docker run -p 8080:8080 my-app

‘-p 8080:8080’ 플래그를 사용하면 호스트 머신의 포트 8080을 컨테이너 내의 해당 포트 8080에 할당할 수 있으므로 호스트 디바이스의 포트 8080으로 향하는 수신 트래픽을 컨테이너의 해당 포트로 유도하여 둘 간의 원활한 통신 흐름을 촉진할 수 있습니다.

이 글도 확인해 보세요:  슬랙에서 나만의 사용자 지정 슬래시 명령 만들기

컨테이너와의 통신에 적절한 채널을 사용하고 포트 8080의 로컬 호스트를 통해 웹 서버로 요청을 전달하세요.

다중 컨테이너 오케스트레이션을 지원하는 Docker Compose

여러 컨테이너화된 애플리케이션과 협업하는 것은 복잡한 Docker 기반 시스템 개발에서 일반적인 관행입니다. Docker Compose를 활용하면 사용자는 여러 Docker 컨테이너의 작업을 관리하고 조정할 수 있습니다.

Docker Compose는 애플리케이션을 구성하는 서비스 정의, 서비스 간 종속성 지정, 개별 서비스에 대한 환경 변수 설정, 컨테이너화된 애플리케이션의 시작, 중단, 재개, 확장성 및 추가 기능 등 애플리케이션의 구성 관리를 간소화하는 다양한 기능을 제공합니다.

By 박준영

업계에서 7년간 경력을 쌓은 숙련된 iOS 개발자인 박준영님은 원활하고 매끄러운 사용자 경험을 만드는 데 전념하고 있습니다. 애플(Apple) 생태계에 능숙한 준영님은 획기적인 솔루션을 통해 지속적으로 기술 혁신의 한계를 뛰어넘고 있습니다. 소프트웨어 엔지니어링에 대한 탄탄한 지식과 세심한 접근 방식은 독자에게 실용적이면서도 세련된 콘텐츠를 제공하는 데 기여합니다.