如果我想用我的 docker 容器设置 nginx,一种选择是在我的 docker-compose.yml
中设置 nginx 实例。 ,并将 nginx 容器链接到所有应用程序容器。
然而,这种方法的缺点是 docker-compose.yml
成为服务器级别,因为只有一个 nginx 容器可以将端口 80/443 暴露给互联网。
我有兴趣能够定义几个 docker-compose.yml
文件在同一台服务器上,但仍然可以通过单个特定于服务器的 nginx 容器轻松公开每个撰写文件中面向公众的容器。
我觉得这应该很容易,但我一直无法为此找到好的资源或示例。
最佳答案
首先,您需要为 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 将主机放入变量中。通过这个 hack,nginx 不会在收到请求之前尝试解析主机。
通过这种组合,您可以让 nginx 始终运行,同时独立启动和停止代理应用程序。
更新:
如果你想要更动态的解决方案,你可以修改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 的请求将传递给容器“webapp1”,将 webapp2.example.com 传递给“webapp2”等。您只需要添加 DNS 记录并使用正确的名称运行应用程序容器。
关于docker - 如何使用多个 docker-compose.yml 文件配置 nginx?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48076605/