我有一个在http://localhost:8000上运行的应用程序,它使用的是我制作的docker映像。
现在,我想使用NGINX作为侦听端口80的反向代理,以重定向到localhost:8000。
这是我的nginx.conf文件
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 80;
location / {
proxy_pass http://localhost:8000;
}
}
}
这是我的Dockerfile:
FROM nginx
RUN rm /etc/nginx/conf.d/default.conf
COPY index.html /usr/share/nginx/html
COPY nginx.conf /etc/nginx
CMD nginx
要创建图像,请使用命令
docker build --no-cache -t mynginx .
要运行它,我使用
docker run -p 80:80 -d mynginx
现在,如果我使用curl localhost:8000
在本地计算机上进行测试,那么一切正常,但是如果我尝试使用curl localhost
,则会收到错误的网关错误。
此外,我尝试提供静态内容并且可以使用,但是使用反向代理设置则无法使用。
答案 0 :(得分:0)
curl localhost:8000
有效=>您的应用程序正在运行
curl localhost
返回错误的网关,意味着proxy_pass http://localhost:8000;
不起作用。这是因为“ localhost”是相对于其调用方的,在本例中为nginx容器,该容器在端口8000上没有任何运行。
您需要使用proxy_pass http://your_app:8000;
将其指向您的应用程序,其中“ your_app”是服务名称(docker-compose)或容器名称或其网络别名。确保它们在同一网络中。
答案 1 :(得分:0)
您的网关出现问题的原因是,在您的nginx容器中,localhost
解析为容器本身而不是主机系统。
如果要从反向代理容器访问应用程序容器,则需要将两个容器都放入网络中。
docker network create my-network
docker network connect --alias application my-network <application container id/name>
docker network connect --alias reverse-proxy my-network <reverse proxy container id/name>
--network
可以是任意名称,--alias
应该是您要解析为容器的主机名。
实际上,如果您已经为容器分配了(主机)名称(docker run --name ...
),则无需提供别名。
然后您可以将proxy_pass
指令更改为应用程序容器的(别名)名称:
proxy_pass http://application:8000;
另请参阅文档:Container networking