我来自this。我是网络服务器的新手。我正在设置一台服务器(example.de),为多个dockerized应用程序提供服务。其中一个(app3)在Apache服务器后面运行(容器内的端口80映射到8484)。我想使用NGINX docker容器将URL example.de/app3重定向到example.de:8484。其他两个应用程序也将重定向到example.de/app?。 当我请求网址example.de:8484时,它可以正常工作。但是,当我使用example.de/app3时,只会显示“有效”网页。
docker-compose文件类似于:
version: '3'
services:
app3:
build:
context: app3
container_name: app3
app3_apache:
build:
context: app3/apache
container_name: app3_apache
ports:
- "8484:80"
volumes:
- vol_app3:/vol/app3
depends_on:
- app3
links:
- app3
nginx-proxy:
container_name: nginx
build:
context: nginx/
ports:
- "80:80"
depends_on:
- app3_apache
links:
- app3_apache
volumes:
- vol_nginx:/etc/nginx/conf.d
volumes:
vol_app3:
driver_opts:
type: none
device: /vol/app3
o: bind
vol_nginx:
driver_opts:
type: none
device: /vol/nginx
o: bind
NGINX default.conf文件如下:
server {
listen 80;
listen [::]:80;
server_name example.de;
location /app3 {
proxy_pass http://app3_apache:80;
}
}
其他信息:
它创建并运行容器。 APACHE容器中的网页是使用xxx.xxx.xxx.xxx:80而不是app3_apache:80 <h1>Bad Request (400)</h1>
在NGINX容器中提供的。
我可以从NGINX容器访问app3_apache容器:
traceroute app3_apache
traceroute to app3_apache (xxx.xxx.xxx.xxx), 30 hops max, 60 byte packets
1 app3_apache.server_default (xxx.xxx.xxx.xxx) 0.351 ms 0.054 ms 0.035 ms
答案 0 :(得分:0)
您应该创建一个docker网络来链接容器。 您可以在此处查看文档:{{3}}
创建网络后,您将不得不更改nginx proxy_pass的配置,以指出Web服务器应用程序的内部IP。
例如,我设置此网络配置以连接3个具有固定IP地址的容器。
version: '2'
services:
zabbix-server4:
container_name: zabbix-server4
image: zabbix/zabbix-server-mysql:alpine-4.0.5
networks:
zbx_net:
aliases:
- zabbix-server4
ipv4_address: 172.16.238.5
zabbix-web4:
container_name: zabbix-web4
image: zabbix/zabbix-web-nginx-mysql:alpine-4.0.5
ports:
- 127.0.0.1:11011:80
links:
- zabbix-server4
environment:
- ZBX_SERVER_HOST=172.16.238.5
networks:
zbx_net:
aliases:
- zabbix-web4
ipv4_address: 172.16.238.10
zabbix-agent4:
container_name: zabbix-agent4
image: zabbix/zabbix-agent:alpine-4.0.5
links:
- zabbix-server4
environment:
- ZBX_SERVER_HOST=172.16.238.5
networks:
zbx_net:
aliases:
- zabbix-agent4
ipv4_address: 172.16.238.15
networks:
zbx_net:
driver: bridge
driver_opts:
com.docker.network.enable_ipv6: "false"
ipam:
driver: default
config:
- subnet: 172.16.238.0/24
gateway: 172.16.238.1
在您的情况下,您可以设置一个新网络并将新网络的IP分配给nginx和Web容器,然后在nginx proxy_pass配置中,您应该放置Web服务器的IP。 例如:
version: '3'
services:
app3:
build:
context: app3
container_name: app3
app3_apache:
build:
context: app3/apache
container_name: app3_apache
ports:
- "8484:80"
volumes:
- vol_app3:/vol/app3
depends_on:
- app3
links:
- app3
networks:
my_net:
aliases:
- zabbix-agent4
ipv4_address: 172.16.11.10
nginx-proxy:
container_name: nginx
build:
context: nginx/
ports:
- "80:80"
depends_on:
- app3_apache
links:
- app3_apache
volumes:
- vol_nginx:/etc/nginx/conf.d
networks:
my_net:
aliases:
- zabbix-agent4
ipv4_address: 172.16.11.20
volumes:
vol_app3:
driver_opts:
type: none
device: /vol/app3
o: bind
vol_nginx:
driver_opts:
type: none
device: /vol/nginx
o: bind
networks:
my_net:
driver: bridge
driver_opts:
com.docker.network.enable_ipv6: "false"
ipam:
driver: default
config:
- subnet: 172.16.11.0/24
gateway: 172.16.11.1
并且代理通行证应该设置为
location /app3 {
proxy_pass http://172.16.11.10:80;
}
为了避免出现此问题,我在主机上而不是在容器中运行nginx,然后使用相同的方法在容器中拆分流量。 在主机上安装nginx可以避免这种配置开销。