Docker Nginx反向代理到单独的容器

时间:2018-08-26 16:41:32

标签: docker nginx

我在创建反向代理并将其指向其他容器中的应用程序时遇到麻烦。

我现在拥有的是Nginx的docker-compose,然后我想为几个不同的应用程序使用单独的docker-container,并让Nginx将流量直接引向这些应用程序。

我的Nginx docker-compose是:

version: "3"

services:
  nginx:
    image: nginx:alpine
    volumes:
       - ./default.conf:/etc/nginx/conf.d/default.conf

我的default.conf是:

server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

server {
  listen 80;
  server_name www.mydomain.com;
  location /confluence {
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://192.168.1.50:8090/confluence;
  }
}

我可以直接在以下位置访问汇合点: http://192.168.1.50:8090/confluence

我的融合思想是:

version: "3"
services:
  db:
    image: postgres:9.6
    container_name: pg_confluence
    env_file:
      - env.list
    ports:
      - "5434:5432"
    volumes:
      - ./pg_conf.sql:/docker-entrypoint-initdb.d/pg_conf.sql
      - dbdata:/var/lib/postgresql/data
  confluence:
    image: my_custom_image/confluence:6.11.0
    container_name: confluence
    volumes:
      - confluencedata:/var/atlassian/application-data/confluence
      - ./server.xml:/opt/atlassian/confluence/conf/server.xml
    environment:
      - JVM_MAXIMUM_MEMORY=2g
    ports:
      - "8090:8090"
    depends_on:
      - db

volumes:
  confluencedata:
  dbdata:

当我点击mydomain.com时,我可以看到Nginx的“欢迎”屏幕,但是如果我点击mydomain.com/confluence,则找不到。

所以看起来Nginx正在运行,只是没有将流量正确发送到另一个容器。

=======================

===更新解决方案===

=======================

我最终改用Traefik代替了Nginx。当我迈出下一步并开始学习k8s时,这也会有所帮助。

尽管即使您坚持使用Nginx,也需要这些网络设置,但我只是没有对Nginx进行过测试,因此希望无论您最终使用哪种设置,它们都会有所帮助。

对于融合的docker-compose.yml,我添加了:

networks:
  proxy:
    external: true
  internal:
    external: false
services: 
  confluence: 
    ... 
    networks:
      - internal
      - proxy
  db: 
    ...
    networks: 
      - internal

对于traefik docker-compose.yml,我添加了:

networks:
  proxy:
    external: true

services:
  reverse-proxy:
    networks:
      - proxy

我必须使用以下方法手动创建网络:

docker network create proxy

1 个答案:

答案 0 :(得分:0)

并不是正确使用docker的真正方法。

如果您处于生产环境中,请使用真正的编排工具(如今Kubernetes是您的最佳选择)

如果您在计算机上,则只有在使用同一网络且该网络不是默认网络的情况下,才能引用容器的名称(或别名)。

一种方法是只有一个docker-compose文件。

另一种方法是在docker-compose中使用相同的网络。

  • 创建网络docker network create --driver bridge my_network
  • 在每个docker-compose上使用它: networks: default: external: name: my_network