如何在Docker镜像中使用Nginx连接我的应用程序?

时间:2017-07-03 14:16:11

标签: nginx docker reverse-proxy

我的Nginx不在泊坞窗图片中。我的应用程序是在docker镜像中。他们都住在同一台服务器上。

我不希望在Docker镜像中使用Nginx,因为我配置起来看起来非常复杂。但我的应用程序正在一个docker容器中运行。

如何配置Nginx以使用运行我的应用程序的docker镜像?

这是我的Nginx配置文件:

server {
       listen         80;
       server_name    my.domain.com;
       return         301 https://$server_name$request_uri;
}

server {
       listen         443 ssl;
       server_name    www.nicolasxu.space nicolasxu.space;
       # add Strict-Transport-Security to prevent man in the middle attacks
       add_header Strict-Transport-Security "max-age=31536000"; 


       ssl_certificate /root/.ssh/nicolasxu.space.cert;
       ssl_certificate_key /root/nicolasxu.space.key;
       [....]
} 

1 个答案:

答案 0 :(得分:2)

要在dockerized webapp前面轻松设置nginx(在docker主机中)作为反向代理,您只需--publish webapp的端口并将流量路由到此端口:

  1. 使用--publish参数运行docker容器,将主机端口与容器的webapp端口绑定,例如使用jenkins容器,我会这样做:

    docker run --publish 127.0.0.1:8080:8080 --name jenkins jenkins
    
  2. 这将容器的端口8080绑定到主机的localhost的127.0.0.1上的端口80(如果您不使用任何防火墙,这将避免向任何人打开端口8080)。 Docker User Guide详细解释了如何在Docker中操作端口。

    1. 将所有传入的流量转发为reverse proxy到您的端口的本地容器(在我的示例中为8080)

      server {
          ...
      
          listen         443 ssl;
          server_name    www.nicolasxu.space nicolasxu.space;
          ...
      
          ssl_certificate ...
      
          location / {
                  # forward all the trafic to docker container's published port
                  proxy_pass http://localhost:8080;
          }
      }
      
    2. 在nginx上设置SSL并将交通路由作为HTTP路由到dockerized webapp是一个很好的做法,它将像魅力一样工作。

      修改

      为了获得最佳性能,您还可以使用:

      docker run --network=host ...
      

      使用--network=host时,docker会指示容器使用主机网络堆栈。您不必拥有主机上的--publish端口,因为它是相同的网络堆栈,并且Web应用程序将在其本地端口上可用。