Virtualhost:使用 Docker 将 Flask 网站放到网上
Virtualhost: Put online a Flask website with Docker
我尝试使用 Docker 将 Flask 网站放到网上。因此,我创建了一个 Docker 文件,一个 docker-compose,现在我可以使用我的域名在线查看我的网站。
尽管有我的虚拟主机,但我无法使用子域和没有端口“:5000”的方式访问我的网站。这个虚拟主机似乎完全被忽略了!
Docker文件:
从python:latest
RUN apt-get update && apt-get install -y apache2 \
libapache2-mod-wsgi \
build-essential \
python \
python-dev \
python-pip \
vim \
&& apt-get clean \
&& apt-get autoremove
RUN apt-get install -y wget
COPY src /var/www/flask
RUN apt-get install -y python-requests
RUN pip install flask-user
RUN pip install -r var/www/flask/myapp/requirements.txt
COPY src/myapp/myapp.conf /etc/apache2/sites-available/myapp.conf
RUN a2enmod rewrite
RUN a2enmod wsgi
RUN a2enmod proxy_http
RUN a2ensite myapp.conf
RUN service apache2 restart
EXPOSE 80
docker-compose.yml
flask:
image: flask:latest
command: python /var/www/flask/myapp/__init__.py
volumes:
- "/root/workspace/python/src/:/var/www/flask"
ports:
- "5000:5000"
虚拟主机
<VirtualHost *:80>
ServerName my.domain.guru
WSGIDaemonProcess myapp
WSGIScriptAlias / /var/www/flask/myapp/myapp.wsgi
<Directory /var/www/flask/myapp>
WSGIProcessGroup myapp
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
ProxyPass / http://localhost:5000/
ProxyPassReverse / http://localhost:5000/
ProxyPreserveHost On
</VirtualHost>
__init__.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "test"
if __name__ == "__main__":
app.run(host='0.0.0.0')
有了这些 URL 我可以看到我的网站:
- "my.domain.guru:5000"
- "domain.guru:5000"(为什么?)
但是,我只想通过 URL 访问我的网站:“my.domain.guru”。如果我尝试使用此 URL,我会收到以下错误消息:
Forbidden
You don't have permission to access / on this server.
如何操作?
(我无法使用80端口,因为它已经被其他网站使用了)
这是端口 80:"my.domain.guru",因此您需要配置当前 运行 位于 80 的 Web 服务器以在 5000 中代理您的应用程序。
此外,您永远不会 运行 连接 Apache,因为您的命令 运行 仅 __init__.py
。不要将容器视为具有自己的服务管理的轻量级 VM。容器 运行 仅包含您在 Dockerfile 或 docker-compose 中定义的 command/entrypoint。
所以我的建议是将您的命令更改为 运行 Apache (/usr/sbin/apache2 -DFOREGROUND
) 或将您当前的 Web 服务器指向端口 80 以代理 flask 的端口 5000。
我尝试使用 Docker 将 Flask 网站放到网上。因此,我创建了一个 Docker 文件,一个 docker-compose,现在我可以使用我的域名在线查看我的网站。
尽管有我的虚拟主机,但我无法使用子域和没有端口“:5000”的方式访问我的网站。这个虚拟主机似乎完全被忽略了!
Docker文件:
从python:latest
RUN apt-get update && apt-get install -y apache2 \
libapache2-mod-wsgi \
build-essential \
python \
python-dev \
python-pip \
vim \
&& apt-get clean \
&& apt-get autoremove
RUN apt-get install -y wget
COPY src /var/www/flask
RUN apt-get install -y python-requests
RUN pip install flask-user
RUN pip install -r var/www/flask/myapp/requirements.txt
COPY src/myapp/myapp.conf /etc/apache2/sites-available/myapp.conf
RUN a2enmod rewrite
RUN a2enmod wsgi
RUN a2enmod proxy_http
RUN a2ensite myapp.conf
RUN service apache2 restart
EXPOSE 80
docker-compose.yml
flask:
image: flask:latest
command: python /var/www/flask/myapp/__init__.py
volumes:
- "/root/workspace/python/src/:/var/www/flask"
ports:
- "5000:5000"
虚拟主机
<VirtualHost *:80>
ServerName my.domain.guru
WSGIDaemonProcess myapp
WSGIScriptAlias / /var/www/flask/myapp/myapp.wsgi
<Directory /var/www/flask/myapp>
WSGIProcessGroup myapp
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
ProxyPass / http://localhost:5000/
ProxyPassReverse / http://localhost:5000/
ProxyPreserveHost On
</VirtualHost>
__init__.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "test"
if __name__ == "__main__":
app.run(host='0.0.0.0')
有了这些 URL 我可以看到我的网站:
- "my.domain.guru:5000"
- "domain.guru:5000"(为什么?)
但是,我只想通过 URL 访问我的网站:“my.domain.guru”。如果我尝试使用此 URL,我会收到以下错误消息:
Forbidden
You don't have permission to access / on this server.
如何操作?
(我无法使用80端口,因为它已经被其他网站使用了)
这是端口 80:"my.domain.guru",因此您需要配置当前 运行 位于 80 的 Web 服务器以在 5000 中代理您的应用程序。
此外,您永远不会 运行 连接 Apache,因为您的命令 运行 仅 __init__.py
。不要将容器视为具有自己的服务管理的轻量级 VM。容器 运行 仅包含您在 Dockerfile 或 docker-compose 中定义的 command/entrypoint。
所以我的建议是将您的命令更改为 运行 Apache (/usr/sbin/apache2 -DFOREGROUND
) 或将您当前的 Web 服务器指向端口 80 以代理 flask 的端口 5000。