簡體   English   中英

從另一個Docker連接Docker端口和IP

[英]Connecting docker port and ip from another docker

我有一個正在運行的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

我有另一個泊塢窗,其中有一個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,如何將其連接到另一個dockers ip和端口?

我是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命令,此端口已打開。 無需在服務器的本地主機上映射端口5432。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM