NGINX和多个docker-compose

时间:2018-01-03 11:36:47

标签: docker nginx docker-compose

如果我想用我的docker容器设置NGINX,可以选择在我的docker-compose.yml中设置NGINX实例,并将NGINX容器链接到所有应用程序容器。

然而,这种方法的缺点是docker-compose.yml变为服务器级别,因为只有一个NGINX容器可以将端口80/443暴露给互联网。

我感兴趣的是,能够在同一台服务器上定义多个docker-compose.yml,但仍然可以通过单个服务器特定的NGINX容器轻松地在每个撰写文件中公开面向公众的容器。

我觉得这应该很容易,但我无法为此找到一个好的资源或例子。

1 个答案:

答案 0 :(得分:13)

首先,您需要为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将host放入变量中。有了这个黑客,nginx不会尝试解析主机,直到收到请求。

通过这种组合,您可以始终启动nginx,同时独立启动和停止代理应用程序。

<强> UPD: 如果您想要更多动态解决方案,可以通过以下方式修改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的请求将被传递给容器&#34; webapp1&#34;,webapp2.example.com到&#34; webapp2&#34;您只需添加DNS记录并运行具有正确名称的应用容器即可。