什么是提供静态和动态内容的docker模式

时间:2014-09-18 10:17:24

标签: docker

我有一个简单的python / flask应用程序。在container

上就是这样的
/var/www/app/
  appl/
    static/
      ...
    app.py
  wsgi.py

在使用docker之前,我曾经让nginx直接提供静态文件。像这样:

location /static {
    alias  /var/www/www.domain.com/appl/static;
}

location / {
    uwsgi_pass unix:///tmp/uwsgi/www.domain.com.sock;
    include uwsgi_params;
}

但现在静态文件位于容器内部,nginx无法访问。

我可以想到两种可能的解决方案:

  1. 像以前一样在容器内启动一个nginx,让主机nginx使用像8000这样的端口与容器nginx进行通信

  2. (host)/var/www/www.domain.com/static安装到(container)/var/www/static并复制run.sh

  3. 中的所有静态文件

    码头工人更喜欢什么?

2 个答案:

答案 0 :(得分:1)

我更喜欢第一个解决方案,因为它与构建12 factor app的因子7保持一致:暴露端口上的所有服务。对于通过Nginx运行两次的请求肯定会有一些开销,但它可能不足以担心(如果它只是在你的池中添加更多容器)。在容器启动后使用自定义运行脚本执行主机端工作将使用Docker生态系统中的工具扩展应用程序变得非常困难。

答案 1 :(得分:1)

我不喜欢第一种解决方案,因为在一个容器上运行多个服务并不是一种泊坞方式。

总的来说,我们希望将静态文件夹暴露给nginx,然后Volume是最佳选择。但是有一些不同的方法可以做到这一点。

  1. 如您所述,将(host)/var/www/www.domain.com/static挂载到(container)/var/www/static并复制run.sh

  2. 中的所有静态文件
  3. 使用nginx缓存,让nginx为您缓存静态文件。 例如,我们可以写这样的conf,让nginx用30min解析静态内容

  4. -

    proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache:30m max_size=1G;
    
    upstream app_upstream {
      server app:5000;
    }
    
    location /static {
        proxy_cache cache;
        proxy_cache_valid 30m;
        proxy_pass  http://app_upstream;
    }
    
    1. 信任uwsgi并使用uwsgi来提供静态内容。 Serving static files with uWSGI