使用 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 . .
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;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律