docker - 如何使用多个 docker-compose.yml 文件配置 nginx?

标签 docker nginx docker-compose

如果我想用我的 docker 容器设置 nginx,一种选择是在我的 docker-compose.yml 中设置 nginx 实例。 ,并将 nginx 容器链接到所有应用程序容器。
然而,这种方法的缺点是 docker-compose.yml成为服务器级别,因为只有一个 nginx 容器可以将端口 80/443 暴露给互联网。
我有兴趣能够定义几个 docker-compose.yml文件在同一台服务器上,但仍然可以通过单个特定于服务器的 nginx 容器轻松公开每个撰写文件中面向公众的容器。
我觉得这应该很容易,但我一直无法为此找到好的资源或示例。

最佳答案

首先,您需要为 nginx 和代理容器创建网络:

docker network create nginx_network
接下来,在一个 compose 文件中配置 nginx 容器,如下所示:
services:
  nginx:
    image: your_nginx_image
    ports:
      - "80:80"
      - "443:443"
    networks:
      - nginx_network
networks:
  nginx_network:
    external: true
之后,您可以运行代理容器:
services:
  webapp1:
    image: ...
    container_name: mywebapp1
    networks:
      - nginx_network      # proxy and app must be in same network
      - webapp1_db_network # you can use additional networks for some stuff
  database:
    image: ...
    networks:
      - webapp1_db_network
networks:
  nginx_network:
    external: true
  webapp1_db_network: ~ # this network won't be accessible from outside
此外,要完成这项工作,您需要正确配置 nginx:
server {
    listen 80;
    server_name your_app.example.com;
    
    # Docker DNS
    resolver 127.0.0.11;
  
    location / {
        # hack to prevent nginx to resolve container's host on start up
        set $docker_host "mywebapp1";
        proxy_pass http://$docker_host:8080;
    }
}
您需要告诉 nginx 使用 Docker 的 DNS,以便它能够通过名称访问容器。
但是请注意,如果您在其他容器之前运行 nginx 容器,那么 nginx 将尝试解析另一个容器的主机并失败,因为其他容器尚未运行。您可以使用 hack 将主机放入变量中。通过这个 hack,nginx 不会在收到请求之前尝试解析主机。
通过这种组合,您可以让 nginx 始终运行,同时独立启动和停止代理应用程序。
更新:
如果你想要更动态的解决方案,你可以修改nginx配置如下:
server {
    listen 80;
    resolver 127.0.0.11;
    
    # define server_name with regexp which will read subdomain into variable
    server_name ~^(?<webapp>.+)\.example\.com;

    location / {
        # use variable from regexp to pass request to desired container
        proxy_pass http://$webapp:8080;
    }
}
使用此配置,对 webapp1.example.com 的请求将传递给容器“webapp1”,将 webapp2.example.com 传递给“webapp2”等。您只需要添加 DNS 记录并使用正确的名称运行应用程序容器。

关于docker - 如何使用多个 docker-compose.yml 文件配置 nginx?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48076605/

相关文章:

docker - Docker-Compose Up可以运行,但是Eb Local Run不能运行

docker - 如何修复 : yum install with error in docker container?

node.js - 具有多个位置的 node & express + nginx

linux - Nginx无法打开certs文件夹中的cert.pem文件

linux - OWASP ZAP 错误 : "Too many active connections right now" [Docker Image]

docker - 如何更改 Dockerfile 中文件的权限?

javascript - 如何在同一个域和同一个端口上托管多个 Meteor 应用程序?

node.js - WebStorm Node.js 远程调试是否可以与 Docker 容器中的 Node.js v8 配合使用?

django - 没有在带有 Docker 的 Django 应用程序上提交工作服

docker-compose volume 为空