docker - 对 docker-compose Web 应用程序使用与 localhost 不同的主机名/url
问题描述
摘要:2个独立的应用程序,都使用docker-compose,我怎么能同时拥有http://app-1.test
和http://app-2.test
可用?
描述:我觉得我错过了一些超级简单的东西。我有 2 个 php-fpm(通过 nginx)应用程序,它们都由类似的 docker-compose 设置运行,有点像:
# docker-compose.yaml
version: '3'
services:
app:
build:
context: .
dockerfile: docker/Dockerfile
container_name: app_1
tty: true
depends_on:
- db
- dbtest
working_dir: /var/www
volumes:
- ./:/var/www
webserver:
image: nginx:stable
container_name: app_1_webserver
restart: always
ports:
- "80:80"
depends_on:
- app
volumes:
- ./:/var/www
- ./docker/app.conf:/etc/nginx/conf.d/default.conf
links:
- app
# ...
在我的/etc/hosts
,我可以添加类似
127.0.0.1 app-1.test
现在我可以通过浏览器调用应用程序了app-1.test
。
第二个有类似的设置,但它当然不会上去,因为端口 80 被阻塞了。我当然可以更改端口,但是 url 将类似于app-2.test:81
而不是app-2.test
. 我可以做什么,以便我可以在不同的本地主机名下运行第二个应用程序?还是使用不同的端口是最好的方法?
解决方案
你不能。您可以做的是在您的图像(第三个图像)前面添加一个“路由器”,它根据主机名进行路由(代理传递)。
Apache 或 Nginx 经常用于这类事情。
例如使用 apache 服务器 https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html
<VirtualHost *:80>
ServerName app-1.test
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://image1:80/
ProxyPassReverse / http://image1:80/
ErrorLog /var/log/apache2/error.log
LogLevel info
CustomLog /var/log/apache2/access.log combined
</VirtualHost>
<VirtualHost *:80>
ServerName app-2.test
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://image2:80/
ProxyPassReverse / http://image2:80/
ErrorLog /var/log/apache2/error.log
LogLevel info
CustomLog /var/log/apache2/access.log combined
</VirtualHost>
现在您可以在 /etc/hosts 文件中的同一 IP 上添加这两个名称,并且服务器可以根据提供的主机名(ServerName)在内部进行路由。
(http://image1:80/
及其类似的)引用应更改为 docker-compose.yml 中指定的 docker 内部 dns
推荐阅读
- c++ - 跳转/尾调用另一个函数
- pdf-generation - 阿拉伯文本没有以正确的格式显示。
- javascript - 删除多维数组树的属性 - 使用 lodash 或下划线或 js
- windows - 分析 Windows 进程长期 CPU 使用率的最佳方法
- python - 将列表推导转换为 for 循环
- html - 去除蓝色高亮
- android - 如何有效地为 ArrayAdapter 存储数据?
- android - How to make Emulator respond in an android studio for the first time start up
- sql-server - execute Oracle stored procedure from SQL Server 2012
- java - InetAddress.getLocalHost() 如何工作?