Docker 安装 Nginx 容器,反向代理

Docker官方镜像https://hub.docker.com/

寻找Nginx镜像

下载Nginx镜像

docker pull nginx	#下载最新版Nginx镜像 (其实此命令就等同于 : docker pull nginx:latest )
docker pull nginx:xxx	#下载指定版本的Nginx镜像 (xxx指具体版本号)

检查当前所有Docker下载的镜像

docker images

创建Nginx配置文件

启动前需要先创建Nginx外部挂载的配置文件( /home/nginx/conf/nginx.conf)
之所以要先创建 , 是因为Nginx本身容器只存在/etc/nginx 目录 , 本身就不创建 nginx.conf 文件
当服务器和容器都不存在 nginx.conf 文件时, 执行启动命令的时候 docker会将nginx.conf 作为目录创建 , 这并不是我们想要的结果 。

# 创建挂载目录
mkdir -p /home/nginx/conf
mkdir -p /home/nginx/log
mkdir -p /home/nginx/html

容器中的nginx.conf文件和conf.d文件夹复制到宿主机

# 生成容器
docker run --name nginx -p 9001:80 -d nginx
# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /home/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /home/nginx/

创建Nginx容器并运行

# 直接执行docker rm nginx或者以容器id方式关闭容器
# 找到nginx对应的容器id
docker ps -a
# 关闭该容器
docker stop nginx
# 删除该容器
docker rm nginx# 删除正在运行的nginx容器
docker rm -f nginx
docker run \
-p 9002:80 \ #将容器的 9002(后面那个) 端口映射到主机的 80(前面那个) 端口
--name nginx \ 
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ #挂载nginx.conf配置文件
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d \ #挂载nginx配置文件
-v /home/nginx/log:/var/log/nginx \ #挂载nginx日志文件
-v /home/nginx/html:/usr/share/nginx/html \ #挂载nginx内容
-d nginx:latest

结果检测&修改内容进行展示

# 重启容器
docker restart nginx

通过docker-compose启动nginx,并进行反向代理

docker-compose配置

version: '3.8'services:nginx-gateway:image: nginx:1.24.0container_name: nginx-gatewayrestart: alwaysprivileged: trueenvironment:- TZ=Asia/Shanghaiports:- 9002:80 #端口映射,可以映射多个volumes:- /home/nginx/conf/conf.d:/etc/nginx/conf.d  #挂载nginx配置文件- /home/nginx/log:/var/log/nginx  #挂载nginx日志文件- /home/nginx/html:/usr/share/nginx/html  #挂载nginx内容networks:- huoke_net#depends_on: #在以下服务启动后再启动#   - user_server#   - chat_serveruser_server:image: 自己的服务镜像(ip:5000/user_server:tag)container_name: user_server#ports: #不需要映射端口了,直接通过nginx反向代理内部调用#  - "8001:8000"environment:# 时区上海TZ: Asia/Shanghaiprivileged: truerestart: alwaysnetworks:- huoke_net # docker-compose自动分配IPchat_server:image: 自己的服务镜像(ip:5000/chat_server:tag)container_name: chat_server#ports:#  - "8002:8000"environment:# 时区上海TZ: Asia/Shanghaiprivileged: truerestart: alwaysnetworks:huoke_net: # 指定docker-compose网络IPipv4_address: 172.20.0.11
networks:huoke_net:driver: bridgeipam:config:- subnet: 172.20.0.0/16

注意上面指定IP和自动分配IP,在反向代理的时候有点区别

反向代理

/home/nginx/conf/conf.d 下面创建新文件或者在原来文件基础上编辑,xxx-gateway.conf

server{# 服务listen 8080;listen  [::]:8080;access_log /var/log/nginx/xxx.com_access.log;error_log /var/log/nginx/xxx.com_error.log;location ~ /api/user/ {proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://user_server:8000; #自动分配IP需要用服务名}location ~ /api/chat/ {proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://172.20.0.11:8000; #手动分配IP,直接指定IP}#提高容错,当以上服务不可用的时候报错,而不是挂了error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}
}server {# 前台listen       80;listen  [::]:80;server_name  localhost;access_log /var/log/nginx/xxx_frontende.com_access.log;error_log /var/log/nginx/xxx_frontende.com_error.log;location / {root   /home/nginx/html; #自定义项目部署路径index  index.html index.htm index.nginx-debian.html;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}
}

如果想要同一个端口,需要配置不同域名(server_name)

注意:

  • 上面自动分配IP,user_server服务如果不在线会导致nginx挂了
  • 手动分配IP,chat_server服务如果不在线,nginx不会挂,返回错误页面
  • 为了提高nginx容错,服务可以全部手动分配IP

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

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

相关文章

关于使用TCP-S7协议读写西门子PLC字符串的问题

我们可以使用TCP-S7协议读写西门子PLC, 比如PLC中定义一个String[50] 的地址DB300.20 地址DB300.20 DB块编号为300,偏移量【地址】是30 S7协议是西门子PLC自定义的协议,默认端口102,本质仍然是TCP协议的一种具体实现&#xff…

sed教程_使用sed命令向行尾添加字符(附sed元字符集)

sed教程_使用sed命令向行尾添加字符(附sed元字符集) sed 是一项 Linux 指令, 功能同 awk 类似, 差别在于, sed 简单, 对列处理的功能要差一些, awk 的功能复杂, 对列处理的功能比较强大。 sed 元字符集: ^ 锚定行的开始, 如: /^sed/ 匹配所有以 sed 开头的行。$ 锚定行的结束…

HMI界面之:医疗设备界面

一、什么是医疗HMI界面 医疗HMI界面是指医疗设备或系统中的人机界面(Human-Machine Interface),用于与医疗设备进行交互和操作的界面。它是医疗设备中的重要组成部分,通过图形化、直观化的界面,使医护人员能够方便地控…

短剧APP系统开发:探索短剧的发展机遇,提高收益

近年来,短剧在各大社交平台上快速发展,市场规模大幅度上升,成为了大众闲暇时光的娱乐的首选方式之一,深受大众的喜爱。 与传统的影视相比,短剧时间短、节奏快、剧情爽,让给观众更加容易“上头”。对于创业…

[leetcode] 994. 腐烂的橘子

在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单元格中没有…

举4例说明Python如何使用正则表达式分割字符串

在Python中,你可以使用re模块的split()函数来根据正则表达式分割字符串。这个函数的工作原理类似于Python内置的str.split()方法,但它允许你使用正则表达式作为分隔符。 示例 1: 使用单个字符作为分隔符 假设你有一个由逗号分隔的字符串,你可…

力扣:205. 同构字符串

前言:剑指offer刷题系列 问题: 给定两个字符串 s 和 t ,判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改变字符…

【Lazy ORM 框架学习】

Gitee 点赞关注不迷路 项目地址 快速入门 模块所属层级描述快照版本正式版本wu-database-lazy-lambdalambda针对不同数据源wu-database-lazy-orm-coreorm 核心orm核心处理wu-database-lazy-sqlsql核心处理成处理sql解析、sql执行、sql映射wu-elasticsearch-starterESESwu-hb…

时间的守护者:无硫手指套的神奇传说

在钟表制造的世界里,有一个神奇的工具被誉为“精工制表良器”——那就是无硫手指套。这并不是一个普通的故事,而是一段讲述质量、技术和关怀的传奇。 很久以前,在一个钟表制造工坊里,技师们为了追求完美,不断地探索着提…

服务器被挖矿了怎么办,实战清退

当我们发现服务器资源大量被占用的时候,疑似中招了怎么办 第一时间重启服务是不行的,这些挖矿木马一定是会伴随着你的重启而自动重启,一定时间内重新霸占你的服务器资源 第一步检查高占用进程 top -c ps -ef 要注意这里%CPU,如果…

Es之正排索引与倒排索引

文章目录 概要一、正排索引二、倒排索引三、Q&A四、参考 概要 很早就研究了Es倒排索引的具体实现,但对倒排索引和正派索引的定义不是那么清晰,本文就是简述本人对二者的理解。 正排索引和倒排索引的概念来源于 正排索引是文档(ID)到关键词的映射&am…

Linux操作系统及进程(三)进程优先级及特性

目录 一、优先级概念 二、查看系统进程 三、进程切换 一、优先级概念 1.cpu资源分配的先后顺序,就是指进程的优先权(priority)。 2.优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。…

pinia的异步以及getter

getter定义 action异步 使用

python修改txt文件指定行内容

要在 Python 中修改一个文本文件中的指定行内容,你可以按照以下步骤进行操作: 读取原始文本文件内容。找到要修改的行,并修改该行内容。将修改后的内容写回到文件中。 下面是一个示例代码,演示如何实现这一操作: # …

PyQt:实现菜单栏的点击拖动效果

一、整体步骤 1.设计UI文件 2.调用显示 3.效果展示 二、设计UI文件 1.添加 Scroll Area控件,作为菜单栏的布置区域 2.设置 Scroll Area控件的属性 3.Scroll Area控件内放置 按钮控件 组成菜单栏 此处,放置了需要了6个按钮,并设置按钮的固…

使用Pytesseract进行OCR

在Python中,可以使用Tesseract OCR库来识别图片上的文字。Tesseract是一个开源的光学字符识别(OCR)引擎,可以识别多种语言的文本。为了在Python中使用Tesseract,通常会使用pytesseract这个Python库作为Tesseract的一个…

跨境电商测评自养号需要解决哪些问题?

现在做测评工作室这块的,真正有技术的每天单都做不过来,同样也滋生出很多找别人买个设备和账号就以为自己懂了,直接开始教学来割韭菜,很多人没接触过这行业,不知道里面的水很深,花了钱,却没有掌…

xilinx linux AXI GPIO 驱动学习

vivado工程 vivado 配置一个 AXI GPIO&#xff0c; 全输出&#xff0c;宽度为1 设备树解读 生成的对应pl.dtsi设备树文件如下 axi_gpio: gpio40020000 {#gpio-cells <2>;clock-names "s_axi_aclk";clocks <&clkc 15>;compatible "xlnx,…

Java-常见面试题收集(四)

十 并发编程 1 Java 怎么保证多线程运行安全&#xff1f; 线程安全是程序设计中的术语&#xff0c;指某个方法在多线程环境中被调用时&#xff0c;能正确的处理多个线程中的共享变量&#xff0c;使程序正确执行。Java 中线程安全体现在以下三个方面&#xff1a;   原子性&am…

HCSC单片机使用小结

HCSC单片机使用小结 CAN 1、波特率主频/&#xff08;分频1&#xff09;/&#xff08;SEG1SEG2)。存在BT寄存器中。 其中 2、STB在 FIFO 模式下&#xff0c;最先写入的数据先发送&#xff0c;在优先级模式下&#xff0c;ID 小的数据先发送。 3、通过 TCMD 寄存器的 TBSEL 位选…