容器的网络,大的方向,分为两大类:
A.单台宿主下,容器网络环境的构建
B.多台宿主组成的宿主集群的网络环境
单宿主模式下:
Docker提供了,3种默认的网络模式,分别是none,bridge,host
查看本机上拥有的网络模式:
docker image ls
docker默认这3种网络模式,如果需要将docker容器使用某种网络模式启动,指定
--network={networkname}
eg:
docker run -dit --name 'test_network_restart' --network=bridge centos /bin/bash
bridge 网络的代表就是docker0网桥的出现(一般伴随着docker的安装),如果不特殊指定, 启动的容器默认连接到bridge网络。
none network 会将容器置于一个特定的网络栈中,该容器缺乏网络接口,如果,exec,或者attach,接入到容器中, ifconfig只能看到lo(回环网络接口)
host network,将会把容器增加到主机的网络栈中,在容器中,ifconfig,看到的,完全与宿主的网络栈相同
默认bridge网络的详细信息:
docker network inspect bridge
[ {
"Name"
:
"bridge"
,
"Id"
:
"f7ab26d71dbd6f557852c7156ae0574bbf62c42f539b50c8ebde0f728a253b6f"
,
"Scope"
:
"local"
,
"Driver"
:
"bridge"
,
"IPAM"
:
{
"Driver"
:
"default"
,
"Config"
:
[ {
"Subnet"
:
"172.17.0.1/16"
,
"Gateway"
:
"172.17.0.1"
} ] },
"Containers"
:
{},
"Options"
:
{
"com.docker.network.bridge.default_bridge"
:
"true"
,
"com.docker.network.bridge.enable_icc"
:
"true"
,
"com.docker.network.bridge.enable_ip_masquerade"
:
"true"
,
"com.docker.network.bridge.host_binding_ipv4"
:
"0.0.0.0"
,
"com.docker.network.bridge.name"
:
"docker0"
,
"com.docker.network.driver.mtu"
:
"9001"
} }]
Docker引擎会在该网络下创建子网,网关。如果在该网络下添加容器,将会在Containers中增加容 器的网卡信息
容器在默认的网络(bridge)下可以通过Ip进行互相之间的交互,Docker在默认的bridge网络下不支持服务的自发现,如果需要在默认的bridge网络下互相交互,必须使用docker run --link来连接不同的容器
默认的docker0 bridge网络支持使用端口映射,以及docker run ---link 来连接在docker0网络下的容器,这些技术,通常比较笨重并且容易出错。有一种更好的方法,就是创建自己的bridge网络。
用户自定义网络:
用户可以使用自己定义的二层网络来对容器之间进行隔离。Docker提供了几种默认的网络驱动(Network drivers)来创建这些网络。用户可以创建bridge网络,overlay网络,或者是MACVLAN 网络。用户甚至可以创建自己的网络插件或者远程网络。
用户可以将容器置于不同的网络下。容器只能与同网络下的容器之间进行交互,而不能跨网络。如果一个容器,接入了两个网络,那么这个容器可以与这两个网络中的容器进行交互。
bridge网络:
创建一个bridge网络非常简单,这个网络非常类似之前的docker0网络,这里是一些新增的功能和一些之前网络不能用的功能。
docker network create --driver bridge isolated_nw
docker network inspect isolated_nw
[ {
"Name"
:
"isolated_nw"
,
"Id"
:
"1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b"
,
"Scope"
:
"local"
,
"Driver"
:
"bridge"
,
"IPAM"
: {
"Driver"
:
"default"
,
"Config"
: [ {
"Subnet"
:
"172.21.0.0/16"
,
"Gateway"
:
"172.21.0.1/16"
} ] },
"Containers"
: {},
"Options"
: {} }]
对比可以发现isolated_nw与默认的Docker0网络的Options是完全不同的,因此isolated_nw与docker0网络支持的特性完全不同。
如果将容器连接到isolate_nw下,该容器将与该网络下的所有其他容器可以通过Ip进行交互,但是与其他网络是完全隔绝的。在用户自建的bridge模式网络下是不支持的link,用户可以发布容器的端口到该网络下。