如果我想用我的docker容器设置NGINX,可以选择在我的docker-compose.yml
中设置NGINX实例,并将NGINX容器链接到所有应用程序容器。
然而,这种方法的缺点是docker-compose.yml
变为服务器级别,因为只有一个NGINX容器可以将端口80/443暴露给互联网。
我感兴趣的是,能够在同一台服务器上定义多个docker-compose.yml
,但仍然可以通过单个服务器特定的NGINX容器轻松地在每个撰写文件中公开面向公众的容器。
我觉得这应该很容易,但我无法为此找到一个好的资源或例子。
答案 0 :(得分:13)
首先,您需要为Nginx和代理容器创建网络:
docker network create nginx_network
接下来,使用compose文件运行nginx容器,如下所示:
services:
nginx:
image: your_nginx_image
ports:
- "80:80"
- "443:443"
networks:
- nginx_network
networks:
nginx_network:
external: true
之后,您可以运行代理容器:
services:
webapp1:
image: ...
container_name: mywebapp1
networks:
- nginx_network #proxy and app must be in same network
- webapp1_db_network #you can use additional networks for some stuff
database:
image: ...
networks:
- webapp1_db_network
networks:
nginx_network:
external: true
webapp1_db_network: ~ #this network won't be accessible from outside
另外,要完成这项工作,您需要正确配置nginx:
server {
listen 80;
server_name your_app.example.com;
#Docker DNS
resolver 127.0.0.11;
location / {
#hack to prevent nginx to resolve container's host on start up
set $docker_host "mywebapp1";
proxy_pass http://$docker_host:8080;
}
}
您需要告诉nginx使用Docker的DNS,因此它可以按名称访问容器。
但请注意,如果您在其他人之前运行nginx容器,那么nginx将尝试解析另一个容器'主机和失败,因为其他容器尚未运行。你可以使用hack将host放入变量中。有了这个黑客,nginx不会尝试解析主机,直到收到请求。
通过这种组合,您可以始终启动nginx,同时独立启动和停止代理应用程序。
<强> UPD:强> 如果您想要更多动态解决方案,可以通过以下方式修改Nginx配置:
server {
listen 80;
resolver 127.0.0.11;
#define server_name with regexp which will read subdomain into variable
server_name ~^(?<webapp>.+)\.example\.com;
location / {
#use variable from regexp to pass request to desired container
proxy_pass http://$webapp:8080;
}
}
通过这样的配置,webapp1.example.com的请求将被传递给容器&#34; webapp1&#34;,webapp2.example.com到&#34; webapp2&#34;您只需添加DNS记录并运行具有正确名称的应用容器即可。