如何在 docker-compose 文件中配置 Caddy 2 以在没有绑定安装的 Caddyfile 的情况下进行反向代理?

Max*_*ock 6 docker-compose caddy

我有一个包含两个服务的 docker-compose 文件:

  • 我的 webapp,它暴露了端口 3000
  • 球童,它用作我的网络应用程序的反向代理并提供 HTTPS

如果我使用绑定安装的 Caddyfile,它可以正常工作:

caddy:
    image: caddy:2.0.0-alpine
    ports:
      - 80:80
      - 443:443
    volumes:
      - caddy:/data
      - .Caddyfile:/etc/caddy/Caddyfile
Run Code Online (Sandbox Code Playgroud)

Caddy 文件非常简单:

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

Run Code Online (Sandbox Code Playgroud)

但我想在不上传 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:

Run Code Online (Sandbox Code Playgroud)

也许也可以通过球童 API 来做到这一点。当我尝试在裸操作系统上配置反向代理时,它可以工作。但是当我尝试使用 docker ( docker-compose exec caddy caddy reverse-proxy --from my-site.net --to my-app: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
Run Code Online (Sandbox Code Playgroud)

lim*_*ity 6

@\xce\xbbuser 是对的,您可以覆盖选项command并实现您的目标:

\n
caddy:\n    image: caddy:2.4.3-alpine\n    restart: unless-stopped\n    command: caddy reverse-proxy --from https://my-domain.com:443 --to http://my-app:3000\n    ports:\n      - 80:80\n      - 443:443\n    volumes:\n      - caddy:/data\n    depends_on:\n      - my-app\n
Run Code Online (Sandbox Code Playgroud)\n
\n

> 我收到一些不清楚的错误消息
\n> 监听 tcp :80: 绑定: 地址已在使用中

\n
\n

释放端口 80 就可以了。

\n


小智 5

这可能是有趣的:

https://hub.docker.com/r/lucaslorentz/caddy-docker-proxy

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

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

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