从另一个Docker连接Docker端口和IP

时间:2018-08-23 14:17:04

标签: python docker dockerfile

我有一个正在运行的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文件正在运行并尝试连接到postgres,后者正在连接到localhost:5432,但由于以下错误而失败:

$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,如何将其连接到另一个dockers ip和端口?

我是Docker的新手,请帮助

1 个答案:

答案 0 :(得分: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卷曲。该端口是开放的。由于postgres的Dockerfile中的EXPOSE 5432命令,此端口已打开。无需在我们服务器的localhost上映射端口5432。