我有一个在CentOS服务器上运行的NGINX,我想将它代理给在同一台主机上运行的docker容器。
当使用带有容器IP的proxy_pass时,它可以工作,但是如果机器重新启动,有时容器的IP会改变,必须手动编辑nginx。conf重新指向容器的新ip。我知道NGINX可以在自己的docker容器中设置并链接到其他正在运行的容器,但这需要很长时间来设置和测试。
有没有一种方法可以使用容器名称或其他标识符,而不会直接在主机的NGINX上更改?
我知道NGINX可以在自己的docker容器中设置并链接到其他正在运行的容器,但这需要很长时间来设置和测试。
如果您不想在nginx自己的容器中运行nginx,可以创建具有固定IP范围的docker网络:
docker network create --driver=bridge --subnet=192.168.100.0/24 nginx.docker
用固定的IP启动容器
docker run --net nginx.docker --ip 192.168.100.1 ...
请参阅docker网络创建并将静态IP分配给docker容器
但我仍然建议在容器中运行nginx,然后docker将负责DNS解析和路由。它实际上很快就完成了,而且非常简单。您可以在一个docker compose中定义所有服务。yml
并确保它们共享同一网络或:
创建docker网络创建nginx.docker
docker-compose.yml
文件中nginx.conf
例如:
nginx的docker-compose.yml
services:
nginx:
image: nginx:alpine
container_name: nginx
ports:
- "80:80"
- "443:443"
volumes:
- type: bind
source: ./nginx.conf
target: /etc/nginx/nginx.conf
networks:
- nginx.docker
networks:
nginx.docker:
name: nginx.docker
external: true
请注意,“80:80”
将绑定到所有接口,请使用接口的IP,例如,“192.168.0.1:80:80”
仅绑定到一个特定接口。
docker编写。yml
services:
my_service:
image: image_name
container_name: myservice
networks:
- nginx.docker
networks:
nginx.docker:
name: nginx.docker
external: true
在您的nginx的服务器部分中。形态
:
server {
listen 443 ssl;
server_name your.server.name;
# Docker DNS
resolver 127.0.0.11;
set $upstream_server http://myservice:8080; # or myservice.nginx.docker
location / {
proxy_pass $upstream_server;
# further proxy config ...
}
}
注意解析器127.0。0.11
明确告知nginx使用docker DNS。不确定是否仍然需要它,但我以前在不使用它时遇到过问题。
不需要创建网络。可以使用默认值。默认网桥网络的网关位于172.17。0.1
。您可以在nginx中使用此IP地址。形态
server {
listen 80;
server_name example.com;
location /{
proxy_pass http://172.17.0.1:81;
}
}
您可以通过运行命令docker network inspect bridge