在docker集装箱之间进行代理
我有一个docker设置与以下
- rails api后端
- MySQL数据库
- redis db
- 节点/反应前端(webpack)
- nginx服务于前端
(rails后端目前正在通过内置的美洲狮服务器 – 我想我会把它移动到相同的nginx服务器运行节点应用程序)
我的问题是,前端将请求在后端的东西,但这是行不通的。
我已经在nginx上设置了一个代理,如下所示:
#nginx.conf server { listen 8080; # Always serve index.html for any request location / { # Set path root /wwwroot/; try_files $uri /index.html; } location /api/ { proxy_pass http://127.0.0.1:3000; } }
但是当我启动api调用时,我在nginx日志中得到以下内容:
nginx-server | 2017/05/13 20:56:08 [error] 5#5: *19 connect() failed (111: Connection refused) while connecting to upstream, client: 172.21.0.1, server: , request: "POST /api/authenticate HTTP/1.1", upstream: "http://127.0.0.1:3000/api/authenticate", host: "localhost:8080", referrer: "http://localhost:8080/" nginx-server | 172.21.0.1 - - [13/May/2017:20:56:08 +0000] "POST /api/authenticate HTTP/1.1" 502 575 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" "-"
而且我没有看到任何东西打到美洲狮服务器。
我不知道我应该在哪里看。 这是我的docker撰写文件的问题,或者是一个Nginx问题(或两者)。 我已经包括了我的docker-compose.yml如下:
version: '2' services: nginx: build: context: . dockerfile: docker.nginx image: pt-nginx container_name: nginx-server ports: - "8080:8080" volumes: - wwwroot:/wwwroot webpack: build: context: ./frontend dockerfile: docker.webpack image: pt-webpack container_name: react-frontend ports: - "35729:35729" volumes: - ./frontend:/app - /app/node_modules - wwwroot:/wwwroot db: build: context: ./backend dockerfile: docker.mysql image: pt-mysql container_name: mysql-server env_file: ./backend/.env ports: - "3306:3306" volumes: - ./sql/data/:/var/lib/mysql redis: build: context: ./backend dockerfile: docker.redis image: pt-redis container_name: redis-server app: build: context: ./backend dockerfile: docker.rails image: pt-rails container_name: rails-server command: > sh -c ' rake resque:start_workers; bundle exec rails s -p 3000 -b 0.0.0.0; ' env_file: ./backend/.env volumes: - ./backend:/usr/src/app - /Users/mh/Pictures/ROR_PT/phototank:/Users/martinhinge/Pictures/ROR_PT/phototank ports: - "3000:3000" expose: - "3000" depends_on: - db - redis volumes: wwwroot: driver: local
问题是你的nginx服务请求本地主机(127.0.0.1)的上游。 但应用程序在另一个容器(与另一个IP)。 您可以在应用程序中通过DNS引用rails应用程序,因为它们都处于默认networking中。 nginxconfiguration中的上游将看起来像proxy_pass http://app:3000;
代替。
有关networking的更多信息,请访问https://docs.docker.com/compose/networking/ ,具体为:
在Web容器中,连接数据库的string看起来像postgres:// db:5432,并且从主机连接string看起来像postgres:// {DOCKER_IP}:8001。
- 将configuration文件挂载到容器时出错
- 如何启用docker和外部世界中的sipster / pjsip之间的声音连接?
- 我的朋友和我在不同的操作系统上如何共享精确的开发环境?
- 拉扯jenkins图像时获取“需要身份validation”错误
- bash:/ bin / ping:在rhel 7.1 docker映像上不允许运行
- Docker群集中的Wildfly / Jboss-v10不能在集群模式下工作
- Docker – 使用IP而不是–link进行通信
- Django的docker容器无法连接到MySQL容器,错误“无法连接到'db'(111)上的MySQL服务器”)
- 你能否有效地改变一个较低级别的Docker容器,而不重build所有依赖它的应用程序?