【问题标题】:WSL2 Caddy Reverse Proxy In DockerDocker 中的 WSL2 Caddy 反向代理
【发布时间】:2021-05-09 20:54:09
【问题描述】:

我有一个在 Docker 中运行的 Caddy 服务器与 Node.JS 服务器通信。此设置目前适用于 MacOS,但不适用于 WSL2。我认为这个问题与我们在 Caddyfile 中使用 http://host.docker.internal:3000 作为代理地址这一事实有关,但我不知道如何编写它,因此它适用于 WSL2 和 MacOS。

docker-compose.yml:

version: '3.7'
services:
  caddy:
    image: 'abiosoft/caddy:latest'
    volumes:
      - ./certs:/root/certs # to sync mkcert certificates to Caddy
      - ./Caddyfile:/etc/Caddyfile # to mount custom Caddyfile
    ports:
      - '443:2015'
  db:
    container_name: service_local_db
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: 'service_local'
      MYSQL_ROOT_PASSWORD: '******'
    ports:
      - '3306:3306'
    expose:
      - '3306'
    volumes:
      - database_volume:/var/lib/mysql
volumes:
  database_volume:

球童档案

servicename.url{
    log stdout
    tls /root/certs/servicename.local.pem /root/certs/servicename.local-key.pem

    proxy / http://host.docker.internal:3000 {
        websocket
        transparent
        header_upstream X-Marotagem  true
        header_upstream Host  "servicename.local"
    }
}

我试过了:

  • host.docker.internal 更改为host-gateway。即使这确实有效,但反过来也不允许它在 MacOS 上运行。
  • 在 docker-compose.yml 中的services 下添加'host.docker.internal:host-gateway' 作为extra_hosts:。它不起作用,但如果它起作用,我不确定它会如何影响 MacOS。

任何帮助将不胜感激。

【问题讨论】:

  • 你不只是将 nodejs 作为服务添加到此 compose 文件中的服务中,以便球童可以通过 http://mynodejsservice 访问它吗?

标签: docker docker-compose proxy windows-subsystem-for-linux caddy


【解决方案1】:

AFAIK host.docker.internal (还没有?)在 Docker for Linux 中实现。但是由于您使用的是bridge 网络(默认网络),因此您可以为主机创建一个静态 IP 地址。之后就不需要使用host.docker.internal,不过如果您愿意,您可以将其添加到带有extra_hosts 的容器中。

version: "2"
networks:
  default:
    ipam:
      driver: default
      config:
          # (mandatory) IP-address range for the containers
        - subnet: "10.50.0.0/24"
          # (optional) IP-address of the host
          # if not specified it will be the first IP-address of the subnet (10.50.0.1 in this case)
          gateway: 10.50.0.20
          # 'gateway' is only available in docker-compose version 2 at the moment

在此示例中,gateway 将是该网络中容器的主机 IP 地址。您可以使用此值创建一个有效的extra_hosts 记录:

extra_hosts:
- "host.docker.internal:10.50.0.20"

不幸的是,gateway 选项目前仅在版本2 撰写文件规范中支持,在版本3 中您只能指定subnet。如果gateway 没有明确指定,它将是该范围的第一个IP 地址(上面的示例为10.50.0.1)。

配置不需要更改,除非您偶然发现 IP 范围重叠。换句话说,如果您将运行它的机器没有子网(docker 或其他),与您选择的范围重叠,就不会有问题。否则,您可以选择另一个子网并在 extra_hosts 中写入不同的地址。

另请注意,一旦创建网络,就不允许更改 IPAM 配置。在创建新网络之前,您需要删除旧网络。使用docker-compose downdocker network rm <network_name>

【讨论】:

  • 好信息,谢谢。我已将 networks 块添加到我的 docker-compose.yml 中。我们使用的是 3.7 版,所以我无法指定子网。我还将我的 Caddyfile 更改为 proxy / http://10.50.0.1:3000,这是该子网上的第一个 IP。我仍然有同样的问题。有什么想法吗?
  • @loganhuskins 运行 docker network inspect <network_name>,查找 IPAM.Config。你看到那里的预期值了吗?还要检查网络驱动程序是否为bridge(不要与 IPAM 驱动程序混淆,您需要一个顶级密钥)。
  • 我看到两个 IP,10.50.0.3/24 用于 Caddy,10.50.0.4/24 用于数据库。 Node.js 应用程序不在 Docker 中运行,它只是通过 Docker 代理,所以它不在该列表中。我在 Caddyfile 的代理行中同时拥有 .1.2,但都没有工作。
  • @loganhuskins node.js 服务器是监听 0.0.0.0 还是只监听 localhost?还可以尝试从容器内 ping 主机。
猜你喜欢
  • 2020-03-26
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 2018-10-10
相关资源
最近更新 更多