Har*_*ith 5 nginx docker docker-compose
如果我想用我的docker容器设置NGINX,一个选项是在我的设置NGINX实例docker-compose.yml,并将NGINX容器链接到所有应用程序容器.
然而,这种方法的缺点是docker-compose.yml变为服务器级别,因为只有一个NGINX容器可以将端口80/443暴露给互联网.
我感兴趣的是,能够docker-compose.yml在同一台服务器上定义多个,但仍然可以通过单个服务器特定的NGINX容器轻松地在每个组合文件中公开面向公众的容器.
我觉得这应该很简单,但我还没有找到一个好的资源或示例.
Mar*_*fin 17
首先,您需要为Nginx和代理容器创建网络:
docker network create nginx_network
Run Code Online (Sandbox Code Playgroud)
接下来,使用compose文件运行nginx容器,如下所示:
services:
nginx:
image: your_nginx_image
ports:
- "80:80"
- "443:443"
networks:
- nginx_network
networks:
nginx_network:
external: true
Run Code Online (Sandbox Code Playgroud)
之后,您可以运行代理容器:
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
Run Code Online (Sandbox Code Playgroud)
此外,要使这项工作,您需要正确配置您的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;
}
}
Run Code Online (Sandbox Code Playgroud)
您需要告诉nginx使用Docker的DNS,因此它可以按名称访问容器.
但请注意,如果您在其他人之前运行nginx容器,那么nginx将尝试解析另一个容器的主机并失败,因为其他容器尚未运行.你可以使用hack将host放入变量中.有了这个hack,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;
}
}
Run Code Online (Sandbox Code Playgroud)
通过这样的配置,webapp1.example.com的请求将被传递到容器"webapp1",webapp2.example.com将传递给"webapp2"等.您只需添加DNS记录并运行具有正确名称的应用容器.
| 归档时间: |
|
| 查看次数: |
3777 次 |
| 最近记录: |