0%

docker实践09:容器间通信-Networks方式

创建network

首先要使用cli创建一个network,它可以连接上多个容器,使容器可以彼此相互发现。

这个例子中,我们以创建一个backend-network开始,所有连接到后端的容器都在这个网络上。

1
docker network create backend-network

使用*-net*属性连接到网络

1
docker run -d --name=redis --net=backend-network redis

Network通信

与links的通信方式不同,docker的network的行为类似于传统的网络连接-节点可以连接或者卸下连接。

首先你会发现docker不再给容器创建环境变量,不再更新hosts文件。用下面的两个语句可以验证。

1
docker run --net=backend-network alpine env
1
docker run --net=backend-network alpine cat /etc/hosts

取而代之的是,容器间通信会通过docker内嵌的DNS服务器。这个dns服务器会被分配到各个容器,IP是127.0.0.11,配置到/etc/resolv.conf文件中。

1
docker run --net=backend-network alpine cat /etc/resolv.conf

当容器试图使用通用的名字(例如:Redis)去连接其他容器时,DNS服务器会返回对应容器的IP地址。这个例子里,Redis的全名是redis.backend-network

1
docker run --net=backend-network alpine ping -c1 redis

连接两个容器

docker支持容器同时连接多个网络。

举个例子,让我们再创建一个带有Nodejs的网络,然后与已经建立好的Redis实例通信。

首先用相同的方式建立网络

1
docker network create frontend-network

然后使用connect命令,可以把已经存在的实例连接到网络上。

1
docker network connect frontend-network redis

当我们启动这个web服务器,并且连接到网络的时候,它就可以与Redis实例通信了。

1
docker run -d -p 3000:3000 --net=frontend-network katacoda/redis-node-docker-example

创建别名

在网络模式下Links方式仍然被支持,并提供了一种方式给容器定义别名。这样会给容器一个额外的Dns入口名字和被发现的方式。When using –link the embedded DNS will guarantee that localised lookup result only on that container where the –link is used.

另一种方式是连接到网络的时候设置别名。

下面的例子就是把Redis实例连接到网络时使用别名db。

1
2
docker network create frontend-network2
docker network connect --alias db frontend-network2 redis

当容器试图使用db这个名字请求服务时,会被提供Redis容器的IP。

1
docker run --net=frontend-network2 alpine ping -c1 db

容器断线

网络建立好之后,可以使用CLI来查询详细信息。

下面的语句可以列出宿主机上所有的网络。

1
docker network ls

可以查询网络详细,来看有哪些容器连接在这个网络上,并查看IP。

1
docker network inspect frontend-network

下面的语句可以把redis容器从网络frontend-network中断开。

1
docker network disconnect frontend-network redis

欢迎关注我的其它发布渠道