docker-compose+nginx部署前后端分离的项目实践

yizhihongxing

下面我将详细讲解“docker-compose+nginx部署前后端分离的项目实践”的完整攻略。

环境准备

首先,我们需要准备以下环境:

  • docker 17.06 或更高版本
  • docker-compose 1.14 或更高版本

构建后端应用镜像

我们可以使用 Dockerfile 构建后端应用镜像,示例如下:

FROM openjdk:8-jre-alpine
COPY target/my-application.jar /usr/app/
WORKDIR /usr/app
EXPOSE 8080
CMD ["java", "-jar", "my-application.jar"]

这里使用了 OpenJDK 8 作为基础镜像,并将应用打包成一个单独的 jar 文件。我们可以将 Dockerfile 和 Jar 文件放在同一个目录下,然后使用以下命令构建镜像:

docker build -t backend-image .

构建前端应用镜像

类似地,我们可以使用 Dockerfile 构建前端应用镜像,示例如下:

FROM node:10-alpine as build-stage
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build

FROM nginx:alpine
COPY --from=build-stage /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf

这里使用了 Node.js 10 作为基础镜像,并在第一个阶段构建了前端应用代码并生成静态文件,然后在第二个阶段使用 Nginx 来提供静态文件服务。我们可以将 Dockerfile 和前端应用的代码放在同一个目录下,然后使用以下命令构建镜像:

docker build -t frontend-image .

定义docker-compose.yml

接下来,我们需要使用 docker-compose 定义容器、网络等相关的配置。

首先,我们定义一个名为 backend 的服务,将之前构建的后端应用镜像作为其镜像使用,同时将容器内 8080 端口映射到宿主机的 8080 端口。

version: '3'
services:
  backend:
    image: backend-image
    ports:
      - "8080:8080"

然后,我们定义一个名为 frontend 的服务,将之前构建的前端应用镜像作为其镜像使用。由于前端应用只需要提供静态文件服务,因此我们并不需要映射端口。

version: '3'
services:
  backend:
    image: backend-image
    ports:
      - "8080:8080"

  frontend:
    image: frontend-image

接下来,我们需要使用 Nginx 作为反向代理,在容器中监听 80 端口,将请求转发到前端或后端服务。

version: '3'
services:
  backend:
    image: backend-image
    ports:
      - "8080:8080"

  frontend:
    image: frontend-image

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro

最后,我们使用 volumes 将之前定义的 Nginx 配置文件 nginx.conf 映射到容器内部,该配置文件将前端应用的所有 /api 请求转发到后端服务。

编写nginx.conf

我们需要编写一个 Nginx 配置文件 nginx.conf,将所有 /api 请求转发到后端服务。

server {
  listen 80;
  server_name localhost;

  location / {
    root /usr/share/nginx/html;
    index index.html;
  }

  location /api {
    proxy_pass http://backend:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
  }
}

启动容器

启动容器非常简单,我们只需要在项目根目录下运行以下命令即可:

docker-compose up -d

这将启动所有定义的 Docker 服务,并且在后台运行。

示例说明

示例1:添加自定义域名

假设我们有一个自定义的域名 my-domain.com,我们可以在 Nginx 配置文件中添加以下配置,将所有请求转发到容器内的 Nginx 服务。

server {
  listen 80;
  server_name my-domain.com;

  location / {
    proxy_pass http://nginx:80;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
  }
}

然后,在本地电脑上添加 /etc/hosts 记录,将 my-domain.com 解析为本机的 IP 地址即可。

示例2:使用Let's Encrypt证书

如果我们需要为自己的域名添加 SSL 证书,可以使用 Let's Encrypt 提供的免费证书服务。我们可以将证书和私钥保存到主机上,并将其挂载到 Nginx 容器中。

首先,我们需要安装 certbot 工具来获取证书:

sudo apt-get update
sudo apt-get install certbot

然后,运行 certbot 命令获取证书:

sudo certbot certonly --webroot -w /path/to/your/site -d yourdomain.com -d www.yourdomain.com

该命令将会要求你向 /path/to/your/site/.well-known/acme-challenge 目录中放置一个文本文件,以便 certbot 验证你对该域名的控制权。

获取证书后,我们只需要修改 Nginx 配置文件,添加 SSL 相关的配置即可。

server {
  listen 80;
  server_name yourdomain.com;
  return 301 https://$server_name$request_uri;
}

server {
  listen 443 ssl;
  server_name yourdomain.com;

  ssl_certificate /path/to/cert.pem;
  ssl_certificate_key /path/to/privkey.pem;

  location / {
    root /usr/share/nginx/html;
    index index.html;
  }

  location /api {
    proxy_pass http://backend:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
  }
}

完整的实现过程可以参照 Nginx + Let's Encrypt 实现 HTTPS 服务

至此,我们完成了“docker-compose+nginx部署前后端分离的项目实践”的完整攻略,希望可以对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:docker-compose+nginx部署前后端分离的项目实践 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • win10下vs2015配置Opencv3.1.0详细过程

    以下是win10下vs2015配置Opencv3.1.0详细过程: 第一步:下载安装Opencv3.1.0 1.打开Opencv官网,下载Opencv3.1.0压缩包2.解压后将文件夹重命名为“opencv-3.1.0”并放在“C:\”盘根目录下3.添加系统环境变量: 右键“计算机” >> “属性” >> “高级系统设置” >&…

    人工智能概论 2023年5月24日
    00
  • python3.6的venv模块使用详解

    Python3.6的venv模块使用详解 什么是venv模块 在Python3.3中,引入了一个新的标准库venv,这个标准库封装了创建Python虚拟环境的功能。venv的全称是“Virtual Environments”,即虚拟环境。它是Python解释器的本地副本,用于解决应用程序不同版本之间的包依赖性问题。 在这个虚拟环境中,可以安装自己需要的第三方…

    人工智能概览 2023年5月25日
    00
  • Python OpenCV 图像平移的实现示例

    以下是关于“Python OpenCV 图像平移的实现示例”的完整攻略。 1. 概述 图像平移是图像处理中最常见也最基础的操作之一,可以将图像中的目标物体平移任意指定的距离,从而达到目的。图像平移的实现涉及到图像坐标系的变化,这也是图像处理中最基础的概念。 2. 坐标系变换 在进行图像平移操作前,需要将坐标系做出改变。假设原图像的左上角坐标为$(0,0)$,…

    人工智能概览 2023年5月25日
    00
  • 零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门

    零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门 本文将介绍如何搭建一个基于 Node.js、Express、Ejs、Mongodb 的服务器,以及如何开发应用。如果您还没有 Node.js 的基础,可以先学习一下,并确保已经在您的计算机上安装了 Node.js 环境。 安装 安装 Node.js 以及 npm。可以在 N…

    人工智能概论 2023年5月25日
    00
  • Django restful framework生成API文档过程详解

    我来为您讲述一下“Django restful framework生成API文档过程详解”的完整攻略。 1. 安装Django Rest Framework 在开始前,首先需要安装Django Rest Framework。可以在终端中运行以下命令安装: pip install djangorestframework 2. 添加Django Rest Fra…

    人工智能概论 2023年5月25日
    00
  • 浅谈django rest jwt vue 跨域问题

    下面是关于“浅谈django rest jwt vue 跨域问题”的完整攻略。 简介 在使用 Django Rest Framework、JWT 和 Vue 构建前后端分离应用时,会遇到跨域问题。本文将详细介绍如何使用 Django Rest Framework、JWT 和 Vue 解决跨域问题。 什么是跨域问题 在同一个域名下,浏览器之间是可以互相访问数据…

    人工智能概论 2023年5月25日
    00
  • nginx+uwsgi启动Django项目的详细步骤

    启动 Django 项目通常需要 web 服务器与应用服务器的支持。其中, nginx 是最常用的 web 服务器,而 uwsgi 是更加适合于长时间运行的应用服务器之一,两者的配合可以起到更好的效果。本文主要介绍如何使用 nginx 和 uwsgi 在 Linux 上启动 Django 项目。 安装 nginx 和 uwsgi 在 Ubuntu / Deb…

    人工智能概览 2023年5月25日
    00
  • 十大 Node.js 的 Web 框架(快速提升工作效率)

    下面是详细讲解“十大 Node.js 的 Web 框架(快速提升工作效率)”的完整攻略。 标题:十大 Node.js 的 Web 框架 什么是 Node.js 的 Web 框架? Node.js 是一个 Javascript 运行环境,提供了基于事件驱动的异步 IO 模型,可用于开发高效的、可扩展的网络应用程序,但仅提供底层 API,需要使用 Web 框架来…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部