使用 Docker 部署一个简单的web项目
开发流程
- 在本地开发一个有静态文件服务的 web 服务程序
- web 服务监听 ip + port 为 0.0.0.0:3000
- 在服务器上使用 Dockerfile 构建镜像
- 使用构建出的镜像运行容器
- 配置 Nginx 将端口代理到 web 服务的 3000 端口
在本地开发一个有静态文件服务的 web 服务程序
- 注意提供的静态文件服务要做好错误处理,重定向
web 服务监听 ip + port 为 0.0.0.0:3000
经过测试,当监听ip为 127.0.0.1 时,
docker run 命令通过 -p 3000:3000 映射端口的写法,
在服务器上是访问不到 docker 容器内的服务的。
是否存在某种方式可以访问,暂时还没弄清楚!
在服务器上使用 Dockerfile 构建镜像
- 先在项目根目录创建 Dockerfile 文件
- 将项目打包拷贝至服务器
- 在 Dockerfile 所在目录执行 docker 构建镜像的命令
# 构建 docker 镜像
docker build -t rust_web_api_image .
# -t 给镜像指定一个名称和标签
# rust_web_api_image 镜像的名称,但省略了标签
# . Dockerfile的路径
ARG CARGO_HOME=/usr/local/cargo
# 指定基础镜像
FROM rust:1.77.2 AS builder
# 设置工作目录
WORKDIR /myapp
# 复制项目的源代码到镜像中
COPY . .
# 设置 Cargo 的镜像源,并编译
RUN mkdir -p ${CARGO_HOME} && \
echo '[source.crates-io]' > ${CARGO_HOME}/config && \
echo 'replace-with = "ustc"' >> ${CARGO_HOME}/config && \
echo '[source.ustc]' >> ${CARGO_HOME}/config && \
echo 'registry = "git://mirrors.ustc.edu.cn/crates.io-index"' >> ${CARGO_HOME}/config && \
cargo build --release
# 指定最终的镜像
FROM debian:stable-slim
# 安装必要的运行时依赖项
RUN apt-get update && \
apt-get install -y && \
rm -rf /var/lib/apt/lists/*
# 复制编译好的二进制文件到最终的镜像中
COPY --from=builder /myapp/target/release/web-api /root/web-api
COPY --from=builder /myapp/assets/ /root/assets/
# 暴露应用的端口
EXPOSE 3000
# 保持运行命令时 和 静态文件在同一个目录下
WORKDIR /root
# 启动应用
CMD ["./web-api"]
针对以上 Dockerfile 的注意点
FROM rust:1.77.2
不要使用 rust:1.77.2-alpha 镜像,实测在编译时会碰到问题(跟项目中引入的包有关)。- rust镜像中 cargo 的默认目录是
/usr/local/cargo
可以通过进入容器,在bash中执行which cargo
找到该目录,从而进行换源。 - 执行
CMD ["./web-api"]
时,先要WORKDIR /root
使当前目录(工作目录)要和静态文件同一个目录下,不然程序会找不到文件。
使用构建出的镜像运行容器
# 根据镜像运行容器
docker run --rm -d --name web-api -p 3000:3000 rust_web_api_image
# --rm 容器退出时自动删除。以上只是示例
# -d 在后台运行容器,并打印容器id
# --name 为容器指定一个名称,这里是 web-api
# -p <宿主机端口>:<容器端口>/<协议>
# 基于 rust_web_api_image 镜像
配置 Nginx 将端口代理到 web 服务的 3000 端口
server {
listen 80;
listen [::]:80;
server_name mydomain.com;
location / {
proxy_pass http://0.0.0.0:3000; # 将请求代理到本地的3000端口
proxy_set_header Host $host; # 保留原始的Host头部
proxy_set_header X-Real-IP $remote_addr; # 传递客户端的真实IP地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链中的IP地址
proxy_set_header X-Forwarded-Proto $scheme; # 传递请求使用的协议(http或https)
}
}
标签:web,部署,--,api,3000,镜像,Docker,rust
From: https://www.cnblogs.com/dibtp/p/18148232