2017-07-27 102 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