在 docker 中为 Apache 使用 ProxyPass 配置

Use ProxyPass configuration for Apache in docker

如何在链接到不同容器的 Apache 配置中使用 ProxyPass? 硬编码 IP 地址可行,但是否有更通用的方法来做到这一点?

Container1: apache 侦听端口 443 代理将其传递给 Container2 端口 3000

Container2:运行任何侦听端口 3000

的 Flask/Dancer 应用程序
#docker-compose.yml
version: '3'
services:
  apache:
    ...
    ports:
      - "443:443"
    container_name: Container1
    network_mode: "bridge"
    depends_on: 
      - web
  web:
    ...
    container_name: Container2
    network_mode: "bridge"

-

#apache config
<VirtualHost *:443>
  ...
  ProxyPreserveHost on
    # Works but with ip 
    #ProxyPass / http://ip-of-container2:3000/
    #ProxyPassReverse / http://ip-of-container2:3000/
  ProxyPass / http://Container2:3000/
  ProxyPassReverse / http://Container2:3000/
</VirtualHost>

所以,network_mode 是问题所在。

我删除 network_mode 并进行下一个测试:

version: '3'
services:
  apache:
    image: ubuntu
    container_name: Container1
    #network_mode: "bridge"
    tty: true
  web:
    image: ubuntu
    container_name: Container2
    #network_mode: "bridge"
    tty: true

docker-compose up -d后,我进入Container1,安装ping,我可以ping通Container2

root@fe69bd6d62af:/# ping Container2
PING Container2 (172.26.0.3) 56(84) bytes of data.
64 bytes from Container2.bb_default (172.26.0.3): icmp_seq=1 ttl=64 time=0.166 ms
64 bytes from Container2.bb_default (172.26.0.3): icmp_seq=2 ttl=64 time=0.064 ms

你也可以参考official doc来了解user-defined网桥与默认网桥相比给我们带来了什么,主要区别如下:

User-defined bridges provide automatic DNS resolution between containers.

如果你不指定network_mode,compose 会自动为你设置一个user-defined 桥接,所以你可以使用这个魔法。在我的示例中,bb_default 是我们的桥接设置,您可以使用 docker network ls 来确认它。另外,可以使用 docker network inspect bb_default 查看这座新桥的详细信息。