侧边栏壁纸
  • 累计撰写 2 篇文章
  • 累计创建 4 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Docker 中部署 Nginx 反向代理

Michael
2024-05-09 / 0 评论 / 0 点赞 / 32 阅读 / 4055 字

前言

我们通常希望在 Docker 中运行多个容器后能使用域名来访问不同端口的容器。在这里,我们将详细介绍如何使用 Nginx 反向代理的方式达成这一目的。

什么是反向代理与正向代理?

在继续之前,先简单介绍一下反向代理和正向代理的概念:

正向代理:购物助手

想象你想要购买一款在你所在地区不可购买的限量版运动鞋。由于地区限制,你无法直接从网店购买。在这种情况下,你可以请一个购物助手(正向代理)位于另一个地区帮你购买。你告诉购物助手你想要什么,购物助手去商店下单,然后将运动鞋送到你手上。在这个过程中,商店只与购物助手互动,不直接与你接触。
特点:购物助手代表你(客户端)与商店(服务器)进行交互,你通过代理达成目的,而商店不知道最终的购买者是你。

反向代理:饭店接待

想象你走进一家餐厅,这里有多个后厨,每个后厨负责不同类型的菜式。当你下订单后,餐厅的接待(反向代理)根据订单的内容决定将你的订单送到哪个后厨。你作为顾客不需要知道具体是哪个后厨做的饭,接待帮你处理了所有的分配工作。
特点:餐厅接待作为反向代理,对外界隐藏了后厨的细节,同时根据需求高效分配资源,优化顾客的就餐体验。

对比重点

  • 正向代理代表用户行动,用户知道代理的存在,而目标服务器不知道真实的用户是谁。
  • 反向代理代表服务器行动,对用户透明,用户不知道背后的服务器细节,只与代理服务器交互。

接下来,我们将搭建一个 Nginx 容器作为反向代理服务器,并将其配置为代理 Docker 内的其他服务。

实操

步骤 1:创建 Docker 网络

首先,需要为反向代理和其他服务创建一个 Docker 网络,以实现容器之间的通信:

docker network create mynetwork

步骤 2:部署其他服务容器

部署被代理的服务,并让它们加入相同的网络。在此示例中,我们部署两个服务并命名为 service1service2

启动第一个服务容器

docker run --name service1 --network mynetwork -d my-first-service-image

启动第二个服务容器

docker run --name service2 --network mynetwork -d my-second-service-image

步骤 3:准备 Nginx 配置文件

创建一个 Nginx 配置文件 nginx.conf,将它放在本地目录 /home/ubuntu/nginx/config/ 中:

server {
    listen 80;
    server_name service1.domain;

    location / {
        proxy_pass http://service1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

server {
    listen 80;
    server_name service2.domain;

    location / {
        proxy_pass http://service2:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

解释
server_name service1.domain;service1.domain 为域名
proxy_pass http://service1:8080;service1 为容器名字,8080为容器端口

启动 Nginx 容器后 http://service1.domain 能访问到监听 8080端口的这个容器服务

步骤 4:启动 Nginx 容器

使用以下命令启动 Nginx 容器,将配置文件挂载进去并加入 mynetwork 网络:

docker run --name nginx --network mynetwork -p 80:80 -v /home/ubuntu/nginx/config/nginx.conf:/etc/nginx/conf.d/default.conf:ro -d nginx

步骤 5:测试

在浏览器或命令行工具中访问:
- http://service1.local 应反向代理到第一个服务。
- http://service2.local 应反向代理到第二个服务。

后期维护

维护映射关系

  1. 修改宿主机上的配置文件 /home/ubuntu/nginx/config/nginx.conf
  2. 重启 Nginx 容器
        docker restart my-nginx-proxy
        ```
    

检查文件同步

docker exec -it my-nginx-proxy cat /etc/nginx/conf.d/default.conf

结语

Nginx 是一个强大的工具,其他实用功能比如为网站配置 HTTPS,暂时挖坑留作以后实操介绍。

0

评论区