Docker容器无法使用Docker网络连接到另一个

特劳布兹

我使用docker-compose来设置带有一些数据库和播种器的API。直到几天前,一切都像魅力一样运作,但是现在我再也无法播种数据库了。
这是我的docker-compose.yml文件的示例

version: '3'

services:
    api:
      image: <API image>
      ports: {API_PORT}:5000 //Flask's default port
      depends_on:
        - db

    db:
      image: <DB image>
      ports: {DB_PORT}:27017 //MongoDB Default port

    db-seed:
      image: <seeder image>

// pretty classic docker-compose file, nothing fancy

播种者使用docker网络访问API容器(http:// api:80 /)并对其进行播种。但是,绑定到API容器时,播种者的脚本(用Python编写)现在返回错误:

$> docker-compose up db-seed
<LOT OF ERRORS>...
requests.exceptions.ConnectionError: HTTPConnectionPool(host='api', port=80): Max retries exceeded with url: /ping (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f65e78a4310>: Failed to establish a new connection: [Errno 111] Connection refused'))

似乎种子容器无法访问数据库容器。造成此错误的原因是什么?我该如何解决?

是我的网络docker网络检查

[{                                                                                                                                                                                                                            "Name": "staging-sensei-api_default",                                                                                                                                                                                    "Id": "b5bd162d27f9a1addaacf1b0f2c09ad799d3ae195cc6e8c9cbb54bfffc27651c",                                                                                                                                                "Created": "2019-07-22T14:18:05.080114521Z",                                                                                                                                                                             "Scope": "local",                                                                                                                                                                                                        "Driver": "bridge",                                                                                                                                                                                                      "EnableIPv6": false,                                                                                                                                                                                                     "IPAM": {                                                                                                                                                                                                                    "Driver": "default",                                                                                                                                                                                                     "Options": null,                                                                                                                                                                                                         "Config": [                                                                                                                                                                                                                  {                                                                                                                                                                                                                            "Subnet": "172.26.0.0/16",                                                                                                                                                                                               "Gateway": "172.26.0.1"                                                                                                                                                                                              }                                                                                                                                                                                                                    ]                                                                                                                                                                                                                    },                                                                                                                                                                                                                       "Internal": false,                                                                                                                                                                                                       "Attachable": true,                                                                                                                                                                                                      "Ingress": false,                                                                                                                                                                                                        "ConfigFrom": {                                                                                                                                                                                                              "Network": ""                                                                                                                                                                                                        },                                                                                                                                                                                                                       "ConfigOnly": false,                                                                                                                                                                                                     "Containers": {                                                                                                                                                                                                              "08672fe92d72b111f1a006a2ff20e885ef395a420525953b696672753cb73ff7": {
                "Name": "com.frcyber.sensei.elasticsearch",
                "EndpointID": "7ba9a1af1af5635d22c9cbd38fad8be222f351e5c0013f0280e2879cdd6e9e40",
                "MacAddress": "02:42:ac:1a:00:03",
                "IPv4Address": "172.26.0.3/16",
                "IPv6Address": ""
            },
            "364f873d069e4ecd371cdd99ca952d1469ee875aacbf9ee2227bbf25ab65d841": {
                "Name": "com.frcyber.sensei.api",
                "EndpointID": "e5a3f4cd2099aff2a04efdeb7a5c5d0a8ade4248b76df048f20a8a75bf85ddba",
                "MacAddress": "02:42:ac:1a:00:04",
                "IPv4Address": "172.26.0.4/16",
                "IPv6Address": ""
            },
            "f4bfaf323a8c8c6300156d3091ec70f091fc3492175bfa00faa1717e4f83d2a2": {
                "Name": "com.frcyber.sensei.mongodb",
                "EndpointID": "b5df4e0d3721ffe5cd28ce55f642e6a0bc7f5be1a12cc49bb2eb12a58eb82e7a",
                "MacAddress": "02:42:ac:1a:00:02",
                "IPv4Address": "172.26.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "default",
            "com.docker.compose.project": "staging-sensei-api",
            "com.docker.compose.version": "1.24.0"
        }
    }
]

另外,我发现当API_PORT设置为5000时,它可以工作

api:
  ports: 5000:5000
法国胡须

考虑到它在特定情况下有效,即:

另外,我发现当API_PORT设置为5000时,它可以工作

api:
  ports: 5000:5000

我建议问题不在于docker方面,而在于您如何设置项目。这个建议是基于我的一个假设:您的db-seeder容器使用in值API_PORT作为连接到api容器的端口(在您的帖子中没有明确定义,我假设在以下内容中会用到)。

由于您的python错误显示"api"为主机,因此您尝试连接到DNS,根据您的docker network inspect输出,DNS等效于IP 172.26.0.4 在此IP上,无论端口API_PORT的值如何,容器都在侦听端口5000 (根据docker-compose的定义,因为您始终将主机的API_PORT端口绑定到容器的5000)。

奇怪的是,您曾说过它曾经起作用过,但事实并非如此,除非您的数字API_PORT是5000。

如果要在另一个端口的docker网络内部进行连接,则需要在构建或运行时更改容器中的某些内容,而不仅是绑定到主机的端口。

补充:“可配置性”示例

从你的 docker-compose

version: '3'

services:
    api:
      image: <API image>
      ports: "80:${API_PORT:-5000}" //Flask's default port
      depends_on:
        - db
      environment:
        - DB_PORT=${DB_PORT:-27017}
        - API_PORT=${API_PORT:-5000}

    db:
      image: mongo:latest
      command: --port ${DB_PORT:-27017}

    db-seed:
      image: <seeder image>
      environment:
        - API_PORT=${API_PORT:5000}

这不会将您的数据库端口暴露给主机的外部。您需要从外壳环境(或.env文件)中检索API_PORT和DB_PORT值,并按以下方式使用它们:

  • 使用连接到api http(s)://api:$API_PORT
  • 使用连接到mongo db:$DB_PORT
  • uwsgi使用API​​_PORT启动生产中用于api的cgi服务器(例如),例如在api容器ENTRYPOINT脚本的末尾
# Some other config / checks / setup at runtime
exec uwsgi --port "$API_PORT" [ OTHER_OPTIONS ... ] path/to/your/application.py

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法从另一个网络连接到 Ubuntu LTS

来自分类Dev

将使用docker-compose创建的容器连接到使用docker run创建的另一个容器

来自分类Dev

使用Docker compose连接到另一个容器

来自分类Dev

将本地有线网络连接到另一个网络

来自分类Dev

从另一个容器连接到在Docker容器中运行的无头nREPL

来自分类Dev

从本地另一个容器中连接到Docker化的REST JaxRS端点

来自分类Dev

从Docker中的另一个容器连接到Redis

来自分类Dev

将一个 docker 容器中的 nodejs 应用程序连接到 Docker Swarm 上另一个容器中的 mongodb

来自分类Dev

如何在一个网络连接上优先于另一个网络连接?

来自分类Dev

如何使用Docker远程API使用另一个容器的网络名称空间创建容器

来自分类Dev

在另一个内部使用 docker 容器的数据

来自分类Dev

无法从另一个容器连接到Postgres容器

来自分类Dev

使用--net = container:containerName键将Docker容器附加到另一个容器的网络

来自分类Dev

无法连接到Docker容器内的网络

来自分类Dev

使用相同名称从另一个容器或主机连接到容器

来自分类Dev

2个Docker容器之间的网络连接(JBOSS / DATABASE)

来自分类常见问题

从另一个容器访问Docker容器

来自分类Dev

管理来自另一个容器的容器docker

来自分类Dev

从另一个容器访问的Docker容器端口

来自分类Dev

在另一个容器的构建过程中无法解析Docker容器

来自分类Dev

Docker swarm 容器无法解析另一个节点中的容器地址

来自分类Dev

检测到网络连接时启动另一个活动

来自分类Dev

将Docker容器中的QGIS项目与另一个Docker容器中的Postgres + Postgis连接

来自分类Dev

jenkins中的另一个云插件未使用ec2实例连接到tcp:// docker:2376

来自分类Dev

在另一个Docker容器中运行一个Docker容器?

来自分类Dev

在另一个Docker容器中运行一个Docker容器?

来自分类Dev

无论如何,我在那里可以在一个Docker容器中构建网络并将其部署在另一个Docker容器中?

来自分类Dev

如果删除一个网络连接,我的UNIX主机不应该只使用另一个吗?

来自分类Dev

Docker compose 删除另一个容器

Related 相关文章

  1. 1

    无法从另一个网络连接到 Ubuntu LTS

  2. 2

    将使用docker-compose创建的容器连接到使用docker run创建的另一个容器

  3. 3

    使用Docker compose连接到另一个容器

  4. 4

    将本地有线网络连接到另一个网络

  5. 5

    从另一个容器连接到在Docker容器中运行的无头nREPL

  6. 6

    从本地另一个容器中连接到Docker化的REST JaxRS端点

  7. 7

    从Docker中的另一个容器连接到Redis

  8. 8

    将一个 docker 容器中的 nodejs 应用程序连接到 Docker Swarm 上另一个容器中的 mongodb

  9. 9

    如何在一个网络连接上优先于另一个网络连接?

  10. 10

    如何使用Docker远程API使用另一个容器的网络名称空间创建容器

  11. 11

    在另一个内部使用 docker 容器的数据

  12. 12

    无法从另一个容器连接到Postgres容器

  13. 13

    使用--net = container:containerName键将Docker容器附加到另一个容器的网络

  14. 14

    无法连接到Docker容器内的网络

  15. 15

    使用相同名称从另一个容器或主机连接到容器

  16. 16

    2个Docker容器之间的网络连接(JBOSS / DATABASE)

  17. 17

    从另一个容器访问Docker容器

  18. 18

    管理来自另一个容器的容器docker

  19. 19

    从另一个容器访问的Docker容器端口

  20. 20

    在另一个容器的构建过程中无法解析Docker容器

  21. 21

    Docker swarm 容器无法解析另一个节点中的容器地址

  22. 22

    检测到网络连接时启动另一个活动

  23. 23

    将Docker容器中的QGIS项目与另一个Docker容器中的Postgres + Postgis连接

  24. 24

    jenkins中的另一个云插件未使用ec2实例连接到tcp:// docker:2376

  25. 25

    在另一个Docker容器中运行一个Docker容器?

  26. 26

    在另一个Docker容器中运行一个Docker容器?

  27. 27

    无论如何,我在那里可以在一个Docker容器中构建网络并将其部署在另一个Docker容器中?

  28. 28

    如果删除一个网络连接,我的UNIX主机不应该只使用另一个吗?

  29. 29

    Docker compose 删除另一个容器

热门标签

归档