同一个宿主机中的多个docker容器之间通信
容器之间的通信问题解决方案
·
问题描述:
- 同一个华为云宿主机上, 两个docker容器,分别是django和mysql, django通过公网IP访问mysql,运行正常.
- 电脑本地 django容器 使用 内部IP 访问 本地服务器上 的docker mysql容器, 运行正常.
- 本地服务器 虚拟机上,django使用内部IP访问mysql,不成功,报错如图.
解决过程:
感谢这位大神, 重点参考文章
- 首先,django 容器在华为云是完全可以跑起来的, 说明代码没有问题
- 其次, mysql 数据正常
- 使用命令
docker inspect mysql
检查 mysql
- 从图中可以看到
Getway
和IPAddress
, 优先使用IP地址访问, 访问不成功, - 切换为Getway, 访问成功,
- 看过参考文章后, 测试结果
- 接受访问的docker 提供的是mysql服务,
- 测试1: 将
django.settings.py
中DATABASES
中的HOST
,改为:172.17.0.2
PORT
改为:3306
, 访问成功 - 测试2: 将
django.settings.py
中DATABASES
中的HOST
,改为:172.17.0.1
PORT
改为:3333
, (此端口是中docker run -p 3333:3306 -name mysql
), 访问成功
20230823 发现新的解决方案
如果你有类似如下的 docker-compose.yml文件
version: '3'
services:
report:
build: .
image: report:202305
container_name: report
# restart: always
environment:
- TZ=Asia/Shanghai
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "1"
volumes:
# - ./src:/opt/apps/src
- ./error.log:/opt/apps/error.log
- ./info.log:/opt/apps/info.log
command: uvicorn --host 0.0.0.0 --port 8800 --workers 4 src.main:app
ports:
- 8800:8800
kitty:
build:
context: ./kitty # 在这个目录中查找 Dockerfile,用于 build 镜像
dockerfile: Dockerfile # 在context中的 Dockerfile 文件名, 若不指定此行,则默认为 Dockerfile
image: kitty:202308
container_name: kitty
restart: always
volumes:
- ./kitty/config.yml:/opt/apps/config.yml
- ./kitty/logs:/opt/apps/logs
command: ./kitty
ports:
- 9111:9111
redis:
image: redis:7.0
container_name: kitty_redis
# privileged: true
# restart: always
ports:
- 6379:6379
environment:
- TZ=Asia/Shanghai
volumes:
#- ./redis.log:/var/log/redis/redis.log:rw
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
- ./redis/data:/data
command: redis-server /usr/local/etc/redis/redis.conf
服务之间的调用关系: report 调用 kitty服务, kitty服务调用 redis 服务
问题点:
三个服务都部署在同一服务器上,那么三个容器之间的通信怎么解决?
解决方案:
- 在report服务中,调用kitty服务的地址由原来“xx.xx.xx.xx”这样 IP 地址改为字符串“kitty”(此处kitty 是指上面docker-compose.yml文件中,service中的 kitty, 当然也可以是container_name的值),比如原来的定义为:
kitty_service = 'http://127.0.0.1:9111'
可以改为kitty_service = 'http://kitty:9111
. 亲测可用。 - kitty服务调用 redis, 同样的道理不再多说。
更多推荐
已为社区贡献4条内容
所有评论(0)