我有两个单独的docker容器,一个用于API,一个用于前端项目。我使用了jwilder/nginx-proxy
,因此可以使用主机名(docker-compose上的VIRTUAL_HOST
环境变量)访问它们。我可以在浏览器中打开前端项目,也可以使用postman
访问我的API。
但是,当我尝试使用前端站点上的httpclient访问我的API端点时,它返回:
cURL error 6: Could not resolve host
networks
连接容器。我可以确认它是否有效,因为当我ping
容器名称时,它会返回一个响应。extra_hosts
中添加docker-compose
。当我curl
使用容器bash
添加的主机时,我从API得到响应。仍然,当我尝试打开站点时,错误仍然存在。我想念什么?
这是我的项目docker-compose
前端:
version: "2"
services:
pixel_nginx:
build: docker/nginx
networks:
default:
aliases:
- nginx
depends_on:
- pixel_phpfpm
volumes:
- ./docker/nginx/symfony.conf:/etc/nginx/conf.d/default.conf
- ./:/www/
environment:
- VIRTUAL_HOST=pixel-project.local
extra_hosts:
- "auth-xx-dev.pixel.local:172.18.0.7"
- "listing-xx-dev.pixel.local:172.18.0.7"
pixel_phpfpm:
build: docker/phpfpm
volumes:
- ~/.ssh/known_hosts:/root/.ssh/known_hosts
- ~/.ssh/id_rsa:/root/.ssh/id_rsa
- ./:/www/
- ./data/pixel-project/tmp/:/tmp/
networks:
default:
aliases:
- php
depends_on:
- mysql
environment:
- ENV=development
networks:
default:
external:
name: pixelstack_pixel
后端:
version: "2"
volumes:
# this is the mysql data volume we are going to host the data inside
dev_mysql_data:
services:
# database container for local development purposes
dev_database:
image: mysql:5.6
networks:
default:
aliases:
- database
ports:
- 3400:3306
volumes:
# mount the mysql_data docker volume to host the local development database
- dev_mysql_data:/var/lib/mysql
# the provision file helps when trying to use the provision script to clone databases
- ./provision.cnf:/provision.cnf
environment:
MYSQL_ROOT_PASSWORD: pixel
# This is the local development version of the nginx container
dev_nginx:
image: api-nginx:latest
build: ./nginx
networks:
default:
aliases:
- nginx
depends_on:
- dev_phpfpm
volumes_from:
- dev_phpfpm
environment:
- VIRTUAL_HOST=~^(api|location|feedback|user|phone|loancalculator|seo|media|listing|development|kpi|newsletter|auth|worker|search)-xx-dev.pixel.local
# This is the local development version of the phpfpm container
dev_phpfpm:
image: api-phpfpm:latest
build:
context: ./
args:
# this build might fail, if so, run in a terminal: export SSH_KEY=$(cat ~/.ssh/id_rsa)
- SSH_KEY=$SSH_KEY
networks:
default:
aliases:
- phpfpm
depends_on:
- dev_database
volumes:
# we override the images /www directory with the code from the live machine
- ./:/www
env_file:
# inside this file, are the shared database secrets such as username/password
- ./env/common
- ./env/dev
networks:
default:
external:
name: pixelstack_pixel
编辑: 我正在使用Ubuntu,并在/ etc / hosts上设置了主机名
使用staging
上托管的AWS
域时,前端项目按预期获得了响应数据。所以我可以说那边没有问题。
答案 0 :(得分:1)
您的nginx容器都在同一网络上具有网络别名nginx
,这意味着对nginx
的请求将在两者之间进行循环(AFAIK,这两种方法都不行)。
您可能想要这样的前端:
networks:
default:
aliases:
- frontend-nginx
类似这样的后端
networks:
default:
aliases:
- backend-nginx
然后从前端容器中卷曲到backend-nginx
,它应该到达后端容器。
Tldr:您有重复的别名,并且这些.local
域也无法在容器中解析。
答案 1 :(得分:0)
我将后端的网络别名设置为我需要使用的域,以使其通过代理:
networks:
default:
aliases:
- auth-xx-dev.pixel.local
- listing-xx-dev.pixel.local
答案 2 :(得分:0)
您应该链接它们,在docker-compose中为nginx容器添加链接,然后它们可以彼此看到。如果检查nginx contaner中的/ etc / hosts,将有数据库容器的名称及其ip地址。
检查一下: https://docs.docker.com/compose/networking/#update-containers