问题描述:

  1. 同一个华为云宿主机上, 两个docker容器,分别是django和mysql, django通过公网IP访问mysql,运行正常.
  2. 电脑本地 django容器 使用 内部IP 访问 本地服务器上 的docker mysql容器, 运行正常.
  3. 本地服务器 虚拟机上,django使用内部IP访问mysql,不成功,报错如图.
    在这里插入图片描述

解决过程:

感谢这位大神, 重点参考文章

  1. 首先,django 容器在华为云是完全可以跑起来的, 说明代码没有问题
  2. 其次, mysql 数据正常
  3. 使用命令 docker inspect mysql 检查 mysql
    在这里插入图片描述
  • 从图中可以看到GetwayIPAddress, 优先使用IP地址访问, 访问不成功,
  • 切换为Getway, 访问成功,
  1. 看过参考文章后, 测试结果
  • 接受访问的docker 提供的是mysql服务,
  • 测试1: 将django.settings.pyDATABASES中的 HOST,改为:172.17.0.2 PORT改为: 3306, 访问成功
  • 测试2: 将django.settings.pyDATABASES中的 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, 同样的道理不再多说。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐