我想在我的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
解决方案
答案 0 :(得分:1)
Docker在容器内部的127.0.0.11
上具有内部DNS服务器。如果您的nginx不在容器中,则不能使用它来解析myapp
的名称。不过,您可以选择其中之一:
services:
myapp:
ports:
# host:container
- 8081:8081
然后在您的nginx配置中反映此更改:
location / {
include uwsgi_params;
uwsgi_pass localhost:8081;
}
/tmp
装入容器:services:
myapp:
volumes:
# host:container
- /tmp:/tmp
然后配置您的应用程序以将套接字放入/tmp
中。该套接字将出现在主机的/tmp
中,您可以配置nginx与之通信。如果您不装载整个/tmp
,而是装载其中的单个目录,则可能会有所改善。例如/tmp/myapp
。这样一来,您就消除了容器会使主机文件混乱的可能性。