Docker化代理服务器,以便我可以通过vhost连接到容器。可能吗?

时间:2019-03-28 09:19:17

标签: docker nginx

目前,我有一个由LAMP堆栈(PHP,Apache,MySQL)组成的Docker容器。在http://localhost:my_specified_port上运行正常。但是,我想通过http://some_domain.dev访问它。我当前的解决方案是在本地使用NGINX作为代理并执行以下操作:

server {
    listen   80;
    server_name  some_domain.dev
    location / {
        proxy_pass http://localhost:my_specified_port;
    }
}

工作正常。但是,我想让我的同事更轻松,并且对NGINX服务器进行docker化,并获得相同的结果。有可能做到吗?我在网上找不到任何解决方案。非常感谢。

编辑:大修改。我忘了提一下,我想让docker中的NGINX在80以外的其他端口上工作。因此,如果某些人在本地安装了Apache,它仍然可以工作。

1 个答案:

答案 0 :(得分:0)

90%溶液

解决此问题的出发点是使用jwilder/nginx-proxy-dockerized Nginx反向代理。通过根据其他容器的env vars生成Nginx配置,它可以使您在问题中描述的过程自动化。

您需要一种方法来指向您的域以通过Nginx反向代理进行解析。最常见的方法是使用/etc/hosts。路线如下:

  • 浏览器搜索域
  • /etc/hosts说,该域解析为反向代理的ip
  • 反向代理检查其设置中是否存在域
  • 反向代理将请求转发到适当的容器

但是,由于您希望Nginx反向代理在80以外的端口上运行,因此您仍然需要使用端口访问所需的域。因此,此解决方案并不是您想要的100%,但它仍然是了解如何使用反向代理来模拟域名的一个很好的起点:

  • 运行docker run -d -p 8080:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
  • 将env var VIRTUAL_HOST=some_domain.dev添加到LAMP容器中(如果容器中的应用程序在不同于80的端口上运行,则也可以使用VIRTUAL_PORT={{any port number}}
  • 127.0.0.1 some_domain.dev添加到/etc/hosts
  • 访问http://some_domain.dev:8080

如果以后您想添加另一个具有不同域的容器化应用,则应该:

  • 将env var VIRTUAL_HOST=another_domain.dev添加到新应用程序的容器中
  • 127.0.0.1 another_domain.dev添加到/etc/hosts
  • 访问http://another_domain.dev:8080

100%溶液

如果您想以一种可维护的方式模拟域名,以在整个开发团队中扩展,则可以将jwilder/nginx-proxymitm-nginx-proxy-companion以及浏览器代理扩展一起使用。 mitm-nginx-proxy-companion包括mitmproxy和一个dns服务器,该服务器允许其将“本地域请求”发送到储备代理,并将其余请求发送到“真实”互联网。

设置后,的整个路径如下:

  • 您尝试在浏览器中访问域。
  • 代理扩展将请求转发到mitmproxy,而不是“真实”互联网。
  • mitmproxy尝试通过同一容器中的dns服务器解析域名。
    • 如果该域不是“本地”域,它将把请求转发到“真实”互联网。
    • 但是,如果域是“本地”域,它将把请求转发到反向代理。
  • 反向代理依次将请求转发到包含我们要访问的服务的适当容器。

对于mitm-nginx-proxy-companion,您无需使用/etc/hosts,因此,如果尝试了第一种解决方案,则应删除之前添加的条目。我正在以docker-compose格式添加解决方案,以便于编写/阅读

version: '3.3'

services:

  lamp:
    environment:
      VIRTUAL_HOST: some_domain.dev
      VIRTUAL_PORT: 9999
    image: my_lamp_image

  another_app:
    environment:
      VIRTUAL_HOST: another_domain.dev
    image: my_app_image

  nginx-proxy:
    image: jwilder/nginx-proxy
    labels:
      - "mitmproxy.proxyVirtualHosts=true"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro

  nginx-proxy-mitm:
    dns:
      - 127.0.0.1
    image: artemkloko/mitm-nginx-proxy-companion
    ports:
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro

那么您将需要

  • 运行docker-compose up
  • 在浏览器中添加代理扩展名,代理地址为127.0.0.1:8080
  • 访问http://some_domain.dev
  • 访问http://another_domain.dev

注意:我是mitm-nginx-proxy-companion

的作者