【问题标题】:Connecting docker port and ip from another docker从另一个 docker 连接 docker 端口和 ip
【发布时间】:2018-08-24 03:08:13
【问题描述】:

我有一个正在运行的 docker,它用于运行如下的 postgres。

$ sudo docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
505ab3ffc4b1        postgres            "docker-entrypoint..."   26 minutes ago      Up 26 minutes       0.0.0.0:5432->5432/tcp   posttest

我有另一个 docker,其中一个 python 文件正在运行并尝试连接到连接到 localhost:5432 的 postgres,但由于以下错误而失败:

$sudo docker run test
could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?

在我的测试 Dockerfile 中,它连接到 localhost:5432,我怎样才能将它连接到另一个 docker ip 和端口?

我是docker新手,请帮忙

【问题讨论】:

  • 您能否也发布您的 Dockerfile 以便我们进行调查?
  • - 你应该被阅读 docs.docker.com/network/network-tutorial-standalone/… - 尝试改变你的 IP v4
  • 我的 docker 文件没有很多东西 (docker test) COPY 。 /app WORKDIR /app RUN ls RUN pip3 install -r /app/requirements.txt CMD python3 /app/parser.py 这里parser.py访问的是localhost:5432,应该是其他docker 5432
  • 我没有太多网络知识。目前我所有的应用程序都在本地运行,我想做的是在新容器中访问另一个容器中的数据库。
  • 如果您为两个容器都提供 Dockerfile,那将非常有用。如果您不想共享敏感信息,可以更改一些变量值。

标签: python docker dockerfile


【解决方案1】:

让容器在一台机器(非集群)上相互交互的推荐方法是使用用户定义的桥接网络。 在这里您可以阅读有关possible network drivers 的信息。在这里您可以了解difference of the default bridge network and the user defined bridge network

所以创建您的用户定义的 docker 桥接网络。

$ docker network create my-bridge-net

我们将在这个网络中部署我们的 2 个容器(python 和 DB)。 首先部署 postgres 容器。我不需要在 localhost 上映射端口(= 我不需要让容器从我的服务器外部可用)

$ docker run -d --net my-bridge-net --name my-postgres -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password postgres
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
96acfe130efa        postgres            "docker-entrypoint.s…"   2 seconds ago       Up 1 second         5432/tcp            my-postgres

postgres 容器正在运行。我只检查容器的 IP:

$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-postgres
172.20.0.2

现在你的 python 容器需要在同一个网络中运行:

$ docker run -d --net my-bridge-net ... image

此容器可以使用容器名称+端口与 postgres 容器通信。 (不是 localhost,因为 localhost 将指向容器内的 localhost 而不是您服务器的 localhost)。

我将在这个例子中用一个基本的ubuntu 容器替换你的python 应用程序。

$ docker run -d --net my-bridge-net -it ubuntu /bin/bash
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
5610fe02d847        ubuntu              "/bin/bash"              22 seconds ago      Up 21 seconds                           thirsty_neumann
96acfe130efa        postgres            "docker-entrypoint.s…"   7 minutes ago       Up 7 minutes        5432/tcp            my-postgres

现在我有 2 个容器在同一个用户定义的桥接网络中运行。 我要去 ubuntu 容器内的exec 证明我可以访问 my-postgres 容器。

我将进入 ubuntu 容器并安装 curl 和网络工具以证明我可以访问 my-postgres 容器。

$ docker exec -it 5610fe02d847 /bin/bash
root@5610fe02d847:/# apt-get update
root@5610fe02d847:/# apt-get install iputils-ping
root@5610fe02d847:/# apt-get install curl
root@5610fe02d847:/# ping my-postgres
PING my-postgres (172.20.0.2) 56(84) bytes of data.
64 bytes from my-postgres.my-bridge-net (172.20.0.2): icmp_seq=1 ttl=64 time=0.102 ms
64 bytes from my-postgres.my-bridge-net (172.20.0.2): icmp_seq=2 ttl=64 time=0.115 ms
64 bytes from my-postgres.my-bridge-net (172.20.0.2): icmp_seq=3 ttl=64 time=0.122 ms
root@5610fe02d847:/# curl my-postgres:80
curl: (7) Failed to connect to my-postgres port 80: Connection refused
root@5610fe02d847:/# curl my-postgres:5432
curl: (52) Empty reply from server

如您所见,我可以 ping 通 postgres 的容器(您将在输出中看到与我们的 postgres 容器的 IP 相同的 IP)。我也可以卷曲容器,但端口 80 被拒绝。对于我们的 postgres 容器,容器端口 80 已关闭。我们可以在 postgres 容器的 5432 端口上 curl。这个端口是开放的。由于 postgres 的 Dockerfile 中的 EXPOSE 5432 命令,此端口已打开。无需在我们服务器的 localhost 上映射端口 5432。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    相关资源
    最近更新 更多