使用“allow”指令将对nginx服务器位置的访问限制到特定的Docker容器

编辑:塔伦的答案正是我所要求的。 欧根的答案也是一个很好的解决scheme。 我最终接受塔伦的答案是正确的,但使用欧根的。 如果你有类似的问题,并担心其他容器访问nginx状态服务器,请使用Tarun的答案。 如果你愿意坚持Docker的正常主机名称,请使用Eugen's。

+++原始问题+++

我有一个应用程序,我用docker-compose构build。 我正试图通过DataDog集成监控。 我正在使用DataDog的代理容器,到目前为止一切正常。 我想通过调整本教程来让nginx监视起来并运行。

我的应用程序在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 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; } } 

有了这个configuration,我可以检查nginx容器内的nginx状态。 到现在为止还挺好。 现在我想更改位置块中的“allow”指令,只允许访问数据代理服务。 但是,我不知道datadog-agent的IP。 当configuration对Flask 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状态到我的监控容器?

由于我们通过docker-compose运行服务,而我们的问题是我们不知道代理的IP。 所以简单的解决scheme是在开始之前知道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上进行172.25.0.101 ,该代理networking上只能运行容器。 您也可以添加allow 172.25.0.100只允许代理容器能够访问此。

换个angular度吧:)

在端口10080上绑定服务器,该服务器提供状态位置。 80/443也在那里,只有那些必须主机端口(暴露于外部世界)。

由于datadog是您的dockernetworking/服务networking的一部分,它仍然可以访问10080,但没有别的。

防弹,简单 – 不附带任何条纹。