首页  >  问答  >  正文

在一台主机docker上跑着数个不同的网站容器,如何把80和443端口流量正确的转发给对应容器呢?

求助。。有dalao写过教程的话把文章链接贴出来也行。。百度了一圈已经昏迷。。

PHP中文网PHP中文网2701 天前1350

全部回复(2)我来回复

  • 習慣沉默

    習慣沉默2017-06-20 10:07:52

    折腾了一个下午,找到了docker的解决方案
    github:https://github.com/JrCs/docke...

    把重要的重点部分摘出来

    单独容器(推荐方法)

    nginx 代理还可以使用 jwilder/docker-gen
    镜像和官方 nginx 镜像作为两个独立的容器运行。

    您可能希望这样做是为了防止将 docker 套接字绑定到公开暴露的容器服务(避免将 docker 套接字挂载在 nginx 暴露的容器中)。从安全角度来看更好。

    要将 nginx 代理作为单独的容器运行,您需要:

    1)将模板文件nginx.tmpl挂载到docker-gen容器中。您可以使用以下命令获取最新的官方 nginx.tmpl:

    雷雷

    2) 将 NGINX_DOCKER_GEN_CONTAINER 环境变量设置为 docker-gen 容器的名称或 id。

    示例:

    • 首先使用卷启动 nginx(官方镜像):

    雷雷
    • 第二次启动带有共享卷和模板文件的 docker-gen 容器:

    雷雷
    • 然后启动这个容器(NGINX_DOCKER_GEN_CONTAINER变量必须包含docker-gen容器名称或id):

    雷雷

    然后按照前面的描述启动要代理的任何容器。

    • 如果由于某种原因你无法使用 docker --volumes-from 选项,你可以使用 NGINX_PROXY_CONTAINER 变量指定 nginx 容器的名称或 id。

    让我们加密

    使用 Let's Encrypt 服务自动为虚拟主机创建有效的证书。

    设置以下环境变量以启用对被代理的容器的 Let's Encrypt 支持。这个环境变量需要在每个要代理的应用程序容器中声明。

    • LETSENCRYPT_HOST

    • LETSENCRYPT_EMAIL

    LETSENCRYPT_HOST variable most likely needs to be the same as the VIRTUAL_HOST变量很可能需要与VIRTUAL_HOST变量相同,并且必须是可公开访问的域。使用逗号分隔符指定多个主机。

    以下环境变量是可选的,它们参数化 Let's Encrypt 客户端的工作方式。

    • LETSENCRYPT_KEYSIZE

    变量LETSENCRYPT_KEYSIZE决定请求密钥的大小(以位为单位,默认为4096)。

    多域(SAN)证书

    如果您想创建多域(SAN)证书,请将基本域添加为LETSENCRYPT_HOST环境变量的第一个域。

    测试证书

    如果您想创建没有 5 个证书/周/域限制的测试证书,请定义 LETSENCRYPT_TEST environment variable with a value of true(在使用 LETSENCRYPT_HOST 请求证书的容器中)。如果您想对所有容器全局执行此操作,请按如下所述设置 ACME_CA_URI。

    自动更新证书

    每小时(3600 秒)检查一次证书,并更新将在接下来的 30 天(90 天/3)内到期的每个证书。

    示例:
    雷雷

    可选容器环境变量

    可选的letsencrypt-nginx-proxy-companion容器环境变量用于自定义配置。

    • ACME_CA_URI - Directory URI for the CA ACME API endpoint (default: https://acme-v01.api.letsencrypt.org/directory). If you set it's value to https://acme-staging.api.letsencrypt.org/directory Letsencrypt 将使用没有 5 个证书/周/域限制的测试服务器。您还可以为每个容器创建测试证书(请参阅让我们加密测试证书)

    例如

    雷雷
    • DEBUG - Set it to true 启用入口点脚本的调试和 LetsEncrypt 证书的生成,这可以帮助您查明任何配置问题。

    • “com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true”标签 - 在 nginx-proxy 容器上设置此标签,告诉 docker-letsencrypt-nginx-proxy-companion 容器将其用作代理。

    • ACME_TOS_HASH - 让您将替代 TOS 哈希传递给 simp_le,以支持其他 CA 的 ACME 实现。

    示例:

    如果您想了解如何使用此容器的其他示例,请查看:

    • Karl Fathi 的例子

    • Karl 的更多示例

    • 乔治·伊耶斯的例子

    • Dmitry 的简单 docker-compose 示例

    注意,这里有一个坑,也怪我自己没看清楚,如果镜像已经暴露端口就设置VIRTUAL_HOST、LETSENCRYPT_HOST、LETSENCRYPT_EMAIL就行,如果没有就得在设置好三个环境变量之后自己加入--expose 容器内应用服务端口参数启动。如果容器是discourse这样的,就得在app.yml内设置好环境变量之后把端口映射的80:80改为未占用端口:80,然后再保存重建启动。

    回复
    0
  • 大家讲道理

    大家讲道理2017-06-20 10:07:52

    由于容器只能直接绑定宿主机的端口,例如我有10个web容器,那么这些容器都需要80或者443,这样-p参数不可行,所以要么是通过一个容器作为网关反向代理容器,用nginx,nginx容器进行-p,其他得php-fpm,node这样得web容器,通过nginx做反向代理来进行访问,证书也直接交给nginx服务器,进行443转发就可以实现了。

    其实这些都是基础只是和docker没关系

    这篇文章是一个lnmp环境,
    /a/11...

    如果是多个php-fpm或者node或者python后端服务的话,那么nginx应该是下面这样得

    server{
      listen 80;
      server_name web1;
      location /{
        proxy_pass  ....
      }
    }
    
    server{
      listen 80;
      server_name web2;
      location /{
        proxy_pass  ....
      }
    
    }
    
    server{
      listen 80;
      server_name web3;
      location /{
        proxy_pass  ....
      }
    }

    回复
    0
  • 取消回复