原文地址:https://docs.docker.com/engine/userguide/networking/dockernetworks/
Docker容器网络
网络提供了容器间的完全的隔离,因此控制应用运行的网络很重要。
容器网络(Docker Container networks)就提供了这种控制。
默认网络
安装Docker时,它默认会创建三种网络:bridge、none、host。
使用docker network ls
可查看主机上的这三种网络。
host:表示容器使用与主机相同的网络。
none:表示容器未选择网络接口,将在后面自己指定网络。
bridge:网桥类型,名称默认是docker0。在创建容器时,默认使用docker0网络,除非你明确指定--net=<NETWORK>
参数使用其它网络。
在Docker创建容器时,你可使用参数--net
指定使用哪个网络。
在容器中使用ifconfig
可以看到它使用的网络类型。
docker network inspect bridge
将可以查看有哪些容器使用的bridge网络。
bridge网络中的容器可以根据IP相互访问,如想通过容器名访问,只能通过创建容器时使用--link
选项来实现。
通过端口映射,容器通过访问主机端口实现容器间的间接访问。
自定义网络
Docker提供了默认网络驱动(network dirvers)用于自定义网络,更好地隔离容器。
- bridge network
- overlay network
- network plugin
- remote network
可以创建多个网络,将容器添加到一个或多个网络中。容器不可跨网络访问,它只能与其所在网络中的其它成员相互访问。
bridge只适合在单个主机中使用,而overlay是允许跨主机容器间访问的容器网络(Container Network)。
注意:自定义的网络中 linking将不可用。
bridge网络
与overlay网络相比,bridge网络相对较小,它只适合于在单个主机上的小范围网络。
# 创建网格b0
docker network create --driver bridge b0
# 或:docker network create -d bridge b0
# 查看b0的网络信息
docker network inspect b0
# 查看网络列表
docker network ls
# 创建容器时使用网桥
docker run --net=b0 -itd --name=container3 busybox
# 再次查看b0的网络信息
docker network inspect b0
默认网络dokcer0与自定义的bridge网络,虽然都属于bridge网络,但是它们还有有一定的不同:
自定义bridge网络中不支持容器之间link
overlay网络
overlay网络驱动允许构建跨主机构建的容器网络,依赖于一个有效的健值存储服务。
它由Docker的livkv项目实现,目前支持Connsul、Etcd、ZooKeeper等分布式存储服务。
在创建网络之前,必须先安装这些服务。
创建ovelay网络必须的准备条件如下
- key-value store(Engine支持Consul、Etcd和ZooKeeper等分布式存储的key-value store)
- 集群中所有主机已经连接到key-value store
- swarm集群中每个主机都配置了下面的daemon参数
- –cluster-store
- –cluster-store-opt
- –cluster-advertise
在创建overlay网络时,它将自动在集群中每台主机上创建overlay网络。
集群中运行容器时要通过--net
参数明确指定使用创建的overlay网络。
## 准备集群环境 ##
# 1. 创建服务发现主机,运行consul容器,映射主机8500端口
docker-machine create -d virtualbox keystore
eval $(docker-machine env keystore)
docker run -d -p "8500:8500" -h "consul" progrium/consul -server -bootstrap
# 2. 创建集群:指定主机发现服务地址,集群存储地址
docker-machine create -d virtualbox \
--swarm --swarm-master \
--swarm-discovery="consul://$(docker-machine ip keystore):8500" \
--engine-opt="cluster-store=consul://$(docker-machine ip keystore):8500" \
--engine-opt="cluster-advertise=eth1:2376" \
manager
docker-machine create -d virtualbox \
--swarm \
--swarm-discovery="consul://$(docker-machine ip keystore):8500" \
--engine-opt="cluster-store=consul://$(docker-machine ip keystore):8500" \
--engine-opt="cluster-advertise=eth1:2376" \
node1
# 3. 检查集群
docker-machine ls
## 创建overlay网络 ##
# 在swarm集群中任意主机上创建overlay网络,它会集群中已有主机上创建mynet网络(`--driver`可简写为`-d`)
docker network create --driver overlay --subnet=10.0.9.0/24 mynet
# 在每个主机中新容器时指定网络名称
docker run -itd --net=mynet busybox
# 集群环境中想要在单个节点上创建网络,网络名称需要带有主机名称(例如主机node0)
docker network create node0/bridge2 -b bridge
## 移除网络 ##
# 移除集群中的网络
docker network rm mynet
# 移除节点中的网络
docker network rm node0/bridge2
# 查看网络列表变化
docker network ls
# 注意:查看集群与查看单个主机的网络会有差别。
# 集群下网络名称是<node-name>/<network-name>,而主机下网络名称没有<node-name>
# 而且集群下的overlay网络名称前,无<node-name>!
一旦创建连接,overlay网络中的所有容器(不论在哪台主机上)可以相互访问。
更多内容请参考:https://docs.docker.com/swarm/networking/
自定义网络插件(自定义网络驱动)
自定义网络驱动就是一样像Docker daemon一样运行主机上的进程,使用plugin API,所有插件都遵循相同的约束和安装规则。
一旦安装自定义网络驱动,可以像内置驱动一样使用。
# 以使用weave为例
docker network create --driver weave mynet
更多内容请参考:https://docs.docker.com/engine/extend/plugins_network/
Docker的内嵌DNS服务器
请参考:https://docs.docker.com/engine/userguide/networking/configure-dns/