はじめに
以下の書籍をやっていたところ躓いたエラーになります
ここでは書籍通りではなく、Rustのコンテナ環境上でWebサーバーを立てていたので、それが起因して問題が起きていました
問題
以下のコードを実行しました
main.rs
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
を以下に設定します
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));
これで問題なくアクセスできるようになりました
最終的なコードは以下になりました
main.rs
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の部分を気にしなくても動いていたので、一瞬ハマってしまいました