使用Docker部署一个简单的web项目

使用 Docker 部署一个简单的web项目

开发流程

  1. 在本地开发一个有静态文件服务的 web 服务程序
  2. web 服务监听 ip + port 为 0.0.0.0:3000
  3. 在服务器上使用 Dockerfile 构建镜像
  4. 使用构建出的镜像运行容器
  5. 配置 Nginx 将端口代理到 web 服务的 3000 端口

在本地开发一个有静态文件服务的 web 服务程序

  • 注意提供的静态文件服务要做好错误处理,重定向

web 服务监听 ip + port 为 0.0.0.0:3000

经过测试,当监听ip为 127.0.0.1 时, 
docker run 命令通过 -p 3000:3000 映射端口的写法,
在服务器上是访问不到 docker 容器内的服务的。
是否存在某种方式可以访问,暂时还没弄清楚!

在服务器上使用 Dockerfile 构建镜像

  1. 先在项目根目录创建 Dockerfile 文件
  2. 将项目打包拷贝至服务器
  3. 在 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 的注意点

  1. FROM rust:1.77.2 不要使用 rust:1.77.2-alpha 镜像,实测在编译时会碰到问题(跟项目中引入的包有关)。
  2. rust镜像中 cargo 的默认目录是 /usr/local/cargo 可以通过进入容器,在bash中执行which cargo找到该目录,从而进行换源。
  3. 执行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)

        }

}

posted @   等你下课啊  阅读(639)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示