2017-07-27 150 views
1

編輯訪問nginx的服務器位置,以特定的碼頭工人容器:塔倫的答案不正是我問。歐根的答案也是一個非常好的解決方案。我最終接受塔倫的答案是正確的,但是使用了歐根的答案。如果你有類似的問題並擔心其他容器訪問nginx狀態服務器,請使用Tarun的答案。如果你想堅持Docker的正常主機名方案,請使用Eugen's。限制爲「允許」指令

+++原始的問題+++

我有我建立與碼頭工人,組成一個應用程序。我正試圖通過DataDog集成監控。我使用DataDog的代理容器,到目前爲止一切正常。我試圖通過修改this tutorial來啓動並運行nginx監控。

我的應用程序在這樣的碼頭工人,撰寫文件中定義:

version: '2' 
services: 
    flask: 
    restart: always 
    image: me/flask-app 
    command: /home/app/flask/start_app.sh 
    expose: 
     - "8080" 

    nginx: 
    restart: always 
    build: ./nginx 
    command: /runtime/start_nginx.sh 
    ports: 
     - "80:80" 
     - "443:443" 
    expose: 
     - "81" 
    volumes: 
     - app-static:/app-static:ro 
    links: 
     - flask:flask 

    datadog-agent: 
    image: me/datadog-agent 
    env_file: ./datadog-agent/dev.env 
    links: 
     - flask 
     - nginx 
    volumes: 
     - /var/run/docker.sock:/var/run/docker.sock 
     - /proc/mounts:/host/proc/mounts:ro 
     - /sys/fs/cgroup:/host/sys/fs/cgroup:ro 

每本教程中,我添加了一個服務器塊nginx的,看起來像這樣:

server { 
    listen 81; 

    location /nginx_status { 
    stub_status on; 
    access_log off; 
    allow 127.0.0.1; 
    deny all; 
    } 
} 

隨着這個配置,我可以檢查nginx容器內的nginx狀態。到現在爲止還挺好。現在我想更改位置塊中的「allow」指令以允許僅訪問數據代理服務。但是,我不知道datadog-agent的IP。在配置訪問瓶uwsgi服務器,我可以用指令是這樣的:

location/{ 
    uwsgi_pass: flask:8080; 
} 

但是這似乎並沒有工作了允許指示;如果我嘗試:

location /nginx_status { 
    ... 
    allow datadog-agent; 
    ... 
} 

我得到以下錯誤:

nginx: [emerg] invalid parameter "datadog-agent" in /etc/nginx/sites-enabled/nginx-status:8 

我怎樣才能安全地暴露nginx的狀態,我的監測容器?

+0

言之過早不可能。我正在研究一個可能的解決方案 –

+0

您是否在尋找[autodiscovery](https://docs.datadoghq.com/guides/autodiscovery/)? – stephenlechner

+0

@TarunLalwani太棒了 - 我會繼續檢查這個帖子。 – nrlakin

回答

2

由於我們是通過docker-compose運行的服務,我們的問題是我們不知道代理的IP。所以簡單的解決方案是在開始之前知道IP。這意味着分配給我們的代理特定的IP

下面是一個更新docker-compose

version: '2' 
services: 
    flask: 
    restart: always 
    image: me/flask-app 
    command: /home/app/flask/start_app.sh 
    expose: 
     - "8080" 

    nginx: 
    restart: always 
    build: ./nginx 
    command: /runtime/start_nginx.sh 
    ports: 
     - "80:80" 
     - "443:443" 
    expose: 
     - "81" 
    volumes: 
     - app-static:/app-static:ro 
    links: 
     - flask:flask 
    networks: 
     agent: 
     ipv4_address: 172.25.0.101 
     default: 

    datadog-agent: 
    image: me/datadog-agent 
    env_file: ./datadog-agent/dev.env 
    links: 
     - flask 
     - nginx 
    volumes: 
     - /var/run/docker.sock:/var/run/docker.sock 
     - /proc/mounts:/host/proc/mounts:ro 
     - /sys/fs/cgroup:/host/sys/fs/cgroup:ro 
    networks: 
     agent: 
     ipv4_address: 172.25.0.100 
networks: 
    agent: 
    driver: bridge 
    ipam: 
     config: 
     - subnet: 172.25.0.0/24 

現在你可以做兩種可能的事情

server { 
    listen 172.25.0.101:81; 

    location /nginx_status { 
    stub_status on; 
    access_log off; 
    allow 127.0.0.1; 
    allow 172.25.0.100; 
    deny all; 
    } 
} 

您可以只監聽172.25.0.101這是隻能在代理網絡上運行的容器。您也可以添加allow 172.25.0.100以僅允許代理容器訪問此容器。

2

有不同的想法:)

做綁定端口10080的服務器,該服務器確實提供的狀態位置。 80/443也在那裏,只有那些綁定到主機端口(暴露於外部世界)。

由於datadog是你的搬運工網絡/服務網絡的一部分,它仍然可以訪問10080,但沒有別的。

防彈,容易 - 無任何附加條件。

+1

讓我看看我是否明白。我從我的服務器塊中刪除允許/拒絕指令。我聽一些高端隨機端口(我目前使用81,但可能是10080)。我公開端口(就像我現在,而不是使用「端口」指令)。 (僞)端口可供所有鏈接的容器訪問,但不能訪問主機上的物理端口。 DataDog可以訪問統計信息,我的Flask容器也可以訪問統計信息,但除此之外什麼都不能。我將卸載責任保護從nginx到docker的數據,但只要沒有人進入另一個鏈接的容器(然後我無論如何都被搞砸了),我很好。正確? – nrlakin

+0

。確保你的意思是從dockerfile中'揭露',而不是像在「主機」上暴露的那樣(這不是你所想的)。我們可以說,10080是集裝箱的私人港口。你可以選擇你喜歡的任何港口,但是高端港口在這裏是有意義的,它是一種習俗 - 你不想侵犯別人的道路。 如果有人進入你的主機上的docker-server,他是root的,沒有什麼可以防範的,對。但是,這和碼頭工人一樣安全,而且大多數其他的Linux工作都是如此。 –

+0

我最終接受了Tarun的回答,因爲它完全符合我的要求,但我想我可能會走這條路,因爲使用Docker的DNS似乎不那麼脆弱。我將編輯這個問題,並將您的答案也歸功於您。 – nrlakin