【发布时间】:2022-06-15 23:27:00
【问题描述】:
我正在使用 docker-compose 运行一些容器,并在容器之间进行一些通信。更具体地说,microservice 容器完成所有实际工作,另一个容器运行 Redis 服务器,我将日志记录分离到另一个容器。这一切都在 nginx 反向代理之后。
docker-compose.yml 文件如下所示(稍微简化,名称已更改):
version: '3'
services:
# nginx
reverse-proxy:
image: nginx:1.17.10
container_name: reverse_proxy_nginx
depends_on:
- microservice
volumes:
- ./NginxService/nginx.conf:/etc/nginx/nginx.conf
ports:
- 7300:7300
# microservice
microservice:
image: microservice-image
container_name: microservice-container
build:
context: ./Microservice
ports:
- 6300:7500
# redis database
redis:
image: "redis:alpine"
ports:
- 6379:6379
# logger process
logger:
image: logger-image:latest
container_name: logger-container
ports:
- 6901:6901
当我用docker-compose up 启动swarm 时,redis 和microservice 之间有完美的通信,我的代码可以按预期访问redis:6379 的redis 服务器。 (我使用的是 python redis 客户端,StrictRedis,但不确定是否相关)。
但是,与logger 的通信无法正常工作,没有消息到达logger:6901。我正在使用 python 日志记录模块,SocketHandler 应该从microservice 容器与记录器容器中的socketserver.ThreadingTCPServer 通信(遵循此配方:https://docs.python.org/3/howto/logging-cookbook.html#sending-and-receiving-logging-events-across-a-network)。
当我在容器外运行所有进程(所以主机是localhost)时,一切正常。所以我认为我的流程很好,只是网络是问题所在。另外,如果我直接提供虚拟机的 IP,并公开6901 端口,那么我再次与记录器进行了完美的通信,所以它只发生在 docker-compose 网络中。
我能够在 docker-container 网络上的 logger 和 microservice 之间进行通信的唯一方法是在 .yml 文件中显式定义一个网络,并为 logger 提供别名。 (我在下面的答案中添加了 yml 配置文件。)
我希望:
-
redis和logger的服务名称解析方式相同,但只有前者有效。 - 服务名称被解析为别名,但只有别名有效。
为什么?
【问题讨论】:
标签: docker docker-compose tcp network-programming