Docker compose 如何在docker compose文件中配置Caddy 2,以便在没有绑定挂载的Caddy文件的情况下执行反向代理?

Docker compose 如何在docker compose文件中配置Caddy 2,以便在没有绑定挂载的Caddy文件的情况下执行反向代理?,docker-compose,caddy,Docker Compose,Caddy,我有一个docker compose文件,其中包含两个服务: 我的webapp,它公开了3000端口 caddy,它可以作为我的web应用程序的反向代理,并提供HTTPS 如果我使用绑定挂载的Caddyfile,它可以正常工作: caddy: image: caddy:2.0.0-alpine ports: - 80:80 - 443:443 volumes: - caddy:/data - .Caddyfile:/et

我有一个docker compose文件,其中包含两个服务:

  • 我的webapp,它公开了3000端口
  • caddy,它可以作为我的web应用程序的反向代理,并提供HTTPS
如果我使用绑定挂载的Caddyfile,它可以正常工作:

caddy:
    image: caddy:2.0.0-alpine
    ports:
      - 80:80
      - 443:443
    volumes:
      - caddy:/data
      - .Caddyfile:/etc/caddy/Caddyfile
Caddy文件非常简单:

my-domain.com {
    reverse_proxy my-app:3000
}

但我想在服务器上部署它,而不上传Caddyfile。我想像这样配置docker-compose.yml:

version: "3"

services:
  my-app:
    image: my-app
    expose:
      - 3000

  caddy:
    image: caddy:2
    ports:
      - 80:80
      - 443:443
    environment:
      - reverse_proxy_from=my-app:3000
      - reverse_proxy_to=my-domain.com
    volumes:
      - caddy:/data


volumes:
  caddy:

也可能通过caddy API实现。当我试图在裸机操作系统上配置反向代理时,它可以工作。但当我尝试使用docker(
docker compose exec caddy caddy reverse proxy——从my-site.net——到我的应用程序:3000
)时,我收到了一些不清楚的错误消息:

root@test:/xxx# docker-compose exec caddy caddy reverse-proxy --from my-site.net --to app:3000
2020/05/15 11:49:57.787 WARN    admin   admin endpoint disabled
2020/05/15 11:49:57.787 INFO    http    server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS {"server_name": "proxy", "https_port": 443}
2020/05/15 11:49:57.787 INFO    http    enabling automatic HTTP->HTTPS redirects    {"server_name": "proxy"}
2020/05/15 11:49:57 [INFO][cache:0xc000726820] Started certificate maintenance routine
2020/05/15 11:49:57.788 INFO    tls cleaned up storage units
reverse-proxy: loading new config: http app module: start: tcp: listening on :80: listen tcp :80: bind: address already in use

这可能会引起兴趣:

根据它引用的github repo中的描述,它的工作原理是扫描Docker元数据,寻找指示服务或容器应该在caddy上公开的标签

然后,它生成一个内存中的CADDY文件,其中包含指向每个Docker服务DNS名称或容器IP的网站条目和代理指令


每次docker对象发生更改时,它都会更新caddy文件并触发caddy零停机重新加载。

我肯定不是docker专家,所以请不要相信我的话,但在
服务/caddy
部分,您可以指定一个选项,用于指定要传递给
caddy
命令的参数。