我有一个正在运行的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的新手,请帮助
答案 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。