创建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 | docker network create frontend-network2 |
当容器试图使用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 |