1

在 stackoverflow 上有各种类似的案例,但它们几乎都是指不正确的端口或使用 localhost 作为 IP 而不是 docker-machine ip。

vue.js 应用程序可以很好地连接到 websocket 并且可以正常工作。192.168.99.100:8080/meows但是,对和其他端点的 GET 请求都命中了nginx 502 bad gateway. 手动访问端点(而不是 vue.js)也命中502 bad gateway.

ip设置正确。端口到处都是一样的:8080。端点具有正确的http verb并且都nginx upstream指向server location /..{}. 然而连接到网络没有问题,所有数据通过都没有问题。

编辑:我使用 docker-toolbox 运行 Windows 7,因为我的 Windows 版本没有完整的虚拟化功能。安装完成后无需进一步配置。

架构如下:

在此处输入图像描述

码头工人撰写

version: "3.6"

services:
  meow:
    build: "."
    command: "meow-service"
    depends_on:
      - "postgres"
      - "nats"
    environment:
      POSTGRES_DB: "meower"
      POSTGRES_USER: "meower"
      POSTGRES_PASSWORD: "123456"
      NATS_ADDRESS: "nats:4222"
  query:
    build: "."
    command: "query-service"
    depends_on:
      - "postgres"
      - "nats"
    environment:
      POSTGRES_DB: "meower"
      POSTGRES_USER: "meower"
      POSTGRES_PASSWORD: "123456"
      NATS_ADDRESS: "nats:4222"
      ELASTICSEARCH_ADDRESS: "elasticsearch:9200"
  pusher:
    build: "."
    command: "pusher-service"
    depends_on:
      - "nats"
    environment:
      NATS_ADDRESS: "nats:4222"
  postgres:
    build: "./postgres"
    restart: "always"
    environment:
      POSTGRES_DB: "meower"
      POSTGRES_USER: "meower"
      POSTGRES_PASSWORD: "123456"
  nats:
    image: "nats-streaming:0.9.2"
    restart: "always"
  elasticsearch:
    image: 'docker.elastic.co/elasticsearch/elasticsearch:6.2.3'
  nginx:
    build: "./nginx"
    ports:
      - "8080:80"
    depends_on:
      - "meow"
      - "query"
      - "pusher"

nginx.conf:

user nginx;
worker_processes 1;

events {
  worker_connections 1024;
}

http {
  upstream meows_POST {
    server meow:8080;
  }

  upstream meows_GET {
    server query:8080;
  }

  upstream search_GET {
    server query:8080;
  }

  upstream pusher {
    server pusher:8080;
  }

  server {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    add_header Access-Control-Allow-Origin *;

    location /meows {
      limit_except GET POST OPTIONS {
        deny all;
      }
      proxy_pass http://meows_$request_method;
    }

    location /search {
      limit_except GET OPTIONS {
        deny all;
      }
      proxy_pass http://search_GET;
    }

    location /pusher {
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_pass http://pusher;
    }
  }
}

并且为了说明go应用也使用了正确的端口,下面是监听的端口

func newRouter() (router *mux.Router) {
    router = mux.NewRouter()
    router.HandleFunc("/meows", listMeowsHandler).
        Methods("GET")
    router.HandleFunc("/search", searchMeowsHandler).
        Methods("GET")
    return
}

router := newRouter()
if err := http.ListenAndServe(":8080", router); err != nil {
    log.Fatal(err)
}
4

2 回答 2

1

代替:

ports:
  - "8080"

在每个 docker-compose 服务中,尝试:

ports:
  // I assume your containers operate on 8080 port
  - "8080:8080"

通过仅指定8080您将容器的端口 8080 分配给主机的随机端口。我相信你不想那样。您可以使用docker-compose ps.

另外,为什么将所有地方的默认端口都更改为 8080?使用 Docker 就没有必要了,您可以简单地将端口映射到主机端的不同端口,例如:

ports:
    - "8080:80"

请记住,容器使用它们的端口相互通信,并且这些端口不需要发布。您只发布要“从外部世界”访问的端口。

于 2019-05-31T10:05:55.523 回答
0

全部删除

  ports:
  - "8080"

ngix.conf提议的所有服务的属性。

然而,根本问题是弹性搜索泊坞窗图像。使用docker ps -ai 可以看到一分钟后它将退出 78。使用docker-compose logs elasticsearch错误是max virtual memory areas vm.max_map_count px[ is too low, increase to at least [x]. 使用以下命令,主机为容器分配了更多内存,一切都解决了。

docker-machine ssh
sudo sysctl -w vm.max_map_count=262144
于 2019-05-31T13:45:24.643 回答