我必须在将作为服务器的虚拟机中配置一个带有 ubutu 的 WM,它将运行一个包含两个 Web 应用程序和一个 nginx 代理的容器,直接从 Windows 环境访问,所有这些都通过 docker compose 实例化,这两个应用程序将在端口 9000 和 9001 上运行。
NGINX 服务器必须在端口 80 上运行,将客户端请求重定向到“/app01/status”和“/app02/status”路由中的应用程序端口。
我的问题出现如下,我无法在 Windows 客户端机器上创建对应用程序的访问权限,我找不到通过名称访问应用程序的方法,我只能使用 IP 192.168.1.2:9000 和 192.168.1.2:9001 我想进行域名访问:http://server-linux/app01/ 和 http://server-linux/app02/。
拓扑结构如下:
到目前为止一切顺利,我可以使用配置创建所有 docker-compose,并使应用程序在虚拟机中的相应端口上运行,在我的情况下是 192.168.1.2:9000 和 192.168.1.2:9001,在 Windows 上仅通过 ip 和端口访问。
我想要一个光来提高这个访问权限,并使 windows 机器的浏览器能够使用域 http://server-linux 加载两个应用程序,然后在放置 /app01 时加载应用程序 01,在放置 /app02 时加载应用程序 02
我的docker-compose是这样的(除了这两个应用程序之外,我还在端口5432上的postgres中添加了一个数据库)
version: '3'
services:
app01:
build: ./app01/.
command: uvicorn main:app --host app01 --port 80
ports:
- 9000:80
networks:
- webnotes_network
app02:
build:./app02/.
env_file:
- app02.env
command: uvicorn API_Server:app --host app02 --port 80
depends_on:
- db
ports:
- 9001:80
networks:
- webnotes_network
db:
image:"postgres:13-alpine"
restart: always
env_file:
- db.env
volumes:
- ./db_data/:/var/lib/postgresql/data/
ports:
- '5432:80'
networks:
- webnotes_network
server:
build: ./server/.
volumes:
- ./server/html_files/:/usr/share/nginx/html
ports:
- '9004:80'
depends_on:
- db
- app02
networks:
- webnotes_network
networks:
webnotes_network:
driver: bridge
答案1
我找不到通过名称访问应用程序的方法。
诸如此类的名称server-linux
需要相关的机器知道该名称server-linux
指向 IP 192.168.1.2
。
如果只有主机需要知道这个名称,那么在 Windows 上,实现此目的的最简单方法就是编辑 Windowshosts
文件。
否则,如果您网络上除主机以外的设备需要映射server-linux
到192.168.1.2
,则应设置本地 DNS 服务器,例如 BIND。BIND 过去曾有原生 Windows 软件,但显然已转向仅在最新版本中支持 Linux。然而,他们确实有一个官方 Docker 镜像你可能感兴趣。
请注意,以所述方式在本地使用 BIND 可能需要您的路由器使用本地 DNS 服务器进行所有 DNS 解析,包括“正常”互联网浏览。可以配置 BIND 来解析本地名称 ( server-linux
) 并将未知名称 ( google.com
) 上行传递到您的常规 ISP DNS 服务器或您通常使用的任何服务器。
NGINX 服务器必须在端口 80 上运行,将客户端请求重定向到
/app01/status
和/app02/status
路由中的应用程序端口。
这被称为反向代理。您需要将所有传入的 HTTP 请求(主机上的端口 80)指向 NGINX。您可能需要一个服务器块配置http://server-linux
两个路径(/app01
和/app02
),每个路径都重定向到您的正确 IP 和端口组合。请注意,转发此类请求可能需要在 NGINX 中进行一些额外配置,以将所有必要的数据传递给您的应用程序,以使它们正常工作。此外,/app01
和/app02
假设这status
是由 Docker 应用程序自己生成的页面。