我有一个在CentOS服务器上运行的NGINX,并且想proxy_pass到在同一主机上运行的docker容器。
当将proxy_pass与容器的IP一起使用时,它可以工作,但是,如果机器重新启动,有时容器的IP会发生变化,并且必须手动编辑nginx.conf以重新指向容器的新IP。我知道NGINX可以在自己的docker容器中设置并链接到其他正在运行的容器,但是这将花费很长时间进行设置和测试。
有没有办法使用容器名称或在主机的NGINX上不直接更改的其他标识符?
我知道NGINX可以在自己的docker容器中设置并链接到其他正在运行的容器,但是这将花费很长时间进行设置和测试。
如果你不想在自己的容器中运行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 ...
但是我仍然建议在容器中也运行nginx,然后docker将负责DNS解析和路由。实际上,它很快完成并且非常简单。你可以在一个服务中定义所有服务,docker-compose.yml
并确保它们共享同一网络,或者:
docker network create nginx.docker
docker-compose.yml
你的服务文件中nginx.conf
例如:
该docker-compose.yml
Nginx的
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-compose.yml
services:
my_service:
image: image_name
container_name: myservice
networks:
- nginx.docker
networks:
nginx.docker:
name: nginx.docker
external: true
你的服务器部分中的nginx.conf
:
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 ...
}
}
请注意,resolver 127.0.0.11
明确告诉nginx使用docker DNS。不知道是否仍然需要它,但是在不使用它时我遇到了问题。