提问者:小点点

如何将Docker外部的代理反向到Docker容器的代理传递


我有一个在CentOS服务器上运行的NGINX,我想将它代理给在同一台主机上运行的docker容器。

当使用带有容器IP的proxy_pass时,它可以工作,但是如果机器重新启动,有时容器的IP会改变,必须手动编辑nginx。conf重新指向容器的新ip。我知道NGINX可以在自己的docker容器中设置并链接到其他正在运行的容器,但这需要很长时间来设置和测试。

有没有一种方法可以使用容器名称或其他标识符,而不会直接在主机的NGINX上更改?


共2个答案

匿名用户

我知道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并确保它们共享同一网络或:

  1. 使用创建docker网络创建nginx.docker
  2. 将网络添加到服务的docker-compose.yml文件中
  3. 调整你的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