Warm tip: This article is reproduced from serverfault.com, please click

其他-如何在Docker之外将NGINX反向代理传递给Proxy_pass到Docker容器

(其他 - How to NGINX Reverse Proxy outside of Docker to proxy_pass to docker containers)

发布于 2018-10-15 19:08:40

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

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

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

Questioner
Val
Viewed
11
hjsimpson 2018-10-16 05:15:37

我知道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 ...

查看Docker网络创建并将静态IP分配给Docker容器

长答案

但是我仍然建议在容器中也运行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

请注意,这"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。不知道是否仍然需要它,但是在不使用它时我遇到了问题。