【Docker】Linux中使用Docker安装Nginx部署前后端分离项目应用

目录

一、概述

1. Nginx介绍

2. Nginx优势

3. Nginx的工作原理

二、容器创建

1. Mysql容器

2. Tomcat容器

3. Nginx容器

每篇一获


一、概述

1. Nginx介绍

Nginx(发音为 "engine x")是一个开源的、高性能的 HTTP 服务器和反向代理服务器。它也可以作为一个 IMAP/POP3/SMTP 代理服务器。Nginx 是由 Igor Sysoev 开发的,最初是为了解决 C10K 问题(即如何处理一万个并发连接的问题)。现在,Nginx 已经成为了一种非常流行的 Web 服务器软件。

Nginx因其简洁、高效和可靠的特点而备受欢迎。相比传统的Apache服务器,Nginx使用更少的系统资源,可以处理更多的并发连接。它采用事件驱动的异步架构,能够有效地处理高并发请求和大量的并行连接。

以下是 Nginx 的一些主要特性:

  1. 处理静态文件、索引文件以及自动索引:Nginx 可以非常高效地处理静态文件,并支持索引文件和自动索引。

  2. 反向代理与负载均衡:Nginx 可以作为反向代理服务器,将来自客户端的请求转发到后端的服务器,并将后端服务器的响应返回给客户端。此外,Nginx 还支持多种负载均衡算法。

  3. FastCGI、uWSGI、SCGI、memcached 支持:Nginx 可以与这些常见的网络协议进行交互,以处理动态内容。

  4. SSL 和 TLS 支持:Nginx 支持 SSL 和 TLS 协议,可以为网站提供安全的 HTTPS 连接。

  5. 模块化设计:Nginx 有许多可选的模块,可以根据需要添加或删除,以满足特定的需求。

  6. 配置文件热部署:Nginx 支持在不中断服务的情况下更改配置文件并使其生效。

  7. 带宽控制:Nginx 允许限制连接和请求的速度,以防止带宽被过度使用。

2. Nginx优势

在 Linux 中使用 Nginx 部署项目有许多优势,以下是一些主要的:

  1. 高性能和高并发:Nginx 是一个高性能的反向代理服务器和邮件代理服务器。它可以处理大量的并发连接,这使得它在处理高流量的网站时表现出色。

  2. 稳定性:Nginx 在各种网络环境下都能提供稳定的服务。它的稳定性和可靠性使得许多大型网站选择使用它作为其主要的 Web 服务器。

  3. 灵活性:Nginx 提供了丰富的模块和功能,可以满足各种复杂的 Web 应用需求。例如,它可以作为负载均衡器,可以处理静态文件,也可以处理动态内容。

  4. 易于配置:Nginx 的配置文件结构清晰,易于理解和修改。这使得管理和维护 Nginx 服务器变得更加简单。

  5. 资源占用少:Nginx 在处理大量并发连接时,CPU 和内存的占用相对较少,这使得它在资源有限的环境中也能提供良好的性能。

  6. 开源和免费:Nginx 是开源的,这意味着您可以免费使用它,并且可以查看和修改其源代码。这为定制和优化 Nginx 提供了可能。

  7. 良好的社区支持:Nginx 有一个活跃的开发和用户社区,您可以从中获取帮助和支持,也可以分享您的经验和知识。

3. Nginx的工作原理

Nginx 的工作原理主要基于事件驱动和异步非阻塞的设计模型。这种设计使得 Nginx 能够在处理大量并发连接时,保持高效和稳定。以下是 Nginx 工作原理的一些关键点:

  1. Master-Worker 架构:Nginx 采用 Master-Worker 的架构模式。Master 进程主要负责读取和验证配置文件,管理 Worker 进程。Worker 进程则负责处理实际的请求。每个 Worker 进程都是独立的,它们之间不共享状态,也不进行直接的通信。

  2. 事件驱动:Nginx 的 Worker 进程是事件驱动的。当一个新的连接请求到来时,Worker 进程会接收到一个事件通知。然后,Worker 进程会处理这个请求,生成响应,并将响应发送回客户端。在这个过程中,Worker 进程不会被阻塞,可以同时处理多个请求。

  3. 异步非阻塞 I/O:Nginx 使用异步非阻塞的 I/O 操作。这意味着,当一个 Worker 进程在等待 I/O 操作完成时,它可以去处理其他的请求。这样,Worker 进程就不会因为等待 I/O 操作而被阻塞,可以更高效地利用 CPU。

  4. 负载均衡:Nginx 可以作为反向代理服务器,将来自客户端的请求分发到后端的服务器。Nginx 支持多种负载均衡算法,如轮询、最少连接、IP 哈希等。

  5. 静态内容处理:对于静态内容,Nginx 可以直接从文件系统中读取文件,并将文件内容作为响应发送给客户端。

  6. 动态内容处理:对于动态内容,Nginx 通常会与后端的应用服务器(如 PHP-FPM、uWSGI 等)配合使用。Nginx 将请求转发给应用服务器,由应用服务器生成动态内容,然后 Nginx 再将这些内容作为响应发送给客户端。

二、容器创建

1. Mysql容器

首先创建一个目录

命令:

mkdir -p /mode/mysql/{conf,data}  

在root中创建一个存放MySQL的文件夹mysql中有conf存放配置文件,

还在mysql中有data存放数据的。

在将配置文件从主机拖到conf文件中:

为了让我们的容器之间可以相互访问,所以我们创建一个网络,名称为:mode

172.18.0.0为指定IP,其中mode为网络名称。

docker network create --subnet 172.18.0.0/16 --gateway 172.18.1.1 mode

创建一个mysql容器并且为它指定我们的自定义网络(mode)

docker run \
--name m1 \
-v /mode/mysql/conf/my.cnf:/etc/my.cnf \
-v /mode/mysql/data:/var/lib/mysql \
--privileged=true \
-e MYSQL_ROOT_PASSWORD=123456 \
--net mode \
--ip 172.18.0.100 \
-d mysql/mysql-server:5.7

其中的ip需要跟上面创建的自定义网络前缀相同:172.18,在这之后可以修改,不可超过255

进入我们创建的mysql容器进行登录

进入:

docker exec -it m1 bash

m1 是需要进入哪个容器的名称

登入mysql:

mysql -uroot -p

输入我们在创建是设置的密码即可登入,也就是123456

在进行用户的授权并且设置密码:

grant all on *.* to root@'%' identified by '123456';

其中root为用户名称,123456为用户的密码。

在MySQL创建我们所需要存放数据表的数据库

创建数据库:

create database shop;  

shop为创建数据库

使用创建号的数据库:

use shop;

在我们创建数据的data目录中存放sql脚本,将使用目录挂载后容器也会有这个脚本,在主机中将脚本拖入即可(/mode/mysql/data):

之后执行命令,将脚本在MySQL中执行,容器与虚拟机对应的目录:

执行命令:

source  /var/lib/mysql/book.sql;

 

查看数据表:

show tables;

之后退出:

exit;

退出后需要重启容器:

docker restart m1

2. Tomcat容器

我们需要达到Nginx负载均衡,就不只是一个容器,所以可以创建一个镜像来创建tomcat容器

编辑并且创建Dockerfile文件,用于创建镜像的配置

命令:

vim Dockerfile

进行以下编辑:

#1.指定基础镜像,并且必须是第一条指令
FROM  openjdk
#2.指明该镜像的作者和其电子邮件
MAINTAINER  CloudJun  "jun737x@163.com"
#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR  /project
#4.将文件从Docker主机将jdk及jar包复制到Docker镜像中
COPY  spring.jar /project
#5.容器启动时,需要执行的命令(执行jar包)
CMD java -jar spring.jar --mysql.addr=m1

将名为spring.jar的配置IP配置为m1容器的IP

 

i 进行编辑 ,编辑完成按Esc,并且输入:wq进行保存并且退出。

有相同名称及版本的镜像可以进行删除或者创建不同名称及版本的镜像

删除:

docker rmi spring:v1

我这里是进行删除,之后再创建:

docker  build  -t spring:v1 .

 

根据我们创建的镜像来创建容器,并且分别配置不同的IP

docker run -itd --name s1 --net mode --ip 172.18.0.101 spring:v1
docker run -itd --name s2 --net mode --ip 172.18.0.102 spring:v1
docker run -itd --name s3 --net mode --ip 172.18.0.103 spring:v1

这里创建了三个容器,分别是s1,s2,s3,IP分别:18.0.101,18.0.102,18.0.103

 

可以通过查看日志看是否启动成功

 查看日志:

docker logs s1

s1 为容器名称,需要查看哪个容器日志就修改为哪个容器即可

可以先进行访问,看是否可以访问到数据,在主机上进行数据访问:

3. Nginx容器

首先创建nginx的配置文件目录并将配置文件放入

mkdir -p  /soft/nginx/conf.d

将配置文件放讲其中,通过目录挂载的方式进行到容器中去

default.conf:

#服务器的集群
upstream tomcatList {  server 172.18.0.101:8080 weight=1; server 172.18.0.102:8080 weight=1; server 172.18.0.103:8080 weight=1; 
} server {listen  80;server_name  www.zkingedu.com;location / {root   /etc/nginx/html/;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}location ~^/api/ {rewrite ^/api/(.*)$ /$1 break;proxy_pass  http://tomcatList;proxy_redirect default;}}

其中配置tomcat集群,将tomcat容器的IP集群,并且对应创建过的tomcat容器IP

在将这个项目中的静态文件放入其中

之后根据自定义的网络来创建nginx容器

命令:

docker run -itd \
--name n1 \
-v /soft/nginx/conf.d:/etc/nginx/conf.d \
-v /soft/nginx/html:/etc/nginx/html/ \
-p 80:80 \
--net mode \
--ip 172.18.0.104 \
nginx

n1 为容器名称,mode 为自定义网络

之后在主机只访问虚拟机的IP:

每篇一获

在 Linux 中使用 Docker 安装 Nginx 并部署前后端分离的项目,您可能会有以下几个方面的收获:

  1. 掌握 Docker 的基本使用:Docker 是一种流行的容器技术,可以让开发者在一个隔离的环境中运行应用,避免了因为环境问题导致的“在我机器上可以运行”的问题。通过这个过程,您可能已经学会了如何使用 Docker 来创建和管理容器。

  2. 理解容器化的优势:与传统的虚拟机相比,容器有许多优势,例如启动快、资源占用少、易于迁移等。通过实际使用 Docker,您可能对这些优势有了更深入的理解。

  3. 熟悉 Nginx 的配置和使用:Nginx 是一个强大的 Web 服务器和反向代理服务器,通过在 Docker 中部署 Nginx,您可能已经熟悉了 Nginx 的配置和使用。

  4. 了解前后端分离的部署方式:前后端分离是现代 Web 开发的一种常见架构,通过在 Docker 中部署前后端分离的项目,您可能对这种部署方式有了更深入的理解。

  5. 提升 Linux 操作技能:在 Linux 中使用 Docker 和 Nginx,无疑会让您对 Linux 的命令行操作更加熟练,这对于任何想要深入了解和使用 Linux 的人来说都是非常有价值的技能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/412725.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rviz可视化机械臂(python)

一、准备的东西 一个机械臂的urdf 规划的路径点 二、launch文件的撰写 1.初始化 <?xml version"1.0" encoding"utf-8"?> <launch><param name"robot_description" textfile"机械臂.urdf" /><node name&qu…

抽象类(没有对象)之引用对象失败之谜

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;&#x1f468;&#x1f3fb;‍&#x1f393;告别&#xff0c;今天 &#x1f4d4;高质量专栏 &#xff1a;☕java趣味之旅 欢迎&#x1f64f;点赞&#x1f5e3;️评论&#x1f4e5;收藏&#x1f493;关注 &#x1f496;衷心的希…

LLM(十)| Tiny-Vicuna-1B:Tiny Models轻量化系列Top One

在过去的一年里&#xff0c;见证了LLM的蓬勃发展&#xff0c;而模型的参数量也不断刷新记录&#xff0c;在2023年下半年&#xff0c;外界传言GPT-4是一个专家混合模型。因此&#xff0c;如果你想用人工智能做点什么&#xff0c;你需要IBM或NASA类似的计算能力&#xff1a;你怎么…

GoZero微服务个人探索之路(三)Go-Zero官方rpc demo示例探究

官方网址&#xff1a;https://go-zero.dev/docs/tasks/cli/grpc-demo 项目结构 demo包 两个文件均为protoc-gen-go-grpc自动生成构成一个完整的 gRPC 服务的定义和实现 democlient包 demo.go goctl生成的客户端代码 Request 和 Response 别名&#xff1a; 定义了 Request 和…

相机内外参标定综合

相机内外参标定 内外参标定常用的工具相机成像原理内外参标定数学原理1&#xff09;求解内参矩阵与外参矩阵的积2&#xff09;求解内参矩阵3&#xff09;求解外参矩阵 内外参标定常用的工具 如图所示&#xff0c;棋盘格是很常见使用的标定工具 左下角写着棋盘格的参数&#xf…

odoo16 销售订单中数量与单价,手机录入不方便

odoo16 销售订单中数量与单价&#xff0c;手机录入不方便 在销售订单中&#xff0c;服装批发&#xff0c;数量与单价均是整数&#xff0c;系统默认的为保留两位小数的float类型&#xff0c;输入起来很不方便&#xff0c;如何修改 电脑版&#xff0c;输入时&#xff0c;自动选取…

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成

目录 前言 一、项目框架 1.项目迭代 2.项目时序图 3.项目测试执行 二、项目具体实现 1.创建流水线 2.拉取代码 3.执行测试代码 4.生成测试报告 5.报告内容解读 6.数据统计 7.邮件通知 8.企业微信通知 三、项目遇到的问题 1.go test -args 2.go test生…

ASO优化:巧用字符串

应用商店优化&#xff08;ASO&#xff09;与网站的搜索引擎优化 (SEO) 非常相似。 同样&#xff0c;应用程序商店通过关键字、评论、下载和升级数量以及其他排名因素来查找最相关的应用程序。 ASO 和 SEO 都致力于为产品带来更多流量&#xff0c;并将其置于搜索结果的顶部。 …

django后台进行加密手机号字段,加密存储,解密显示

需求: 1 &#xff1a;员工在填写用户的手机号时&#xff0c;直接填写&#xff0c;在django后台中输入 2&#xff1a;当员工在后台确认要存储到数据库时&#xff0c;后台将会把手机号进行加密存储&#xff0c;当数据库被黑之后&#xff0c;手机号字段为加密字符 3&#xff1a;员…

文心一言使用分享

ChatGPT 和文心一言哪个更好用&#xff1f; 一个直接可以用&#xff0c;一个还需要借助一些工具&#xff0c;还有可能账号会消失…… 没有可比性。 通用大模型用于特定功能的时候需要一些引导技巧。 import math import time def calculate_coordinate(c, d, e, f, g, h,…

Jenkins的环境部署,(打包、发布、部署、自动化测试)

一、Tomcat环境安装 1.安装JDK&#xff08;Java环境&#xff09; JDK下载地址&#xff1a;Java Downloads | Oracle 安装好后在系统环境变量里配置环境变量&#xff1a; ①添加JAVA_HOME 变量名&#xff1a;JAVA_HOME变量值&#xff1a;C:\Program Files\Java\jdk1.8.0_18…

Docker安全基线检查需要修复的一些问题

一、可能出现的漏洞 限制容器之间的网络流量 限制容器的内存使用量 为Docker启用内容信任 将容器的根文件系统挂载为只读 审核Docker文件和目录 默认情况下&#xff0c;同一主机上的容器之间允许所有网络通信。 如果不需要&#xff0c;请限制所有容器间的通信。 将需要相互通…