我刚刚发现了CaddyServer,它看起来非常有前途,可以在同一台虚拟机上运行多个应用程序。
但是我正在努力设置我的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是我想要的第二个域,它指向一个ghost应用程序。这个可以在未注释的情况下工作(我将其包括在内以供参考)。
这是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
文件夹中,我有一个folder文件,如下所示:
# 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
我一直假设在我的虚拟机上,我可以简单地使用docker create network web
,然后在caddy/
中运行docker-compose up --build
,然后在djangoApp/
中运行相同的命令
但是当我尝试在浏览器中访问域名时,我在日志中得到了错误消息的lookup django on 127.0.0.11:53: no such host
。
任何帮助都将不胜感激!
发布于 2021-02-05 21:42:54
对于在调试他们的docker-compose设置时发现这一点的任何人来说,我在发布它时的主要误解是,我认为我需要几个docker-compose文件。因为反向代理的全部要点是所有东西都需要共享端口80,所以这个假设现在看起来很愚蠢……
以下是我当前的工作设置:
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是
{
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也不为过,它太棒了。
https://stackoverflow.com/questions/64741468
复制相似问题