首页 > 其他分享 >使用Docker部署一个简单的web项目

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

时间:2024-04-20 21:59:32浏览次数:16  
标签:web 部署 -- api 3000 镜像 Docker rust

使用 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)

        }

}

标签:web,部署,--,api,3000,镜像,Docker,rust
From: https://www.cnblogs.com/dibtp/p/18148232

相关文章

  • 在Linux中,如何使用Jenkins和Ansible进行虚拟化环境的自动化和持续集成/持续部署(CI/CD)?
    在Linux中,使用Jenkins和Ansible进行虚拟化环境的自动化和持续集成/持续部署(CI/CD)是一个强大的组合,可以大大提高开发和部署的效率。下面将详细阐述如何配置和使用这两个工具来实现这一目标。1.Jenkins配置安装Jenkins你可以从Jenkins官网下载最新的安装包,或者使用包管理器(如a......
  • ingress-nginx-controller在k8s中的部署和使用
    点击查看代码下载deploy文件https://github.com/kubernetes/ingress-nginx/blob/controller-v1.9.6/deploy/static/provider/cloud/deploy.yaml修改deploy文件:有如下几处可按需修改:DaemonSet:修改Deployment为DaemonSet,移除strategy字段;hostNetwork:使用宿主机的网络;......
  • 使用kubeadm 快速部署k8s
     卸载之前的dockeryumremove docker-cedocker-ce-clicontainerd.io 安装dockersudoyuminstall-y docker-cedocker-ce-clicontainerd.io  安装docker$wgethttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo-O/etc/yum.repos.d/do......
  • docker---配置域名解析
    docker---配置域名解析以ubuntu22.04作为基础镜像,build新的镜像,在执行apt-getupdate命令时,出现以下错误:167.4Err:2http://security.ubuntu.com/ubuntujammy-securityInRelease167.4Temporaryfailureresolving'security.ubuntu.com'搜索错误信息,发现是域名解析问......
  • 使用docker compose一键启动多个应用
    使用dockercompose一键启动多个应用 环境说明linux系统版本:lsb_release-a  docker版本:docker-v  不同的操作系统以及软件版本,可能会遇到不一样的问题,一定要注意版本问题。  .1.安装教程,参考官网安装指南。https://dockerdocs.cn/compose/install/ind......
  • k8s集群部署
    Kubernetes-1.28.2集群介绍及搭建一、Kubernetes概述1、什么是Kubernetes?K8S的全称为Kubernetes。用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。1.23.10以前(包含)docker1.24.0containerd中间件k8s和dockerdockers-shim可以......
  • docker 数据卷查看以及数据删除
    如何清理您的Docker数据Docker不需要对系统进行配置更改…但它却使用大量的磁盘空间。短暂的使用后,通过下面命令您可能会震惊地看到一些可怕使用统计信息:dockersystemdf不过不用担心,Docker允许您从未使用的images,containers和volumes中回收磁盘空间。定期清理为了安全......
  • web server apache tomcat11-10-Class Loader
    前言整理这个官方翻译的系列,原因是网上大部分的tomcat版本比较旧,此版本为v11最新的版本。开源项目从零手写实现tomcatminicat别称【嗅虎】心有猛虎,轻嗅蔷薇。系列文章webserverapachetomcat11-01-官方文档入门介绍webserverapachetomcat11-02-setup启动web......
  • vuex结合websocket使用
    1、创建一个store文件夹,并在其中创建store.js文件,结合vuex:importVuefrom'vue'importVuexfrom'vuex'importcommonfrom"../common/common.js";Vue.use(Vuex)conststore=newVuex.Store({state:{/***是否需要强制登录*/......
  • 阿里云函数计算域SSL证书免费申请及部署
    阿里云函数计算大大简化了开发部署的工作量,用户只需聚焦于业务逻辑的开发,编写最重要的“核心代码”;不再需要关心服务器购买、负载均衡、自动伸缩等运维操作;极大地降低了服务搭建的复杂性,有效提升开发和迭代的速度。但是在使用过程中发现,对SSL证书的支持需要支付额外费用,具......