【问题标题】:Test the connection between docker containers within docker-composed environment在 docker-compose 环境中测试 docker 容器之间的连接
【发布时间】:2020-02-09 05:24:31
【问题描述】:

我们正在使用 docker-compose 为我们的应用设置服务:

version: "3"
services:
  db:
    container_name: db
    image: postgres:11.1
    environment:
      POSTGRES_USER: xxx
      POSTGRES_PASSWORD: xxx
      POSTGRES_DB: xxx
      PGPASSWORD: xxx
    volumes:
      - pgdata:/var/lib/postgresql/data
      - ./data/dbdump:/dbdump
    networks:
      - zenet
    ports:
      - "5432:5432"

  # The React web application
  web:
    container_name: web
    build:
      context: .
      dockerfile: devenv/web/Dockerfile
    volumes:
      - ./src/client-app:/usr/local/abc
      - /usr/local/abc/node_modules
    networks:
      - zenet
    ports:
      - "3000:3000"
    command: npm run startindocker

  # The Django Rest Framework API
  api:
    container_name: api
    build:
      context: .
      dockerfile: devenv/api/Dockerfile
    environment:
      DJANGO_SETTINGS_MODULE: abc.settings.dev
      PYTHONSTARTUP: /root/pythonstartup.sh
      PYTHONIOENCODING: UTF-8
    volumes:
      - .:/usr/local/borrow-a-boat
      - ./devenv/api/pythonrc.py:/root/pythonstartup.sh
    networks:
      - zenet
    depends_on:
      - "db"
    ports:
      - "9000:9000"
    command:
      python3 /usr/local/borrow-a-boat/src/django/abc/manage.py runserver 0.0.0.0:9000
    tty: true

volumes:
  pgdata:
  customboatdata:

networks:
  zenet:

(敏感信息已被替换)

我的同事的设置运行良好。我设置了应用程序,卷和容器已启动并运行。我可以通过浏览器在端口 9000 处点击服务api 并确认数据库已填充。但是,我的web 服务无法从 api 获取数据。 我如何才能确认上述断言是正确的,并且网络确实无法与 api 服务通信。

我该如何解决这个问题并让网络从 api 接收数据。为新手问题道歉。

编辑:

当我使用docker exec -it [containerID] /bin/shweb 容器内运行ping api 时,我收到以下形式的响应:

64 bytes from 172.18.0.4: seq=139 ttl=64 time=0.084 ms

所以,很明显,我的断言是不正确的。为什么web 服务无法得到api 服务的响应。当我在浏览器中加载web 应用程序时,在被命中的 api 的终端中没有任何日志显示。

EDIT-2:

根据@runwuf 问题和我的回答,显然,“网络”能够与“api”服务进行通信。所以,还有其他问题。以下是我们在系统上设置堆栈的步骤。我使用 Linux Mint 19.2 操作系统,而团队使用 Mac。命令是:

  • docker kill $(docker_container_names)
  • docker rm -v $(docker_container_names)
  • docker 卷 rm abc_pgdata
  • docker image rm abc_api
  • docker image rm abc_web
  • docker-compose 构建
  • docker-compose up -d db api web
  • ssh abc@abc.com 'pg_dump abc |压缩包' |枪弹 | docker-compose run --rm db psql --host db --username abc
  • docker-compose run --rm db psql --host db --username abc -c "update core_photo set image_base = 'sample.jpg'"
  • docker-compose run --rm db psql --host db --username abc -c "update core_experienceimage set image_base = 'sample.jpg'"

【问题讨论】:

  • 什么实体应该调用 API 服务? (服务到服务调用?浏览器应用程序?)您执行该调用的机械性如何?
  • 抱歉跳过基本介绍。 'web' 服务是一个 React Web 应用程序,api 服务是一个 Django Rest Framework 容器服务,db 是 postgres。假设 Web 应用程序在最初加载应用程序后获取一些数据以显示。
  • @Kayote 当您从网络容器telnet api 9000curl http://api:9000 得到什么响应?
  • @runwuf 我得到一个看似 json 的响应,其中关键字和 api 地址作为值。我认识这个api。谢谢
  • 这不是 CORS 问题吗?

标签: docker docker-compose port


【解决方案1】:

最后,这是 web 服务中无法访问 env 变量的情况。只需在浏览器中读取显示undefined 变量的控制台日志。

对我来说,在解决问题时,无论技术多么新,都不要忘记使用您熟悉的工具。

【讨论】:

  • 很高兴您发现并解决了问题! @Kayote
最近更新 更多