如何在Docker外部将NGINX反向代理传递给docker容器的proxy_pass

时间:2018-10-15 19:08:40

标签: docker nginx docker-compose reverse-proxy

我有一个在CentOS服务器上运行的NGINX,并希望proxy_pass到在同一主机上运行的docker容器。

将proxy_pass与容器的IP一起使用时,它可以工作,但是,如果机器重新启动,有时容器的IP会发生变化,并且必须手动编辑nginx.conf以重新指向容器的新IP。我知道NGINX可以在自己的docker容器中设置并链接到其他正在运行的容器,但是这将花费很长时间进行设置和测试。

有没有办法使用容器名称或在主机的NGINX上不直接更改的其他标识符?

2 个答案:

答案 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 talkdocker network create

长答案

但是我仍然建议在容器中也运行nginx,然后docker将负责DNS解析和路由。实际上,它很快完成并且非常简单。您可以在一个docker-compose.yml中定义所有服务,并确保它们共享同一网络,或者:

  1. 使用docker network create nginx.docker创建一个docker网络
  2. 将网络添加到服务的docker-compose.yml文件中
  3. 调整您的nginx.conf

例如:

nginx

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配置

您的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

中使用此IP地址
server {
    listen 80;
    server_name example.com;

    location /{
        proxy_pass  http://172.17.0.1:81;
    }
}

您可以通过运行命令docker network inspect bridge

检查网桥网关的IP地址。