2017-03-01 54 views
4

對於使用traefik作爲Docker容器前的反向代理,其動態IP地址可能隨時間而改變,traefik附帶docker backend。我可以找到的所有設置都遵循相同的模式:帶docker後端的traefik反向代理 - 在traefik的配置文件中配置前端規則而不是通過容器標籤

首先,在沒有額外配置文件的情況下啓動trafik模式docker,激活主機網絡模式(可選,以便traefik可以看到主機上的所有Docker網絡如果需要的話)並安裝Docker unix套接字,以便traefik可以聽到容器的啓動和停止。

docker run --rm -p 80:80 --net=host --name traefik-reverse-proxy -v /dev/null/traefik.toml:/etc/traefik/traefik.toml -v /var/run/docker.sock:/var/run/docker.sock traefik --docker --loglevel debug 

然後,啓動另一個容器中,至少設置以下labels

  • traefik.backend: 「一些-後端名」
  • traefik.frontend.rule:「主機:本地主機;方法:GET」(或任何你的規則)
  • traefik.port:80(或任何與您的容器內部公開)

實施例:

docker run --rm --name nginx -l traefik.backend="some-backend-name" -l traefik.frontend.rule="Host: localhost; Method: GET" -l traefik.port="80 nginx 

然後,做一個curl localhost,一個可在容器traefik,它採取了該請求,並將其路由到NGINX容器的日誌中看到。

到目前爲止,一切都很好。不過,我不喜歡的事實,我必須配置我的反向代理轉發規則(如前主持人:some.host.name集裝箱XXX)在應用程序中(我的docker-compose文件設置容器,標籤等通常位於此處)。相反,我想將它與應用程序分開,並將其配置爲traefik配置的一部分。

這是可能以某種方式?我試圖從例如nginx的容器留出了traefik.frontend.rule標籤,而不是安裝在下面的配置文件traefik

[frontends] 
    [frontends.frontend1] 
    backend = "some-backend-name" 
    [frontends.frontend1.routes.test_1] 
    rule = "Host: localhost; Method: GET" 

traefik啓動命令,這樣就變成了:

docker run --rm -p 80:80 --net=host --name traefik-reverse-proxy -v $PWD/traefik.toml:/etc/traefik/traefik.toml -v /var/run/docker.sock:/var/run/docker.sock traefik --docker --loglevel debug 

然而,這並似乎沒有將配置文件中的前端規則與nginx容器中的後端標籤相關聯。 curl localhost現在會返回404/Not found錯誤。

回答

0

這可能是操作問題的順序。在配置文件(debug = true)中啓用調試日誌記錄顯示,traefik首先解析配置文件前端規則,然後才根據docker中正在運行的內容生成前端和後端。

這意味着創建從配置的前端時,不存在泊塢窗後端,它拋出和錯誤。

一種解決方法是把你的規則配置在一個單獨的文件(例如rules.tomlshown in the docs)和watch = true指令添加到您的配置。這意味着您在此處定義的前端規則將在生成docker後端後更新。

我們應該爲此提交一個錯誤,因爲它不是完全合乎需要的功能。

+0

感謝您的輸入。但是,在嘗試此操作時,結果完全相同。如果你碰巧找到一個這樣的工作例子,讓我知道。 – Dirk

1

手錶標誌似乎只在rule.toml第一次更改的條件下工作。

在你的情況,我建議你寫一個服務來更新你的規則在etcd或zookeeper。服務讀取etcd更改並更新etcd中的traefik配置。

相關問題