Docker 安装 Nginx 容器,反向代理

news2024/11/17 0:40:57

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.0
    container_name: nginx-gateway
    restart: always
    privileged: true
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 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_server
  user_server:
    image: 自己的服务镜像(ip:5000/user_server:tag)
    container_name: user_server
    #ports: #不需要映射端口了,直接通过nginx反向代理内部调用
    #  - "8001:8000"
    environment:
      # 时区上海
      TZ: Asia/Shanghai
    privileged: true
    restart: always
    networks:
      - huoke_net # docker-compose自动分配IP
  chat_server:
    image: 自己的服务镜像(ip:5000/chat_server:tag)
    container_name: chat_server
    #ports:
    #  - "8002:8000"
    environment:
      # 时区上海
      TZ: Asia/Shanghai
    privileged: true
    restart: always
    networks:
      huoke_net: # 指定docker-compose网络IP
        ipv4_address: 172.20.0.11
networks:
  huoke_net:
    driver: bridge
    ipam:
      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.coloradmin.cn/o/1541033.html

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

相关文章

Linux 创建交换空间

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

【C++】使用cppcheck检查C++代码

Cppcheck 是 C/C 代码的静态分析工具。它提供独特的代码分析来检测错误,并专注于检测未定义的行为和 危险的编码结构,即使它具有非标准语法(在嵌入式项目中很常见)。 关于静态分析 通过静态分析可以发现的错误类型包括&#xff…

Zabbix使用TimescaleDB数据库

一、前言 Zabbix 6.0 已发布很久,下个季度7.0应该会正式发布,但6.0也有许多新功能和新特性,这里介绍 6.0 配置 TimescaleDB,此安装配置方法可基本通用与其他版本。 二、TimescaleDB TimescaleDB 基于 PostgreSQL 数据库打造的一…

【Leetcode】2549. 统计桌面上的不同数字

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接🔗 给你一个正整数 n n n ,开始时,它放在桌面上。在 1 0 9 10^9 109 天内,每天都要执行下述步骤: 对于出现在桌面上的每个数字 x &am…

Programming Abstractions in C阅读笔记:p331-p337

《Programming Abstractions in C》学习第79天,p331-p337,总计7页。 一、技术总结 /** File: stack.h* -------------* This interface defines an abstraction for stacks. In any* single application that uses this interface, the values in* the…

2024/3/24 LED点阵屏

显示原理: 类似矩阵键盘,逐行or逐列扫描 74HC595是串行 寄存器 感觉就是三转八寄存器 并行:同时输出;串行:一位一位输出 先配置74HC595,重新进行位声明 sbit RCKP3^5; //RCLK sbit SCKP3^6; …

ai问答机器人是什么?介绍这几款实用ai问答机器人

ai问答机器人是什么?随着人工智能技术的飞速发展,AI问答机器人已成为我们生活中不可或缺的一部分。它们能够智能地解答各种问题,提供便捷的服务,极大地提升了用户体验。本文将带你了解AI问答机器人的基本概念,并介绍几…

30-函数(上)

30-1 函数是什么 在计算机科学中,子程序是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。 一般会有输入参数并有返回值,提供对过程的封装和细节…

jenkins配置源码管理的git地址时,怎么使用不了 credential凭证信息

前提 Jenkins使用docker部署 问题 (在jenlins中设置凭证的方式)在Jenkins的任务重配置Git地址,并且设置了git凭证,但是验证不通过,报错; 无法连接仓库:Command "git ls-remote -h -- http://192.1XX.0.98:X02/…

梅林生态第一个Defi借贷协议零撸教程

简介:Avalon Finance是第一个基于Merlin Chain的去中心化借贷协议。它包括三个关键组成部分:超额抵押借贷、与借贷相关的衍生品交易和基于借贷的算法稳定币。 相关概念:梅林生态、Defi 融资信息:项目于3月15日完成种子轮融资&am…

IntelliJ IDEA集成git配置账号密码

1 背景说明 刚使用IDEA,本地也安装Git,在提交和拉取代码的时候,总提示登录框,而且登录框还不能输入账号密码,只能输入登录Token。如下: 从而无法正常使用IDEA的Git功能,很苦恼。 2 解决方法 2.1 安装Git 进入官网地址 https://git-scm.com/,点击下载: 浏览器直接…

数据结构——栈和队列的表示与实现详解

目录 1.栈的定义与特点 2.队列的定义与特点 3.案例引入 4.栈的表示和操作的实现 1.顺序栈的表示 代码示例: 2.顺序栈的初始化 代码示例: 3.判断栈是否为空 代码示例: 4.求顺序栈长度 代码示例: 5.清空顺序栈 …

官宣|阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会

摘要:本文整理自阿里云开源大数据平台徐榜江 (雪尽),关于阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会,内容主要分为以下四部分: 1、Flink CDC 新仓库,新流程 2、Flink CDC 新定位,新玩法 3、Flin…

taro框架之taro-ui中AtSwipeAction的使用

题记&#xff1a;所需效果&#xff1a;滑动删除 工作进程 官网文档代码 <AtSwipeAction options{[{text: 取消,style: {backgroundColor: #6190E8}},{text: 确认,style: {backgroundColor: #FF4949}} ]}><View classNamenormal>AtSwipeAction 一般使用场景</…

Vue 3 里的 onMounted 怎么用?

疑问 最近&#xff0c;一直在学习 Vue 3&#xff0c;此前我不懂前端&#xff0c;也没写过 Vue 2&#xff0c;所以是从 0 开始学习 Vue 3 的。很多对普通人不是疑问的&#xff0c;在我这里也会不太清楚。 我在写项目的时候&#xff0c;常见的一种场景是这样的&#xff1a;页面…

Excel通过下拉菜单,显示不同图片

背景&#xff1a;有的时候需要通过更改下拉菜单来改变对应的 值/ 图片。 如果是数值的话就是我们常常用的Vlookup&#xff0c;这个可以很简单的实现这个功能。&#xff08;这个如果不知道请自行百度&#xff09; 但是如果是图片呢&#xff1f;这个就不常见了&#xff0c;那么…

41 物体检测和目标检测数据集【李沐动手学深度学习v2课程笔记】

目录 1. 物体检测 2. 边缘框实现 3.数据集 4. 小结 1. 物体检测 2. 边缘框实现 %matplotlib inline import torch from d2l import torch as d2ld2l.set_figsize() img d2l.plt.imread(../img/catdog.jpg) d2l.plt.imshow(img);#save def box_corner_to_center(boxes):&q…

企业计算机服务器中了mkp勒索病毒怎么办,mkp勒索病毒解密流程步骤

在网络技术飞速发展的今天&#xff0c;越来越多的企业走向了数字化办公模式&#xff0c;网络为企业的生产运营提高了效率&#xff0c;为企业带来了极大便利&#xff0c;但网络是一把双刃剑&#xff0c;在为人们提供便利的同时也会带来数据安全问题&#xff0c;网络数据安全一直…

NFS网络文件系统

目录 简介 案例 配置autofs自动挂载 客户端配置autofs 简介 NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09;是FreeBSD支持的文件系统中的一种&#xff0c;它允许网络中的计算机&#xff08;不同的计算机、不同的操作系统&#xff09;之间通过TCP/I…

每日一题 --- 螺旋矩阵 II[力扣][Go]

螺旋矩阵 II 题目&#xff1a;59. 螺旋矩阵 II - 力扣&#xff08;LeetCode&#xff09; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出…