【问题标题】:Network visibility within docker-composedocker-compose 中的网络可见性
【发布时间】:2020-04-14 16:13:23
【问题描述】:

我已经构建了一个包含 3 个服务的 docker-compose:dbnginxselenium。 使用 nginx 托管的应用程序与数据库通信 (nginx db),并且 selenium 测试应用程序 (selenium -> app)。

version: '3'
services:
  nginx:
    image: <my_private_repo>/nginx
    ...
  db:
    image: <my_private_repo>/db
    # nginx cannot communicate with db after I remove exposing port 3306
    ports:
      - "3306:3306"
    ...
  selenium:
    image: joyzoursky/python-chromedriver:3.8-selenium
    command: "bash seleniumScript.sh"
    depends_on:
      - nginx
      - db

我使用docker-compose run selenium 运行我的测试 当我暴露数据库端口时一切正常,但当我停止暴露端口 3306 时,nginx 无法与数据库通信。

我的理解是,一个 docker-compose 设置中的所有服务都是自动连接的,用户不需要创建任何额外的网络,但我显然错了。

我的问题是我应该如何设置服务之间的公开端口而不将它们暴露给主机?

更新: 我的 nginx 应用程序已将数据库主机配置为服务名称 db。 Selenium 脚本设置使用 db 主机填充数据库并通过 https://nginx url 测试 nginx 应用程序。

【问题讨论】:

    标签: docker-compose docker-networking


    【解决方案1】:

    This question 这里问的问题非常相似。

    nginx 容器可能无法访问数据库容器,因为您正在通过 docker host localhost 访问它。

    同一网络中的容器始终可以相互访问,而无需暴露任何端口,而是使用主机名。请参阅:the docker docs。这意味着,您可以使用 db:3306 从 nginx 容器内部连接到数据库容器。

    默认编写creates a default network for the project,因此除非您想阻止某些容器相互通信,否则您不必创建任何新网络。

    【讨论】:

    • 我的目标是不暴露任何东西。我想要 CI 测试的隔离环境,测试完成后我想摆脱容器。总而言之,所有容器都应该通过主机名dbnginxselenium 在任何端口上看到彼此?您的建议是我可能对 docker 主机 localhost 有一些未解决的依赖关系?或者如果我在db 中公开端口,它是否可以通过nginx localhost 以某种方式可见?
    • 我已经更新了答案以澄清。您理解正确:我认为您对 docker 主机存在未解决的依赖关系,并且同一网络中的所有容器都可以相互通信,但是您应该/需要为可预测的主机名设置固定的容器名称。
    • 好的,所以我需要找到这个依赖来确认。我的数据库连接应用设置使用db
    • 您确定要连接到端口 3306 上的 db 吗?
    • 好吧,我发现了问题,我的 nginx 应用程序缓存了配置更改,它正在通过 docker 主机名(不是 localhost)访问应用程序。谢谢,感谢这个答案,我清除了一些东西。
    猜你喜欢
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2020-12-28
    • 1970-01-01
    • 2018-11-13
    相关资源
    最近更新 更多