【发布时间】:2022-05-13 19:42:49
【问题描述】:
我有一个项目正在尝试使用微服务方法进行开发。我在两个独立的微服务上准备了 API 并完成了它们的测试。当我从容器 A 向容器 B 发送请求时,我收到错误 cURL 错误 7:无法连接到 localhost 端口 8100:连接被拒绝。经过我的研究,我找不到解决方案。 请求架构: 我正在尝试从 127.0.0.1:8000 向运行在 127.0.0.1:8100 的 api 地址发出请求。
我应该怎么做才能解决这个问题?我的问题可能是错误的,所以我提前道歉。
谢谢
我的 Compose File First 容器
# For more information: https://laravel.com/docs/sail
version: '3'
services:
laravel.test:
build:
context: ./docker/8.0
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP}'
image: sail-8.0/app
container_name: MP-Main-Service-Laravel
extra_hosts:
- 'host.docker.internal:host-gateway'
ports:
- 8000:8000
environment:
WWWUSER: '${WWWUSER}'
LARAVEL_SAIL: 2
XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- mysql
- redis
mysql:
image: 'mysql:8.0'
container_name: MP-Main-Service-MySql
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
environment:
MYSQL_ROOT_USER: '${DB_USERNAME}'
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
volumes:
- "/var/lib/mysql"
networks:
- sail
phpmyadmin:
image: 'phpmyadmin:latest'
container_name: MP-Main-Service-PhpMyAdmin
ports:
- 8081:80
environment:
PMA_HOST: mysql
MYSQL_ROOT_USER: '${DB_USERNAME}'
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_DATABASE: '${DB_DATABASE}'
depends_on:
- mysql
networks:
- sail
redis:
image: 'redis:alpine'
container_name: MP-Main-Service-Redis
ports:
- '${FORWARD_REDIS_PORT:-6379}:6379'
volumes:
- 'sailredis:/data'
networks:
- sail
healthcheck:
test: ["CMD", "redis-cli", "ping"]
retries: 3
timeout: 5s
networks:
sail:
driver: bridge
volumes:
sailmysql:
driver: local
sailredis:
driver: local
我的撰写文件第二个容器
# For more information: https://laravel.com/docs/sail
version: '3'
services:
laravel.test:
build:
context: ./docker/8.0
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP}'
image: sail-8.0/app
container_name: MP-Communication-Service-Laravel
extra_hosts:
- 'host.docker.internal:host-gateway'
ports:
- 8100:8000
environment:
WWWUSER: '${WWWUSER}'
LARAVEL_SAIL: 1
XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- mysql
- redis
mysql:
image: 'mysql:8.0'
container_name: MP-Communication-Service-MySql
ports:
- '${FORWARD_DB_PORT:-33061}:33061'
environment:
MYSQL_ROOT_USER: '${DB_USERNAME}'
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
volumes:
- "/var/lib/mysql"
networks:
- sail
phpmyadmin:
image: 'phpmyadmin:latest'
container_name: MP-Communication-Service-PhpMyAdmin
ports:
- 8082:80
environment:
PMA_HOST: mysql
MYSQL_ROOT_USER: '${DB_USERNAME}'
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_DATABASE: '${DB_DATABASE}'
depends_on:
- mysql
networks:
- sail
redis:
image: 'redis:alpine'
container_name: MP-Communication-Service-Redis
ports:
- '${FORWARD_REDIS_PORT:-63791}:6379'
volumes:
- 'sailredis:/data'
networks:
- sail
healthcheck:
test: ["CMD", "redis-cli", "ping"]
retries: 3
timeout: 5s
networks:
sail:
driver: bridge
volumes:
sailmysql:
driver: local
sailredis:
driver: local
【问题讨论】:
-
"我正在尝试从 127.0.0.1:8000 向运行在 12.0.0.1:8100 的 api 地址发出请求。" - 你到底是什么意思这个?对于 http-request,我们没有明确定义源地址,它是从 TCP 标头中读取的。
-
我在这里看不到端口 8100 上运行的服务。如果您将它放在单独的 docker compose 文件中,那么它可能使用的是不同的网络。也许尝试将这两个服务放在同一个 .yml
-
@apokryfos 我已经附上了两个撰写文件。我是 Docker 新手。我做错的事情可能是愚蠢的。对不起
-
根据stackoverflow.com/questions/38088279/…,您似乎只需在两个.yml 文件之一中将
driver: bridge替换为external: true,然后这两个服务将加入同一个桥接网络。但是,由于您正在复制服务,因此我会警惕这里的端口冲突。也许更好的主意是找到一种方法为每个容器提供一个已知的主机名,以便它们可以通过它而不是“localhost”进行通信(虽然不知道如何做到这一点) -
要在 docker 容器之间进行通信,您不必使用 127.0.0.1 地址,它们都有自己的 IP/名称。