docker - NGINX contsainer 作为不同 docker-compose 实例之间的反向代理
问题描述
我在 nginx 和 docker 上相当菜鸟
我有两个 wordpress 和一个 nginx(单独的)docker-compose.yml。我想让 nginx conainer 作为我的两个 wordpress 的反向代理。例如我想去http://localhost/wordpressblog或http://localhost/wordpressphotography
我真的很愿意接受推荐
其中一个作曲是
version: '3'
services:
wp:
image: wordpress:latest
hostname: wordpressblog
ports:
- 81:80
volumes:
- /opt/wordpress/config/php.conf.ini:/usr/local/etc/php/conf.d/conf.ini
- /opt/wordpress/wp-app:/var/www/html
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: "wordpress"
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: "password"
depends_on:
- db
links:
- db
这是我的 nginx 配置
upstream wordpressblog {
server wordpressblog:81;
}
upstream wordpressphotography {
server wordpressphotography:82;
}
server {
listen 80;
location /wordpressblog/ {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://wordpressblog/;
}
location /wordpressphotography/ {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://wordpressphotography/;
}
}
解决方案
尝试使用 Traefik,而不是使用NGinX,它是一个支持 Docker 的反向代理。
您可以在 Juan Treminio 的“Traefik on Docker for Web Developers - With bonus Let's Encrypt SSL!”中看到一个示例,以便自动注册您的容器并通过预定义的 URL 访问它们。
胡安描述了如何解决“港口舞”:
如果端口 80 映射到 web-server-A,您必须选择另一个端口来绑定 web-server-B 和 web-server-C。
这很快就会变老,因为您必须记住http://localhost转到 A,http://localhost:81转到 B,http://localhost:82转到 C。
他指出:
在虚拟机上,这个问题不会真正发生,因为您可以为您的服务器分配一个静态 IP 地址,并将其绑定到您系统的主机文件 (
/etc/hosts
)。
容器本质上是短暂的,通常不会在您的主机网络上创建,而是在专用网络上创建,它们在特殊范围内具有自己的随机 IP 地址。但是,您必须/etc/hosts
为每个启动的 VM 进行编辑,并且该列表会随着您处理的项目数量而增长。Træfik 解决了这两个问题,首先是不需要在 URL 中使用端口,其次是根本不需要您进行编辑
/etc/hosts
。
Traefik 检测新容器的方式是通过 docker-deicated 网络:
docker network create --driver bridge traefik_webgateway
一个新容器将自己注册到上述 Traefik docker 网络:
docker run -d --name some-mailhog \
--network traefik_webgateway \
--label traefik.docker.network=traefik_webgateway \
--label traefik.frontend.rule=Host:mailhog.localhost \
--label traefik.port=8025 \
mailhog/mailhog
URL 变为简单的http://mailhog.localhost。
您可以类似地注册您的两个 Wordpress 组件。
优点:无需维护静态NGiNX 配置文件:任意数量的组件都可以注册其 URL。
Traefik 之前的旧方式是使用 NGiNXjwilder/nginx-proxy
Docker 提供了一个远程 API 来检查容器并访问它们的 IP、端口和其他配置元数据。此外,它还提供了一个实时事件 API,可用于容器启动和停止时的通知。这些 API 可用于自动生成反向代理配置。
docker-gen是一个小型实用程序,它使用这些 API 并将容器元数据公开给模板。呈现模板并且可以运行可选的通知命令来重新启动服务。
使用 docker-gen,我们可以自动生成 Nginx 配置文件,并在它们更改时重新加载 nginx。
推荐阅读
- reactjs - Gatsby & GraphQL - 从查询文件中呈现下载链接
- powershell - 执行期间的 powershell stdout/stderr (.foreach{})
- unit-testing - 如何让我的 Auzure-Pipeline 运行 .NET Framework 4.7 测试
- machine-learning - 神经网络模型中的参数
- java - Maven 扩展在构建期间不活动
- regex - 如果字符串模式匹配,则正则表达式返回 1,否则返回 0
- r - 拆分数据框并映射到列表
- php - 迁移 sql 错误的问题 一般错误:1215
- c# - 一次触发一个计时器 foreach 元素?
- python - How to add function with a name supplied as string to a class in python?