在 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
查看这座新桥的详细信息。
如何在链接到不同容器的 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
查看这座新桥的详细信息。