简短说明:
在docker上运行Nginx,如何配置nginx以便将呼叫转发给主机。
详细说明:
我们有一个Web应用程序与几个后端通信(让我们说rest1,rest2和rest3)。我们负责rest1
。
让我们考虑一下,我在电脑上手动启动rest1
并在2345端口上运行。我希望nginx(在docker中运行)将所有对rest1
的调用重定向到我自己的运行实例(注意,实例在主机上运行,而不是任何容器,而不是在docker中)。对于rest2
和rest3
到其他一些docker节点,或者可能是其他服务器(谁在乎)。
我要找的是:
docker-compose.yml
配置(如果需要)。提前致谢。
答案 0 :(得分:3)
配置nginx,如下所示(确保替换Docker Host的IP)并将其保存为default.conf
:
server {
listen 80;
server_name _;
location / {
proxy_pass http://<IP of Docker Host>;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
现在打开容器:
docker run -d --name nginx -p 80:80 -v /path/to/nginx/config/default.conf:/etc/nginx/conf.d/default.conf nginx
答案 1 :(得分:2)
解决方案1
使用network_mode: host
,这会将您的nginx实例绑定到主机的网络接口。
在运行多个Nginx容器时,这可能会导致冲突:每个暴露的端口都绑定到主机的接口。
解决方案2
我想为外界提供的每项服务都运行更多的nginx实例。 为了简化nginx的配置并避免将每个nginx绑定到主机,请使用容器结构:
dockerhost
-具有network_mode: host
proxy
-nginx容器用作托管服务的代理,
将dockerhost
链接到proxy
,这将在/etc/hosts
容器中添加一个proxy
条目-我们可以在nginx配置中使用'dockerhost'作为主机名。
docker-compose.yaml
version: '3'
services:
dockerhost:
image: alpine
entrypoint: /bin/sh -c "tail -f /dev/null"
network_mode: host
proxy:
image: nginx:alpine
links:
- dockerhost:dockerhost
ports:
- "18080:80"
volumes:
- /share/Container/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
default.conf
location / {
proxy_pass http://dockerhost:8080;
此方法使我们能够自动为服务器上运行的每个服务生成加密证书。如果有兴趣,我可以发布有关解决方案的要点。
答案 2 :(得分:0)
如果您使用的是Docker Compose文件版本3,则根本不需要docker-compose.yml
文件的任何特殊配置,只需使用特殊的DNS名称host.docker.internal
即可访问主机服务,如遵循nginx.conf
示例:
events {
worker_connections 1024;
}
http {
upstream host_service {
server host.docker.internal:2345;
}
server {
listen 80;
access_log /var/log/nginx/http_access.log combined;
error_log /var/log/nginx/http_error.log;
location / {
proxy_pass http://host_service;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $realip_remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
}