Docker Network 容器间的通讯

容器间的通讯方式

一个分布式应用,多个容器之间每每须要通讯,好比 HTTP 服务容器每每须要与数据库容器进行通讯。容器的通讯方式有如下几种:docker

  • 经过 docker run 起一个容器时带上 --link 参数指定该容器与其余容器进行相关联 (即将废弃,原理就不描述了)
  • 经过 docker network 系统来创建通讯
  • docker-compose

Docker Network

网络驱动模式

Docker Network 有多种驱动模式,默认为 bridge,即桥接模式。bridge network 原理是新建 network 时创建一个网桥(网关),全部加入此 network 的容器须要彼此通讯时经过该网桥进行转发。每个 bridge network(包含网关及其下的容器)都有一个独立的 IP 网段,不一样网段间的容器没法通讯,这也就是指定 bridge network 进行容器间网络隔离的原理。数据库

默认 Network

$ docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
9c9d4fd4f950        bridge              bridge              local
3ce82c0caf70        host                host                local
f1a111712ad4        none                null                local

Docker 内置了一个默认 bridge network(名为 bridge,第一行),全部未指定 network 的容器,默认链接到此 network 中,其网段为 172.17.0.X。因此,两个未进行任何链接操做的容器是能够经过 IP 地址互相通讯的,由于他们同在一个 network 下,但通信只能经过 IP 地址进行(好比 ping 172.17.0.5),不能够经过容器名通讯(好比 ping container-name)。但自定义建立的网络能够经过容器名进行通讯。网络

Screen Shot 2019-10-31 at 11.13.33 PM.png

图中 docker0 即为默认 bridge 网络的网桥,它负责连通全部未指定 network 的容器,而且连通外网。分布式

自定义网络

$ docker network create NAME
  • 不指定 -d 参数,默认建立 bridge 驱动模式的 network。
  • 自定义的 bridge network 会有本身专属的一个网段,与其余 network 隔离。
  • 能够经过 docker network connect 指令将容器链接到一个 network,也能够在起容器(docker run 指令)时加入 --network 参数指定即将建立的容器加入到哪一个 network,还能够经过 docker network disconnect 命令将容器移出自定义的 network。
  • 加入到同一个自定义 bridge network 的容器间能够经过容器名(充当 hostname)进行通讯,会自动进行 DNS 解析,但前提是须要给容器指定名称,随机分配的容器名没法被解析。也能够经过 IP 进行通讯,由于属于同一个网段。
  • 同一个容器能够同时加入到多个 network 下,此时该容器拥有多个虚拟网卡(能够经过 ifconfig 查看)。

参考

相关文章
相关标签/搜索