每当我们在 Docker 中暴露一个容器的端口时,它都会创建一条从该主机外部穿过网络层进入该容器的网络路径。这样,其他容器就可以连接到该容器,方法是先从主机出去,然后绕回来,再沿着这条路径返回。Docker
提供了丰富的网络选项,可以精确控制容器之间的连接方式,并确保其安全性和符合您的预期。
在深入研究本文之前,我们建议您了解Docker和计算机网络的基础知识,以便更清楚地了解幕后到底发生什么。
容器的通信
尽管容器彼此隔离,但它们之间仍然经常需要交互,甚至与外界进行交互。这种交互可以通过容器间的网络连接来实现。本质上,这意味着一个容器中的应用程序将通过另一个容器中的端口建立网络连接。在本文中,我们将学习连接容器并使其相互通信的基础知识。我们将在两个不同的容器上运行 Ubuntu,定义端口号,并让它们通过网络进行通信。
打开终端。
让我们首先看一下现有的网络,看看默认有什么。
docker network ls
我们可以看到默认存在3个网络:
-
Bridge是容器使用的网络,容器不会指定优先接入其他网络。这意味着桥接网络为同一主机上的容器之间提供了非常基本的通信。
-
Host是指你不希望容器有任何网络隔离的情况。这意味着该网络可能存在安全隐患。
-
None是指您的容器无法联网。
使用以下命令创建您自己的网络:
docker network create learn-networking
这样,我们就创建了一个名为learn-networking的网络。您可以随意给它命名。现在,我们将通过这个网络连接我们的容器。
并排打开两个终端。在其中一个终端中输入以下命令,通过网络learn-networking创建一个名为conatiner1的新容器。
docker run --rm -ti --net learn-networking --name container1 ubuntu:14.04 bash
这里:
-
–rm命令用于在停止容器后立即删除容器。
-
-ti代表终端交互。
-
–net用于设置容器的网络。
-
–name用于指定容器的名称。这里的容器名称是container1。
现在在另一个终端上通过同一网络learn-networking创建一个名为container2的新容器。
docker run –rm -ti –net learn-networking –name container2 ubuntu:14.04 bash
现在我们有两个正在运行的容器,container1 和 container2。
另外,如果您打开 Docker Desktop 并转到容器部分,您将看到我们刚刚创建的两个容器正在运行。
现在,我们将指定_container2_监听的端口号。因此,在_container2_运行的终端中,输入以下命令:
nc -lp 1234
此命令表示netcat listen port 1234
。您可以在此处指定任何端口号。
container1 运行的终端上,通过端口1234将其连接到container2,输入以下命令
nc container2 1234
此后,两个容器通过网络learn-networking上的端口号 1234 连接。
在终端 1 上输入任何内容,它将被传输到终端 2。这意味着两个容器之间通过网络共享数据已经开始。
注意:为了共享数据并让容器相互通信,它们必须位于同一个网络上。