首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解Docker使用Docker-Alpine Python-Flask组合Nginx-Proxy

理解Docker使用Docker-Alpine Python-Flask组合Nginx-Proxy
EN

Stack Overflow用户
提问于 2018-10-10 15:42:17
回答 1查看 796关注 0票数 0

我在使用Docker时遇到了一些问题。我的问题是在使用docker-compose和这个库https://github.com/jwilder/nginx-proxy时理解反向代理

所以我有一个Dockerfile,如下所示:

代码语言:javascript
复制
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"]

当我在跑步的时候

代码语言:javascript
复制
docker build -t name/name . #success
docker run -d --name=container_name -p 80 name/name:latest #success

我在奔跑

代码语言:javascript
复制
curl -i localhost/page #success

-我的问题是理解使用nginx-proxy -在分配的端口内

1创建docker网络名称reverse-proxy并运行jwilder/nginx-proxy

代码语言:javascript
复制
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

代码语言:javascript
复制
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

然后运行

代码语言:javascript
复制
docker-compose up -d #success without error

和输出坞器ps

代码语言:javascript
复制
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的url时,服务临时UnAvailable

代码语言:javascript
复制
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>

那我就被困在这里了。

谢谢,ik

EN

回答 1

Stack Overflow用户

发布于 2019-03-28 07:41:23

jwilder/nginx-proxy为您定义了VIRTUAL_HOST的每个容器生成一个Nginx default.conf

由于您已经在一个容器上定义了VIRTUAL_HOST=atkrequest.api.dev,因此生成的default.conf将如下所示

代码语言:javascript
复制
# 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并能够使用localhost访问atk-request容器-请将其环境变量更改为VIRTUAL_HOST=localhost。(Overkill技术,因为您可以简单地暴露端口80:80而不使用nginx-proxy,但我将其包括在内是为了解释)

如果你想通过atkrequest.api.dev访问atk-request容器,只需将127.0.0.1 atkrequest.api.dev添加到你的/etc/hosts中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52735085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档