首頁  >  問答  >  主體

在一台主機docker上跑著數個不同的網站容器,如何把80和443埠流量正確的轉送給對應容器呢?

求助。 。有dalao寫過教學的話把文章連結貼出來也行。 。百度了一圈已經昏迷。 。

PHP中文网PHP中文网2701 天前1351

全部回覆(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 變數很可能需要與 VIRTUAL_HOST 變數相同,且必須是可公開存取的領域。使用逗號分隔符號指定多個主機。

    以下環境變數是可選的,它們參數化 Let's Encrypt 用戶端的工作方式。

    • LETSENCRYPT_KEYSIZE

    LETSENCRYPT_KEYSIZE

    變數決定請求密鑰的大小(以位元為單位,預設為4096)。 多域(SAN)憑證

    如果您想要建立多域(SAN)證書,請將基域新增為
    LETSENCRYPT_HOST

    環境變數的第一個域。

    測試證書

    如果要建立沒有 5 個證書/週/域限制的測試證書,請定義值為 trueLETSENCRYPT_TEST 環境變數(在使用 LETSENCRYPT_HOST 請求證書的容器中)。如果您想要對所有容器全域執行此操作,請按如下所述設定 ACME_CA_URI。

    自動更新憑證

    每小時(3600 秒)檢查一次證書,並更新將在接下來的 30 天(90 天/3)內到期的每個證書。

    範例:
    雷雷

    可選容器環境變數

    可選的letsencrypt-nginx-proxy-companion容器環境變數用於自訂配置。

    • ACME_CA_URI - CA ACME API 端點的目錄 URI(預設值:https://acme-v01.api.letsencrypt.org/directory)。如果您將其值設為https://acme-staging.api.letsencrypt.org/directory,LetsEncrypt 將使用沒有 5 個憑證/週/網域限制的測試伺服器。您也可以為每個容器建立測試證書(請參閱讓我們加密測試證書)

    例如

    雷雷
    • DEBUG - 將其設為 true 以啟用入口點腳本的偵錯和 LetsEncrypt 憑證的生成,這可以幫助您找出任何設定問題。

    • 「com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true」標籤 - 在 nginx-proxy 容器上設定此標籤,告訴 docker-letsencrypt-nginx-proxy-companion 容器將其用作代理。

    • ACME_TOS_HASH - 讓您將替代的 TOS 雜湊傳遞給 simpl_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
  • 取消回覆