问题描述
我刚刚发现了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 都不为过,它太棒了。