在一台主机docker上跑着数个不同的网站容器,如何把80和443端口流量正确的转发给对应容器呢?
PHP中文网
PHP中文网 2017-06-20 10:05:52
0
2
1359

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

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(2)
習慣沉默

折腾了一个下午,找到了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,然后再保存重建启动。

大家讲道理

由于容器只能直接绑定宿主机的端口,例如我有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  ....
  }
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板