我有一个在CentOS服务器上运行的NGINX,并希望proxy_pass到在同一主机上运行的docker容器。
将proxy_pass与容器的IP一起使用时,它可以工作,但是,如果机器重新启动,有时容器的IP会发生变化,并且必须手动编辑nginx.conf以重新指向容器的新IP。我知道NGINX可以在自己的docker容器中设置并链接到其他正在运行的容器,但是这将花费很长时间进行设置和测试。
有没有办法使用容器名称或在主机的NGINX上不直接更改的其他标识符?
答案 0 :(得分:3)
我知道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 ...
请参见there was a fun talk和docker network create
但是我仍然建议在容器中也运行nginx,然后docker将负责DNS解析和路由。实际上,它很快完成并且非常简单。您可以在一个docker-compose.yml
中定义所有服务,并确保它们共享同一网络,或者:
docker network create nginx.docker
创建一个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-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。不知道是否仍然需要它,但是在不使用它之前,我遇到了问题。
答案 1 :(得分:0)
无需创建网络。可以使用默认值之一。默认网桥网络在172.17.0.1
上具有网关。您可以在nginx.conf
server {
listen 80;
server_name example.com;
location /{
proxy_pass http://172.17.0.1:81;
}
}
您可以通过运行命令docker network inspect bridge