如何将 Docker 之外的 NGINX 反向代理代理到 proxy_pass 到 Docker 容器

Val*_*Val 6 reverse-proxy nginx docker docker-compose

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

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

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

hjs*_*son 8

我知道 NGINX 可以在它自己的 docker 容器内设置并链接到其他正在运行的容器,但这需要很长时间来设置和测试。

简答

如果你不想在它自己的容器中运行 nginx,你可以创建一个具有固定 IP 范围的 docker 网络:

docker network create --driver=bridge --subnet=192.168.100.0/24 nginx.docker
Run Code Online (Sandbox Code Playgroud)

并使用固定 IP 启动您的容器

docker run --net nginx.docker --ip 192.168.100.1 ...
Run Code Online (Sandbox Code Playgroud)

请参阅docker network create and Assign static IP to Docker container

长答案

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

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

例如:

nginx

docker-compose.ymlNginx的

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
Run Code Online (Sandbox Code Playgroud)

请注意,"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
Run Code Online (Sandbox Code Playgroud)

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 ...
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意resolver 127.0.0.11明确告诉 nginx 使用 docker DNS。不确定是否仍然需要它,但是我以前在不使用它时遇到了问题。