我有一个运行Web应用程序的docker容器和一个运行Nginx的docker容器:ubuntu。
Web应用程序容器在port:3000上运行并暴露在外面(浏览器连接到主机的ip at port:3000访问应用程序)
Nginx容器在端口80上运行,可从连接到主机ip的浏览器访问
Nginx容器和Web应用程序都连接到同一个Docker网桥。我可以在它的内部IP(172.21.0.2)上停靠exec -it(nginx)bash和ping(web-app),反之亦然。我也可以从两个容器外部使用nmap,看看(nginx)的内部IP为80的开放端口,应用程序的开放端口为3000.
什么没有破坏:
Nginx安装正确,可能没有正确配置。 Web应用程序正常运行,但遗憾的是无法重新配置以适应Nginx。
我尝试了什么:
通过docker-compose.yml,dockerfile,空容器> bash和手动apt-get install nginx安装nginx。
由于应用程序图像的细节,我不能在一个docker-compose文件中包含web应用程序和nginx(并修复网络问题)(图像实际上是一个node.js容器,并且有一个子服务app)所以试图在两个docker-compose.yml中包含两个服务只会导致compose创建nginx和一个app-less node.js容器。
我想做什么:
通过dockerfile和docker run命令创建一个nginx容器(以支持可伸缩性),通过它们都连接到的docker网络代理已经运行的app容器。我希望nginx在端口80上侦听,并将其路由到端口3000的容器。我很困惑,是;在nginx.conf文件中,我将它路由到容器的内部ip为172.21.0.2:3000,(hostIP):3000,Localhost:3000还是0.0.0.0:3000?我的文件如下:
Dockerfile:
FROM xqdocker/ubuntu-nginx
COPY nginx.conf /etc/nginx/nginx.conf ##.confd IS LOCAL TO DOCKERFILE
nginx.conf:
worker_processes 1;
events { worker_connections 1024; }
http {
sendfile on;
upstream docker-nginx {
server 172.21.0.2:3000; #WHAT DO I PUT HERE??
}
server {
listen 80;
location / {
proxy_pass http://docker-nginx;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
}
docker run命令:
$ docker build -t reverseproxy
$ docker run --name nginx_proxy -p 80:80 -d reverseproxy
$ docker network connect nginx_app_bridge <nginx_proxy container ID>
请注意,应用的docker-compose文件指定了nginx_app_bridge网络。 docker network inspect nginx_app_bridge列出了172.21.0.2(app)和172.21.0.3(nginx)的2个连接容器
所以我想知道的是,如果两个容器都正常运行,可以从外面看到,可以看到对方,并且在同一个网桥上,为什么/如何nginx不会将请求路由到容器上港口:3000?
我已经完成了大约40个不同的教程和堆栈溢出建议,如何解决这个问题。我已经尝试了很多方法来实现这个目标。所有我正在寻找的方法是强制nginx拦截所有端口80请求到主机IP并将其路由到Web应用程序。