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

如何解决Caddy服务器:使用docker-compose在反向代理后面运行Django应用

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

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

这是我的目录结构:

caddy/
    Caddyfile
    docker-compose.yml
djangoApp/
    docker-compose.yml
    Dockerfile
    config/
       ...
    manage.py
    requirements.txt
myghostapp/
    

这是caddy/Caddyfile

{
    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是我想要的第二个域,它指向虚幻应用程序。无需评论(我将其包括在内以供参考)可使用此功能。

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

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文件夹中,我有一个像这样的Dockerfile:

# 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

# 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

我一直认为在我的VPS上,我可以 docker create network web 然后运行 docker-compose up --build caddy/内,然后是djangoApp/

但是我明白了 当我尝试在浏览器中访问域时,lookup django on 127.0.0.11:53: no such host记录了日志中的错误msg。

任何帮助将不胜感激!

解决方法

对于在调试 docker-compose 设置时发现此问题的任何人,我发布它时的主要误解是我认为我需要几个 docker-compose 文件。由于反向代理的全部意义在于一切都需要共享端口 80,所以这个假设现在看起来很愚蠢......

这是我当前的工作设置:

<React.Fragment>
     <iframe id={"myFrame"} src={this.state.url + this.state.guid} style={{flex: 1,height: "100%",width: "100%"}} />
     <script>
            
              document.getElementById('myFrame').contentWindow.foo = function(){
                     alert("HELLO")
              }
            
     </script>
</React.Fragment>

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

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

使用 docker-compose 创建反向代理的一个关键因素是外部网络(这里我称之为 { 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 } )。有了这个,您可以在使用域名重定向到正确的应用程序的同时提供对 http 和 https 端口的访问 - 这就是反向代理的工作原理。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-