はじめに

以下の書籍をやっていたところ躓いたエラーになります

 

ここでは書籍通りではなく、Rustのコンテナ環境上でWebサーバーを立てていたので、それが起因して問題が起きていました

問題

以下のコードを実行しました

use axum::{routing::get, Router};
use std::net::SocketAddr;

#[tokio::main]
async fn main() {
    let app = Router::new().route("/", get(root));
    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));

    axum::Server::bind(&addr)
        .serve(app.into_make_service())
        .await
        .unwrap();
}

async fn root() -> &'static str {
    "Hello, World!"
}

そしてdocker-compose.ymlを以下に設定します

version: '3'
services:
  rust:
    build: .
    container_name: rust
    tty: true
    ports:
      - "3000:3000"
    volumes:
      - .:/app

そして

$ curl http://localhost:3000

にアクセスしたところアクセスができませんでした

解決方法

サーバーの起動するIPが間違っていました

$ docker ps


CONTAINER ID   IMAGE                                  COMMAND                  CREATED         STATUS         PORTS                                       NAMES
94bf63a7cdc8   learn-rust-with-web-application_rust   "/bin/sh"                5 minutes ago   Up 5 minutes   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp   rust
b0f3a5289ff5   4251bd246069                           "/bin/sh -c 'rustup …"   27 hours ago    Up 27 hours  

コンテナの情報をみたところ

0.0.0.0:3000->3000/tcp

とありました

コードを見ると

let addr = SocketAddr::from(([127, 0, 0, 1], 3000));

とあり、127.0.0.1となっていました
そこで以下のように変更しました

let addr = SocketAddr::from(([127, 0, 0, 1], 3000));

let addr = SocketAddr::from(([0, 0, 0, 0], 3000));

これで問題なくアクセスできるようになりました

最終的なコードは以下になりました

use axum::{routing::get, Router};
use std::net::SocketAddr;

#[tokio::main]
async fn main() {
    let app = Router::new().route("/", get(root));
    let addr = SocketAddr::from(([0, 0, 0, 0], 3000));

    axum::Server::bind(&addr)
        .serve(app.into_make_service())
        .await
        .unwrap();
}

async fn root() -> &'static str {
    "Hello, World!"
}

おわりに

いままでの言語ではIPの部分を気にしなくても動いていたので、一瞬ハマってしまいました

广告
将在 10 秒后关闭
bannerAds