Docker容器无法通过虚拟主机环境变量访问另一个容器 我是docker的新手,所以我不确定我是否在每件事上都是正确的,但我会尽力描述我的情况。
我有两个独立的docker容器,一个用于API,另一个用于前端项目。我使用了Docker容器无法通过虚拟主机环境变量访问另一个容器 我是docker的新手,所以我不确定我是否在每件事上都是正确的,但我会尽力描述我的情况。,docker,docker-compose,Docker,Docker Compose,我有两个独立的docker容器,一个用于API,另一个用于前端项目。我使用了jwilder/nginx proxy,因此我可以使用主机名(VIRTUAL\u HOSTdocker compose上的环境变量)访问它们。我可以在浏览器上打开我的前端项目,并且可以使用postman访问我的API 但是,当我尝试在前端站点上使用httpclient访问API端点时,它会返回: cURL错误6:无法解析主机 我所尝试的: 使用网络连接容器。我可以确认它是否有效,因为当我对容器名称执行ping操作时,它会
jwilder/nginx proxy
,因此我可以使用主机名(VIRTUAL\u HOST
docker compose上的环境变量)访问它们。我可以在浏览器上打开我的前端项目,并且可以使用postman
访问我的API
但是,当我尝试在前端站点上使用httpclient访问API端点时,它会返回:
cURL错误6:无法解析主机
我所尝试的:
网络连接容器。我可以确认它是否有效,因为当我对容器名称执行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上设置了主机名
更新:
使用
AWS
上托管的staging
域时,前端项目获得了预期的响应数据。因此,我可以说这方面没有问题。您的两个nginx容器在同一个网络上都有网络别名nginx
,这意味着对nginx
的请求将在这两个容器之间进行循环(AFAIK,无论哪种方式都不好)
您可能希望前端有类似的功能:
networks:
default:
aliases:
- frontend-nginx
像这样的后端
networks:
default:
aliases:
- backend-nginx
然后从前端容器只需卷曲到后端nginx
,它就应该到达后端容器
Tldr:您有重复的别名,并且那些。本地域也无法在容器中解析。这适用于我的场景,但我希望会有更好的解决方案:
我将后端的网络别名设置为需要使用的域,以便它通过代理:
networks:
default:
aliases:
- auth-xx-dev.pixel.local
- listing-xx-dev.pixel.local
参考:您应该链接它们,在docker compose for nginx容器中添加链接,这样它们就可以看到彼此了。如果您在nginx contaner中选中/etc/hosts,则会显示数据库容器的名称及其ip地址
看看这个:
您在/etc/hosts
文件中有前端和api的主机名吗(假设您处于“nix”状态)?或者您的dns服务是否设置为解析这些.local
地址?是的,我在我的/etc/hosts
上有它们,因此我可以在浏览器和邮递员上访问它们。顺便说一句,我现在在Ubuntu上。但是,当我试图在我的前端站点上使用httpclient访问我的API端点时,它会返回:
你是说你正在前端容器中执行并运行curl
对吗?不,我是说使用httpclient
(比如axios
)我试过这个,当我curl
在容器中时,它会工作。但我需要的是使用.local
域从前端进行API调用,该域目前仍然不起作用。不,它返回的响应与我在邮递员
上收到的响应类似。如果无法解析主机
,则很可能是主机上的主机或dns出现问题。或者输入错误:p.如果前端项目在使用外部API(托管在internet上)时工作正常,我的终端会出现什么问题?您尝试访问的确切后端域是什么?谢谢,但这不是一个遗留功能吗?我已经为docker容器设置了网络
。只需停止它们并将链接添加到docker-compose.yaml,然后再次启动它们。除了在另一个中添加一个的主机名和ip地址外,它不会更改任何内容。