python - 了解 Docker 使用 Docker-Alpine-Python-Flask 编写 Nginx-Proxy
问题描述
我在使用 Docker 时遇到了一些问题。我的问题是在使用 docker-compose 和这个库 https://github.com/jwilder/nginx-proxy时理解反向代理
所以我有 1 个像这样的 Dockerfile:
FROM alpine:latest
COPY requirements.txt /tmp/requirements.txt
RUN apk add --no-cache \
g++ \
gcc \
freetds \
ca-certificates \
build-base \
libc-dev \
python3 \
python3-dev \
unixodbc-dev \
bash \
nginx \
uwsgi \
uwsgi-python3 \
supervisor && \
python3 -m ensurepip && \
rm -r /usr/lib/python*/ensurepip && \
pip3 install --no-cache-dir --upgrade --force-reinstall pip setuptools && \
pip3 install -r /tmp/requirements.txt && \
rm /etc/nginx/conf.d/default.conf && \
rm -r /root/.cache
# Copy ODBC Driver
COPY odbc.ini /etc/
COPY odbcinst.ini /etc/
# Copy the Nginx global conf
COPY nginx.conf /etc/nginx/
# Copy the Flask Nginx site conf
COPY flask-site-nginx.conf /etc/nginx/conf.d/
# Copy the base uWSGI ini file to enable default dynamic uwsgi process number
COPY uwsgi.ini /etc/uwsgi/
# Custom Supervisord config
COPY supervisord.conf /etc/supervisord.conf
# Add demo app
COPY ./app /app
# EXPOSE 80
WORKDIR /app
CMD ["/usr/bin/supervisord"]
当我跑步时
docker build -t name/name . #success
docker run -d --name=container_name -p 80 name/name:latest #success
我跑了
curl -i localhost/page #success
------------ 我的问题是在分配的端口中使用 nginx-proxy ------------------ 时的理解
1 创建 docker 网络名称 reverse-proxy 并运行 jwilder/nginx-proxy
docker network create --driver bridge reverse-proxy
docker run -d -p 81:80 -p 444:443 \
--name reverse-proxy \
--net=reverse-proxy \
-v /var/run/docker.sock:/tmp/docker.sock:ro \
jwilder/nginx-proxy
这是我的 docker-compose.yml
version: "3"
services:
atk-request:
build: ./_atkrequest #path which Dockerfile is exists
container_name: api-atkrequest
restart: always
networks:
- reverse-proxy
# ports:
# - 80:80 #host:container
expose:
- 80
environment:
- VIRTUAL_HOST=atkrequest.api.dev #nginx-proxy host
- VIRTUAL_PORT=80 #nginx-proxy port
networks:
reverse-proxy:
external:
name: reverse-proxy
然后运行
docker-compose up -d #success without error
并输出 docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ca95a0f42de2 atkrequest_atk-request "/usr/bin/supervisord" 5 seconds ago Up 3 seconds 80/tcp api-atkrequest
c42a9f9d85b5 jwilder/nginx-proxy "/app/docker-entrypoâ¦" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp reverse-proxy
并且当使用 curl 错误代码 503 Service Temporary UnAvailable 调用 url
curl -i localhost
HTTP/1.1 503 Service Temporarily Unavailable
Server: nginx/1.14.0
Date: Wed, 10 Oct 2018 07:39:09 GMT
Content-Type: text/html
Content-Length: 213
Connection: keep-alive
<html>
<head><title>503 Service Temporarily Unavailable</title></head>
<body bgcolor="white">
<center><h1>503 Service Temporarily Unavailable</h1></center>
<hr><center>nginx/1.14.0</center>
</body>
</html>
然后我被困在这里......
谢谢我
解决方案
jwilder/nginx-proxy
生成一个 Nginx ,其中包含已定义default.conf
的每个容器的条目。VIRTUAL_HOST
由于您已VIRTUAL_HOST=atkrequest.api.dev
在其中一个容器上进行了定义,因此生成的default.conf
内容将类似于
# atkrequest.api.dev
upstream atkrequest.api.dev {
## Can be connected with "{{dir_name}}_default" network
# {{dir_name}}_atk-request
server {{atk-request container ip}}:80;
}
server {
server_name atkrequest.api.dev;
listen 80 ;
access_log /var/log/nginx/access.log vhost;
location / {
proxy_pass http://atkrequest.api.dev;
}
}
但是没有任何配置,localhost
因为您没有VIRTUAL_HOST=localhost
定义任何容器。因此,当您的请求到达时nginx-proxy
- 它会响应,503
因为它没有任何配置localhost
。
如果您想保留nginx-proxy
并能够访问atk-request
容器localhost
- 将其环境变量更改为VIRTUAL_HOST=localhost
. (矫枉过正的技术,因为你可以简单地暴露端口80:80
而不是使用nginx-proxy
,但我把它包括在内是为了解释)
如果您想atk-request
使用 - 访问容器,atkrequest.api.dev
只需添加127.0.0.1 atkrequest.api.dev
到您的/etc/hosts
.
推荐阅读
- reactjs - 如何通过切换功能与钩子反应来设置和清理间隔?
- python - 这个 python/mysql 查询是否容易受到 SQL 注入的影响
- python - Django ModelAdmin 更改表单上输入的特定查询集
- azure - 为数百个 SaaS 租户发布管道
- php - php文件没有从网络服务器执行python文件
- javascript - TinyMCE 设置内容问题
- java - 可选的
可选 - ssl - 如何使用 openssl 进行 TLS 1.3 PSK?
- svg - SVG嵌套过滤器使白色透明
- php - 从数据库中查找两个日期之间的差异并将不同的日期保存到 Laravel 中的数据库