原文地址:https://docs.docker.com/engine/userguide/networking/work-with-networks/
docker network命令
Docker network所有子命令如下:
- docker network create
- docker network connect
- docker network ls
- docker network rm
- docker network disconnect
- docker network inspect
创建网络
在安装docker Engine时会自动创建一个默认的bridge网络docker0
。
此外,还可以创建自己的bridge
网络或overlay
网络。
bridge
网络依附于运行Docker Engine的单台主机上,而overlay
网络能够覆盖运行各自Docker Engine的多主机环境中。
创建bridge
网络比较简单如下:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
但是创建一个overlay
网络就需要一些前提条件(具体操作请参考Docker容器网络
相关内容):
- key-value store(Engine支持Consul、Etcd和ZooKeeper等分布式存储的key-value store)
- 集群中所有主机已经连接到key-value store
- swarm集群中每个主机都配置了下面的daemon参数
- –cluster-store
- –cluster-store-opt
- –cluster-advertise
然后创建overlay
网络:
- 1
- 2
- 1
- 2
就使用--subnet
选项创建子网而言,bridge
网络只能指定一个子网,而overlay
网络支持多个子网。
在bridge和overlay网络驱动下创建的网络可以指定不同的参数,具体请参考:https://docs.docker.com/engine/userguide/networking/work-with-networks/
连接容器
创建三个容器,分别前两个使用默认网络启动容器,第三个使用自定义bridge网络启动。
然后再将第二个容器添加到自定义网络。这三个容器的网络情况如下
- 第一个容器:只有默认的docker0
- 第二个容器:属于两个网络——docker0、自定义网络
- 第三个容器:只属于自定义网络
说明:通过容器启动指定的网络会覆盖默认bridge网络docker0。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
默认网络与自定义bridge网络的差异
默认网络docker0:网络中所有主机间只能用IP相互访问。通过--link
选项创建的容器可以对链接的容器名(Container-name)作为hostname进行直接访问。
自定义网络(bridge):网络中所有主机除ip访问外,还可以直接用容器名(container-name)作为hostname相互访问。
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
默认网络与自定义bridge网络在容器连接的差别
在默认网络中使用link(legency link),有如下功能:
- 使用容器名作为hostname
- link容器时指定alias: --link=<Container-Name>:<Alias>
- 配合--icc=false
隔离性,实现容器间的安全连接
- 环境变量注入
自定义网络中使用docker net提供如下功能:
- 使用DNS实现自动化的名称解析
- 一个网络提供容器的安全隔离环境
- 动态地attach与detach到多个网络
- 支持与--link
选项一起使用,为链接的容器提供别名(可以是尚不存在链接容器,与默认容器中–link使用的最大差别)
默认网络中的link是静态的,不允许链接容器重启,而自定义网络下的link是动态的,支持链接容器重启(以及IP变化)
因此,使用--link
时链接的容器,在默认网络中必须提前创建好,而自定义网络下不必预先建好。
使用docker network connetct
将容器连接到新网络中时,用参数--link
链接相同的容器时,可以指定不同的别名,它们是针对不同网络的。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
指定容器在网络范围的别名(Network-scoped alias)
Network-scoped alias就是指定容器在可被同一网络范围内的其他容器访问的别名。
不同于link别名的是,link别名是由链接容器的使用者提供的,只有它自己可使用;
而指定网络范围内别名,是由容器提供给网络中其它容器使用的。
Network-scoped alias:同一网络中的多个容器可以指定相同的别名,在使用的当然只有第一个指定别名的容器才生效,
只有当第一个容器关闭时,指定相同别名的第二个容器的别名才会开始生效。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
断开网络与移除网络
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
在多主机的网络环境中,在将容器用已移除的容器名称连接到网络中时会出现container already connected to network
的错误,
这时需要将新容器强制移除docker rm -f
,重新运行并连接到网络中。
移除网络要求网络中所有的容器关闭或断开与此网络的连接时,才能够使用移除命令: