使用nginx和dockerize flask应用程序进行Python应用程序部署

时间:2020-09-15 07:20:44

标签: docker nginx flask

我想在我的VPS上部署flask应用程序。我想出了没有docker的简单方法,但是现在我将docker化了该应用程序,并使用docker-composer.yml运行它。

services:                                                                      │
  myapp:                                                           │
    build: ./myapp                                          │
    container_name: myapp                                         │
    restart: always                                                            │
    environment:                                                               │
      - APP_NAME = myapp                                          │
    expose:                                                                    │
      - 8081  

所以我更改了我的nginx conf 来自

   location / {
         include    uwsgi_params;
         uwsgi_pass unix:/home/username/path/to/socket/mysocker.sock;
     }

 location / {
     include    uwsgi_params;
     uwsgi_pass myapp:8081;
 }

该应用正在使用docker composer运行,但是当我使用nginx -t测试nginx中的正确设置时,我会收到此消息

nginx:[emerg]主机未在上游的“ myapp”中找到 / etc / nginx / sites-enabled / myapp:22 │nginx:配置文件/etc/nginx/nginx.conf测试失败

我非常确定,这意味着nginx找不到在docker中运行的myapp,并且无法与之通信,但是我公开了端口,据我了解,容器名称是主机名,因此它应该可以工作。 有谁知道如何使他们交流?我没有在互联网上找到任何教程,也不会将我不想的nginx码头化。

任何帮助都将得到补偿

编辑: 这是我的Dockerfile

FROM python:3.8.5-buster                                                     
                                                                             
WORKDIR /app                                                                 
                                                                             
ADD . /app                                                                   
                                                                             
RUN apt-get update -y && apt-get -y install curl && apt-get install libsasl2$
RUN pip3 install mysqlclient                                                 
RUN pip3 install blinker                                                     
RUN pip3 install pyOpenSSL                                                   
RUN pip3 install uwsgi                                                       
RUN pip3 install -r requirements.txt                                         
CMD ["uwsgi", "myproject.ini", "--enable-threads"]  

UWSGI

[uwsgi]                                                                                                                                                             
wsgi-file=wsgi.py                                                                                                                                                   
callable=app                                                                                                                                                        
socket=8081                                                                                                                                                         
module = wsgi:app                                                                                                                                                   
master = true                                                                                                                                                       
processes = 1                                                                                                                                                       
chmod-socket = 666                                                                                                                                                  
vacuum = true                                                                                                                                                       
harakiri = 120                                                                                                                                                      
die-on-term = true   

解决方案

  1. 将socket = 8081更改为socket = 0.0.0.0:8081
  2. 更改nginx以在localhost:8081上侦听
  3. 将端口8081:8081添加到docker-compose

1 个答案:

答案 0 :(得分:1)

Docker在容器内部的127.0.0.11上具有内部DNS服务器。如果您的nginx不在容器中,则不能使用它来解析myapp的名称。不过,您可以选择其中之一:

  1. 让您的容器监听主机的端口:
services:
  myapp:
    ports:  
      # host:container
      - 8081:8081

然后在您的nginx配置中反映此更改:

 location / {
     include    uwsgi_params;
     uwsgi_pass localhost:8081;
 }
  1. 返回使用unix套接字,但是这次将套接字放入主机目录中。为此,请先将主机的/tmp装入容器:
services:
  myapp:
    volumes:  
      # host:container
      - /tmp:/tmp

然后配置您的应用程序以将套接字放入/tmp中。该套接字将出现在主机的/tmp中,您可以配置nginx与之通信。如果您不装载整个/tmp,而是装载其中的单个目录,则可能会有所改善。例如/tmp/myapp。这样一来,您就消除了容器会使主机文件混乱的可能性。