什么是服务静态和dynamic内容的docker模式

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

 /var/www/app/ appl/ static/ ... app.py wsgi.py 

我曾经让nginx在使用docker之前直接提供静态文件。 喜欢这个:

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

但是现在静态文件在容器内,不能被nginx访问。

我可以想到2个可能的解决scheme:

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

  2. (host)/var/www/www.domain.com/static装载到(container)/var/www/static并将所有静态文件复制到run.sh

docker工人喜欢什么?

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

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

总的来说,我们想把我们的静态文件夹暴露给nginx,那么Volume是最好的select。 但是有一些不同的方法可以做到这一点。

  1. 正如你所提到的,将(host)/var/www/www.domain.com/static挂载到(container)/var/www/static并将所有静态文件复制到run.sh

  2. 使用nginxcaching,让nginxcaching你的静态文件。 比如我们可以这样写我们的conf,让nginx用30min解决静态内容

 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来提供静态内容。 用uWSGI提供静态文件