首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Caddy服务器:使用docker-compose在反向代理后面运行Django应用程序

Caddy服务器:使用docker-compose在反向代理后面运行Django应用程序
EN

Stack Overflow用户
提问于 2020-11-09 02:08:18
回答 1查看 2.2K关注 0票数 0

我刚刚发现了CaddyServer,它看起来非常有前途,可以在同一台虚拟机上运行多个应用程序。

但是我正在努力设置我的docker-compose.yml文件来处理外部域。稍后我将在生产环境中使用gunicorn,现在我很乐意让Django runserver正常工作。

下面是我的目录结构:

代码语言:javascript
复制
caddy/
    Caddyfile
    docker-compose.yml
djangoApp/
    docker-compose.yml
    Dockerfile
    config/
       ...
    manage.py
    requirements.txt
myghostapp/

这是caddy/Caddyfile

代码语言:javascript
复制
{
    email john@gmail.com 
    acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
}

app1.example.com {
    reverse_proxy django:8000
}

# app2.example.com {
#     reverse_proxy ghost:2368
# }

app2.example.com是我想要的第二个域,它指向一个ghost应用程序。这个可以在未注释的情况下工作(我将其包括在内以供参考)。

这是caddy/docker-compose (反向代理)

代码语言:javascript
复制
version: "3"

networks:
    web:
        external: true

services:
    caddy:
        image: caddy:2-alpine
        restart: unless-stopped
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - /data/caddy/Caddyfile:/etc/caddy/Caddyfile
        networks:
            - web

    django:
        build:
            context: /data/djangoApp/
            dockerfile: /data/djangoApp/Dockerfile
        restart: unless-stopped
        environment:
            - url=app1.example.com 
        volumes:
            - /data/djangoApp:/app/
        networks:
            - web

    # ghost:
    #     image: ghost:3.22-alpine
    #     restart: unless-stopped
    #     environment:
    #         - url=app2.example.com 
    #     volumes:
    #         - /data/myghostapp:/var/lib/ghost/content
    #     networks:
    #         - web

就目前而言,让Django应用程序正常工作将是一件很棒的事情。

djangoApp文件夹中,我有一个folder文件,如下所示:

代码语言:javascript
复制
# djangoApp/Dockerfile
FROM python:3

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN mkdir /app
WORKDIR /app
COPY requirements.txt /app/
RUN pip install -r requirements.txt
COPY . /app/

还有一个docker-compose.yml

代码语言:javascript
复制
# djangoApp/docker-compose.yml
version: "3.8"

services:
  db:
    image: postgres:10.5-alpine
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    networks:
      - web
      
  djangy:
    build: .
    command: bash -c "python /app/manage.py migrate --noinput && python /app/manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - db
    networks:
      - web
    links:
      - db:db  

volumes:
  postgres_data:

networks:
  web:
    external: true

我一直假设在我的虚拟机上,我可以简单地使用docker create network web,然后在caddy/中运行docker-compose up --build,然后在djangoApp/中运行相同的命令

但是当我尝试在浏览器中访问域名时,我在日志中得到了错误消息的lookup django on 127.0.0.11:53: no such host

任何帮助都将不胜感激!

EN

Stack Overflow用户

发布于 2021-02-05 21:42:54

对于在调试他们的docker-compose设置时发现这一点的任何人来说,我在发布它时的主要误解是,我认为我需要几个docker-compose文件。因为反向代理的全部要点是所有东西都需要共享端口80,所以这个假设现在看起来很愚蠢……

以下是我当前的工作设置:

代码语言:javascript
复制
version: "3"

networks:
    web:
        external: true

volumes:
    postgres_data:


services:
    # CaddyServer reverse proxy
    caddy:
        restart: always
        image: caddy:2-alpine
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - /local/path/to/Caddyfile:/path/inside/continer/to/Caddyfile
        networks:
            - web

    # Django web app
    django:
        restart: always
        build:
            context: .
            dockerfile: /local/path/to/Dockerfile
        expose:
            - 8000
        environment:
            - url=https://api.backend.example.com
        command:
            "gunicorn config.wsgi:application --bind 0.0.0.0:8000"
        env_file:
            - /home/jokea/flora/config/.env.django.prod
        depends_on:
            - db
        networks:
            - web


    # Django database
    db:
        restart: always
        image: postgres:12.0-alpine
        volumes:
            - postgres_data:/var/lib/path/inside/container/postgresql/data/
        env_file:
            - /path/to/environment/variables/file/.env.django.prod.db
        networks:
            - web

    # Nuxt frontend app
    nuxt:
        build: .
        ports:
            - "3000:3000"
        environment:
            - url=https://wwww.example.com
        volumes:
            - ./frontend:/var/lib/frontend
        command:
            "npm run start"
        env_file:
            - ./.env.django.prod
        networks:
            - web

它不会开箱即用,但希望它能提供一些线索。Caddyfile是

代码语言:javascript
复制
{
    email djangy@email.com
    # acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
}

https://api.backend.example.com{
    reverse_proxy django:8000
}

https://www.example.com  {
    reverse_proxy nuxt:3000
}

使用docker-compose创建反向代理的一个关键元素是外部网络(这里我称之为web)。这样,您可以提供对http和https端口的访问,同时使用域名重定向到正确的应用程序-这就是反向代理的工作方式。

我再怎么推荐CaddyServer也不为过,它太棒了。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64741468

复制
相关文章

相似问题

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