前言
我们通常希望在 Docker 中运行多个容器后能使用域名来访问不同端口的容器。在这里,我们将详细介绍如何使用 Nginx 反向代理的方式达成这一目的。
什么是反向代理与正向代理?
在继续之前,先简单介绍一下反向代理和正向代理的概念:
正向代理:购物助手
想象你想要购买一款在你所在地区不可购买的限量版运动鞋。由于地区限制,你无法直接从网店购买。在这种情况下,你可以请一个购物助手(正向代理)位于另一个地区帮你购买。你告诉购物助手你想要什么,购物助手去商店下单,然后将运动鞋送到你手上。在这个过程中,商店只与购物助手互动,不直接与你接触。
特点:购物助手代表你(客户端)与商店(服务器)进行交互,你通过代理达成目的,而商店不知道最终的购买者是你。
反向代理:饭店接待
想象你走进一家餐厅,这里有多个后厨,每个后厨负责不同类型的菜式。当你下订单后,餐厅的接待(反向代理)根据订单的内容决定将你的订单送到哪个后厨。你作为顾客不需要知道具体是哪个后厨做的饭,接待帮你处理了所有的分配工作。
特点:餐厅接待作为反向代理,对外界隐藏了后厨的细节,同时根据需求高效分配资源,优化顾客的就餐体验。
对比重点
- 正向代理代表用户行动,用户知道代理的存在,而目标服务器不知道真实的用户是谁。
- 反向代理代表服务器行动,对用户透明,用户不知道背后的服务器细节,只与代理服务器交互。
接下来,我们将搭建一个 Nginx 容器作为反向代理服务器,并将其配置为代理 Docker 内的其他服务。
实操
步骤 1:创建 Docker 网络
首先,需要为反向代理和其他服务创建一个 Docker 网络,以实现容器之间的通信:
docker network create mynetwork
步骤 2:部署其他服务容器
部署被代理的服务,并让它们加入相同的网络。在此示例中,我们部署两个服务并命名为 service1
和 service2
。
启动第一个服务容器
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
应反向代理到第二个服务。
后期维护
维护映射关系
- 修改宿主机上的配置文件
/home/ubuntu/nginx/config/nginx.conf
- 重启 Nginx 容器
docker restart my-nginx-proxy ```
检查文件同步
docker exec -it my-nginx-proxy cat /etc/nginx/conf.d/default.conf
结语
Nginx 是一个强大的工具,其他实用功能比如为网站配置 HTTPS,暂时挖坑留作以后实操介绍。
评论区